cloud-mu 1.9.0.pre.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. checksums.yaml +7 -0
  2. data/Berksfile +56 -0
  3. data/Berksfile.lock +250 -0
  4. data/Jenkinsfile +184 -0
  5. data/LICENSE.md +37 -0
  6. data/README.md +26 -0
  7. data/bin/mu-aws-setup +376 -0
  8. data/bin/mu-cleanup +68 -0
  9. data/bin/mu-configure +1133 -0
  10. data/bin/mu-deploy +166 -0
  11. data/bin/mu-firewall-allow-clients +30 -0
  12. data/bin/mu-gcp-setup +200 -0
  13. data/bin/mu-gen-docs +34 -0
  14. data/bin/mu-gen-env +42 -0
  15. data/bin/mu-load-config.rb +158 -0
  16. data/bin/mu-node-manage +683 -0
  17. data/bin/mu-self-update +228 -0
  18. data/bin/mu-ssh +23 -0
  19. data/bin/mu-tunnel-nagios +144 -0
  20. data/bin/mu-upload-chef-artifacts +757 -0
  21. data/bin/mu-user-manage +275 -0
  22. data/cookbooks/awscli/LICENSE +37 -0
  23. data/cookbooks/awscli/README.md +58 -0
  24. data/cookbooks/awscli/attributes/default.rb +1 -0
  25. data/cookbooks/awscli/libraries/instance_metadata.rb +21 -0
  26. data/cookbooks/awscli/metadata.rb +20 -0
  27. data/cookbooks/awscli/recipes/default.rb +56 -0
  28. data/cookbooks/awscli/templates/default/config.erb +18 -0
  29. data/cookbooks/mu-activedirectory/CHANGELOG.md +13 -0
  30. data/cookbooks/mu-activedirectory/LICENSE +37 -0
  31. data/cookbooks/mu-activedirectory/README.md +6 -0
  32. data/cookbooks/mu-activedirectory/attributes/default.rb +98 -0
  33. data/cookbooks/mu-activedirectory/files/default/password-auth +32 -0
  34. data/cookbooks/mu-activedirectory/files/default/sshd_pol.pp +0 -0
  35. data/cookbooks/mu-activedirectory/files/default/sshd_pol.te +32 -0
  36. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.pp +0 -0
  37. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.te +10 -0
  38. data/cookbooks/mu-activedirectory/files/default/system-auth +34 -0
  39. data/cookbooks/mu-activedirectory/files/default/winbindpol.pp +0 -0
  40. data/cookbooks/mu-activedirectory/files/default/winbindpol.te +37 -0
  41. data/cookbooks/mu-activedirectory/libraries/config.rb +106 -0
  42. data/cookbooks/mu-activedirectory/libraries/helper.rb +86 -0
  43. data/cookbooks/mu-activedirectory/metadata.rb +17 -0
  44. data/cookbooks/mu-activedirectory/providers/domain.rb +152 -0
  45. data/cookbooks/mu-activedirectory/providers/domain_controller.rb +89 -0
  46. data/cookbooks/mu-activedirectory/providers/domain_node.rb +275 -0
  47. data/cookbooks/mu-activedirectory/recipes/default.rb +8 -0
  48. data/cookbooks/mu-activedirectory/recipes/domain-controller.rb +44 -0
  49. data/cookbooks/mu-activedirectory/recipes/domain-node.rb +50 -0
  50. data/cookbooks/mu-activedirectory/recipes/domain.rb +43 -0
  51. data/cookbooks/mu-activedirectory/recipes/sssd.rb +185 -0
  52. data/cookbooks/mu-activedirectory/resources/domain.rb +25 -0
  53. data/cookbooks/mu-activedirectory/resources/domain_controller.rb +25 -0
  54. data/cookbooks/mu-activedirectory/resources/domain_node.rb +20 -0
  55. data/cookbooks/mu-activedirectory/templates/default/dhclient-eth0.conf.erb +4 -0
  56. data/cookbooks/mu-activedirectory/templates/default/interface +0 -0
  57. data/cookbooks/mu-activedirectory/templates/default/krb5.conf.erb +23 -0
  58. data/cookbooks/mu-activedirectory/templates/default/ntp.conf.erb +56 -0
  59. data/cookbooks/mu-activedirectory/templates/default/smb.conf.erb +33 -0
  60. data/cookbooks/mu-activedirectory/templates/default/sssd.conf.erb +60 -0
  61. data/cookbooks/mu-activedirectory/templates/windows/Backup.xml.erb +20 -0
  62. data/cookbooks/mu-activedirectory/templates/windows/bkupInfo.xml.erb +1 -0
  63. data/cookbooks/mu-activedirectory/templates/windows/gpreprt.xml.erb +198 -0
  64. data/cookbooks/mu-activedirectory/templates/windows/gptmpl.inf.erb +12 -0
  65. data/cookbooks/mu-activedirectory/templates/windows/manifest.xml.erb +1 -0
  66. data/cookbooks/mu-firewall/CHANGELOG.md +11 -0
  67. data/cookbooks/mu-firewall/LICENSE +37 -0
  68. data/cookbooks/mu-firewall/README.md +5 -0
  69. data/cookbooks/mu-firewall/attributes/default.rb +3 -0
  70. data/cookbooks/mu-firewall/metadata.rb +16 -0
  71. data/cookbooks/mu-firewall/recipes/default.rb +10 -0
  72. data/cookbooks/mu-glusterfs/CHANGELOG.md +13 -0
  73. data/cookbooks/mu-glusterfs/LICENSE +37 -0
  74. data/cookbooks/mu-glusterfs/README.md +5 -0
  75. data/cookbooks/mu-glusterfs/attributes/default.rb +34 -0
  76. data/cookbooks/mu-glusterfs/metadata.rb +17 -0
  77. data/cookbooks/mu-glusterfs/recipes/client.rb +62 -0
  78. data/cookbooks/mu-glusterfs/recipes/default.rb +16 -0
  79. data/cookbooks/mu-glusterfs/recipes/samba.rb +57 -0
  80. data/cookbooks/mu-glusterfs/recipes/server.rb +200 -0
  81. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +71 -0
  82. data/cookbooks/mu-glusterfs/templates/default/smb.conf.erb +14 -0
  83. data/cookbooks/mu-jenkins/CHANGELOG.md +13 -0
  84. data/cookbooks/mu-jenkins/LICENSE +37 -0
  85. data/cookbooks/mu-jenkins/README.md +105 -0
  86. data/cookbooks/mu-jenkins/attributes/default.rb +42 -0
  87. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +73 -0
  88. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +44 -0
  89. data/cookbooks/mu-jenkins/metadata.rb +21 -0
  90. data/cookbooks/mu-jenkins/recipes/default.rb +195 -0
  91. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +54 -0
  92. data/cookbooks/mu-jenkins/recipes/public_key.rb +24 -0
  93. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +24 -0
  94. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +14 -0
  95. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +6 -0
  96. data/cookbooks/mu-master/CHANGELOG.md +13 -0
  97. data/cookbooks/mu-master/LICENSE +37 -0
  98. data/cookbooks/mu-master/README.md +6 -0
  99. data/cookbooks/mu-master/attributes/default.rb +95 -0
  100. data/cookbooks/mu-master/files/default/0-mu-log-server.conf +19 -0
  101. data/cookbooks/mu-master/files/default/addRSA.ldif +8 -0
  102. data/cookbooks/mu-master/files/default/check_mem.pl +197 -0
  103. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  104. data/cookbooks/mu-master/files/default/dirsrv_admin.pp +0 -0
  105. data/cookbooks/mu-master/files/default/dirsrv_admin.te +13 -0
  106. data/cookbooks/mu-master/files/default/nagios_selinux.pp +0 -0
  107. data/cookbooks/mu-master/files/default/nagios_selinux.te +51 -0
  108. data/cookbooks/mu-master/files/default/nagios_selinux_7.pp +0 -0
  109. data/cookbooks/mu-master/files/default/nagios_selinux_7.te +17 -0
  110. data/cookbooks/mu-master/files/default/pam_sshd +18 -0
  111. data/cookbooks/mu-master/files/default/ssl_enable.ldif +18 -0
  112. data/cookbooks/mu-master/files/default/syslogd_oddjobd.pp +0 -0
  113. data/cookbooks/mu-master/files/default/syslogd_oddjobd.te +10 -0
  114. data/cookbooks/mu-master/files/default/vimrc +19 -0
  115. data/cookbooks/mu-master/libraries/mu.rb +29 -0
  116. data/cookbooks/mu-master/metadata.rb +30 -0
  117. data/cookbooks/mu-master/providers/user.rb +41 -0
  118. data/cookbooks/mu-master/recipes/389ds.rb +164 -0
  119. data/cookbooks/mu-master/recipes/basepackages.rb +58 -0
  120. data/cookbooks/mu-master/recipes/caching_nameserver.rb +37 -0
  121. data/cookbooks/mu-master/recipes/default.rb +451 -0
  122. data/cookbooks/mu-master/recipes/eks-kubectl.rb +41 -0
  123. data/cookbooks/mu-master/recipes/firewall-holes.rb +70 -0
  124. data/cookbooks/mu-master/recipes/init.rb +542 -0
  125. data/cookbooks/mu-master/recipes/ssl-certs.rb +109 -0
  126. data/cookbooks/mu-master/recipes/sssd.rb +89 -0
  127. data/cookbooks/mu-master/recipes/update_nagios_only.rb +242 -0
  128. data/cookbooks/mu-master/recipes/vault.rb +111 -0
  129. data/cookbooks/mu-master/resources/user.rb +19 -0
  130. data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +28 -0
  131. data/cookbooks/mu-master/templates/default/chef-server.rb.erb +18 -0
  132. data/cookbooks/mu-master/templates/default/dhclient-eth0.conf.erb +9 -0
  133. data/cookbooks/mu-master/templates/default/mu-momma-cat.erb +149 -0
  134. data/cookbooks/mu-master/templates/default/mu.rc.erb +9 -0
  135. data/cookbooks/mu-master/templates/default/openssl.cnf.erb +354 -0
  136. data/cookbooks/mu-master/templates/default/sssd.conf.erb +44 -0
  137. data/cookbooks/mu-master/templates/default/web_app.conf.erb +90 -0
  138. data/cookbooks/mu-mongo/CHANGELOG.md +13 -0
  139. data/cookbooks/mu-mongo/LICENSE +37 -0
  140. data/cookbooks/mu-mongo/README.md +5 -0
  141. data/cookbooks/mu-mongo/attributes/default.rb +22 -0
  142. data/cookbooks/mu-mongo/files/default/keyfile +16 -0
  143. data/cookbooks/mu-mongo/files/default/remove_nodes.js +5 -0
  144. data/cookbooks/mu-mongo/metadata.rb +17 -0
  145. data/cookbooks/mu-mongo/recipes/default.rb +149 -0
  146. data/cookbooks/mu-mongo/recipes/yum-update-rule.rb +18 -0
  147. data/cookbooks/mu-mongo/templates/default/mongo_create_openfema_db.js.erb +2 -0
  148. data/cookbooks/mu-mongo/templates/default/mongo_init.js.erb +1 -0
  149. data/cookbooks/mu-mongo/templates/default/mongo_logrotate.erb +14 -0
  150. data/cookbooks/mu-mongo/templates/default/mongo_replset_addnodes.js.erb +6 -0
  151. data/cookbooks/mu-mongo/templates/default/replset_init.js.erb +2 -0
  152. data/cookbooks/mu-openvpn/CHANGELOG.md +13 -0
  153. data/cookbooks/mu-openvpn/LICENSE +37 -0
  154. data/cookbooks/mu-openvpn/README.md +6 -0
  155. data/cookbooks/mu-openvpn/attributes/default.rb +119 -0
  156. data/cookbooks/mu-openvpn/metadata.rb +18 -0
  157. data/cookbooks/mu-openvpn/recipes/default.rb +108 -0
  158. data/cookbooks/mu-openvpn/templates/default/users.json.erb +42 -0
  159. data/cookbooks/mu-php54/CHANGELOG.md +12 -0
  160. data/cookbooks/mu-php54/LICENSE +37 -0
  161. data/cookbooks/mu-php54/README.md +0 -0
  162. data/cookbooks/mu-php54/files/centos/php.ini +1802 -0
  163. data/cookbooks/mu-php54/files/ubuntu/php.ini +1870 -0
  164. data/cookbooks/mu-php54/metadata.rb +21 -0
  165. data/cookbooks/mu-php54/recipes/default.rb +97 -0
  166. data/cookbooks/mu-splunk/CHANGELOG.md +37 -0
  167. data/cookbooks/mu-splunk/LICENSE +37 -0
  168. data/cookbooks/mu-splunk/README.md +451 -0
  169. data/cookbooks/mu-splunk/attributes/default.rb +95 -0
  170. data/cookbooks/mu-splunk/attributes/upgrade.rb +49 -0
  171. data/cookbooks/mu-splunk/definitions/splunk_installer.rb +103 -0
  172. data/cookbooks/mu-splunk/files/default/splunk-nocheck +10 -0
  173. data/cookbooks/mu-splunk/libraries/helpers.rb +72 -0
  174. data/cookbooks/mu-splunk/libraries/splunk_app_provider.rb +156 -0
  175. data/cookbooks/mu-splunk/libraries/splunk_app_resource.rb +43 -0
  176. data/cookbooks/mu-splunk/metadata.json +30 -0
  177. data/cookbooks/mu-splunk/metadata.rb +17 -0
  178. data/cookbooks/mu-splunk/recipes/client.rb +143 -0
  179. data/cookbooks/mu-splunk/recipes/default.rb +31 -0
  180. data/cookbooks/mu-splunk/recipes/disabled.rb +41 -0
  181. data/cookbooks/mu-splunk/recipes/install_forwarder.rb +23 -0
  182. data/cookbooks/mu-splunk/recipes/install_server.rb +23 -0
  183. data/cookbooks/mu-splunk/recipes/server.rb +53 -0
  184. data/cookbooks/mu-splunk/recipes/service.rb +95 -0
  185. data/cookbooks/mu-splunk/recipes/setup_auth.rb +49 -0
  186. data/cookbooks/mu-splunk/recipes/setup_ssl.rb +63 -0
  187. data/cookbooks/mu-splunk/recipes/upgrade.rb +94 -0
  188. data/cookbooks/mu-splunk/recipes/user.rb +34 -0
  189. data/cookbooks/mu-splunk/templates/default/base_logs_unix_inputs.conf.erb +26 -0
  190. data/cookbooks/mu-splunk/templates/default/inputs.conf.erb +13 -0
  191. data/cookbooks/mu-splunk/templates/default/outputs.conf.erb +9 -0
  192. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +74 -0
  193. data/cookbooks/mu-splunk/templates/default/system-web.conf.erb +7 -0
  194. data/cookbooks/mu-tools/CHANGELOG.md +12 -0
  195. data/cookbooks/mu-tools/LICENSE +37 -0
  196. data/cookbooks/mu-tools/README.md +188 -0
  197. data/cookbooks/mu-tools/attributes/default.rb +142 -0
  198. data/cookbooks/mu-tools/attributes/ebs_rolling_snapshots.rb +3 -0
  199. data/cookbooks/mu-tools/files/amazon/etc/freshclam.conf +235 -0
  200. data/cookbooks/mu-tools/files/centos/CentOS-Base.repo +52 -0
  201. data/cookbooks/mu-tools/files/centos/etc/bashrc +93 -0
  202. data/cookbooks/mu-tools/files/centos/etc/freshclam.conf +235 -0
  203. data/cookbooks/mu-tools/files/centos/etc/login.defs +72 -0
  204. data/cookbooks/mu-tools/files/centos/etc/profile +77 -0
  205. data/cookbooks/mu-tools/files/centos/etc/security/limits.conf +57 -0
  206. data/cookbooks/mu-tools/files/centos/etc/sysconfig/init +19 -0
  207. data/cookbooks/mu-tools/files/centos/etc/sysctl.conf +82 -0
  208. data/cookbooks/mu-tools/files/centos-6/README_MU +0 -0
  209. data/cookbooks/mu-tools/files/centos-6/etc/audit/stig.rules +173 -0
  210. data/cookbooks/mu-tools/files/centos-6/etc/bashrc +90 -0
  211. data/cookbooks/mu-tools/files/centos-6/etc/login.defs +70 -0
  212. data/cookbooks/mu-tools/files/centos-6/etc/pam.d/su +12 -0
  213. data/cookbooks/mu-tools/files/centos-6/etc/profile +83 -0
  214. data/cookbooks/mu-tools/files/centos-6/etc/securetty +12 -0
  215. data/cookbooks/mu-tools/files/centos-6/etc/sysconfig/init +30 -0
  216. data/cookbooks/mu-tools/files/centos-6/etc/sysctl.conf +40 -0
  217. data/cookbooks/mu-tools/files/default/Mu_CA.pem +34 -0
  218. data/cookbooks/mu-tools/files/default/PSWindowsUpdate.zip +0 -0
  219. data/cookbooks/mu-tools/files/default/ebs_snapshots.py +123 -0
  220. data/cookbooks/mu-tools/files/default/etc/BANNER +0 -0
  221. data/cookbooks/mu-tools/files/default/etc/BANNER-FEDERAL +19 -0
  222. data/cookbooks/mu-tools/files/default/gpo_no_uac.zip +0 -0
  223. data/cookbooks/mu-tools/files/default/mypol.pp +0 -0
  224. data/cookbooks/mu-tools/files/default/mypol.te +37 -0
  225. data/cookbooks/mu-tools/files/default/nrpe_c7.pp +0 -0
  226. data/cookbooks/mu-tools/files/default/nrpe_c7.te +31 -0
  227. data/cookbooks/mu-tools/files/default/nrpe_check_disk.pp +0 -0
  228. data/cookbooks/mu-tools/files/default/nrpe_check_disk.te +11 -0
  229. data/cookbooks/mu-tools/files/default/nrpe_disk.pp +0 -0
  230. data/cookbooks/mu-tools/files/default/nrpe_disk.te +10 -0
  231. data/cookbooks/mu-tools/files/default/nrpe_file.pp +0 -0
  232. data/cookbooks/mu-tools/files/default/nrpe_file.te +31 -0
  233. data/cookbooks/mu-tools/files/default/ntrights +0 -0
  234. data/cookbooks/mu-tools/files/default/serverclass.conf +18 -0
  235. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/app.conf +1 -0
  236. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/inputs.conf +13 -0
  237. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/app.conf +1 -0
  238. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/inputs.conf +8 -0
  239. data/cookbooks/mu-tools/files/default/sshd_pol.pp +0 -0
  240. data/cookbooks/mu-tools/files/default/sshd_pol.te +32 -0
  241. data/cookbooks/mu-tools/files/redhat/etc/bashrc +93 -0
  242. data/cookbooks/mu-tools/files/redhat/etc/freshclam.conf +235 -0
  243. data/cookbooks/mu-tools/files/redhat/etc/login.defs +72 -0
  244. data/cookbooks/mu-tools/files/redhat/etc/profile +77 -0
  245. data/cookbooks/mu-tools/files/redhat/etc/security/limits.conf +57 -0
  246. data/cookbooks/mu-tools/files/redhat/etc/sysconfig/init +19 -0
  247. data/cookbooks/mu-tools/files/redhat/etc/sysctl.conf +82 -0
  248. data/cookbooks/mu-tools/files/redhat-6/README_MU +0 -0
  249. data/cookbooks/mu-tools/files/redhat-6/etc/audit/stig.rules +173 -0
  250. data/cookbooks/mu-tools/files/redhat-6/etc/bashrc +90 -0
  251. data/cookbooks/mu-tools/files/redhat-6/etc/login.defs +70 -0
  252. data/cookbooks/mu-tools/files/redhat-6/etc/pam.d/su +12 -0
  253. data/cookbooks/mu-tools/files/redhat-6/etc/profile +83 -0
  254. data/cookbooks/mu-tools/files/redhat-6/etc/securetty +12 -0
  255. data/cookbooks/mu-tools/files/redhat-6/etc/sysconfig/init +30 -0
  256. data/cookbooks/mu-tools/files/redhat-6/etc/sysctl.conf +40 -0
  257. data/cookbooks/mu-tools/files/redhat-7.1/etc/freshclam.conf +235 -0
  258. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/bash.bashrc +64 -0
  259. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/common-session +30 -0
  260. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/login.defs +338 -0
  261. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/profile +30 -0
  262. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/security/limits.conf +56 -0
  263. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/sysctl.conf +60 -0
  264. data/cookbooks/mu-tools/libraries/helper.rb +292 -0
  265. data/cookbooks/mu-tools/metadata.rb +28 -0
  266. data/cookbooks/mu-tools/recipes/add_admin_ssh_keys.rb +35 -0
  267. data/cookbooks/mu-tools/recipes/apply_security.rb +440 -0
  268. data/cookbooks/mu-tools/recipes/aws_api.rb +23 -0
  269. data/cookbooks/mu-tools/recipes/base_repositories.rb +31 -0
  270. data/cookbooks/mu-tools/recipes/cisbenchmark.rb +59 -0
  271. data/cookbooks/mu-tools/recipes/clamav.rb +53 -0
  272. data/cookbooks/mu-tools/recipes/cloudinit.rb +58 -0
  273. data/cookbooks/mu-tools/recipes/configure_oracle_tools.rb +81 -0
  274. data/cookbooks/mu-tools/recipes/disable-requiretty.rb +22 -0
  275. data/cookbooks/mu-tools/recipes/ebs_rolling_snapshots.rb +75 -0
  276. data/cookbooks/mu-tools/recipes/efs.rb +70 -0
  277. data/cookbooks/mu-tools/recipes/eks.rb +160 -0
  278. data/cookbooks/mu-tools/recipes/gcloud.rb +98 -0
  279. data/cookbooks/mu-tools/recipes/google_api.rb +25 -0
  280. data/cookbooks/mu-tools/recipes/maldet.rb +67 -0
  281. data/cookbooks/mu-tools/recipes/nagios.rb +19 -0
  282. data/cookbooks/mu-tools/recipes/newclient.rb +23 -0
  283. data/cookbooks/mu-tools/recipes/nrpe.rb +115 -0
  284. data/cookbooks/mu-tools/recipes/python_pip.rb +35 -0
  285. data/cookbooks/mu-tools/recipes/retrieve_application.rb +51 -0
  286. data/cookbooks/mu-tools/recipes/rsyslog.rb +65 -0
  287. data/cookbooks/mu-tools/recipes/set_local_fw.rb +57 -0
  288. data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +81 -0
  289. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +86 -0
  290. data/cookbooks/mu-tools/recipes/splunk-client.rb +69 -0
  291. data/cookbooks/mu-tools/recipes/splunk-server.rb +104 -0
  292. data/cookbooks/mu-tools/recipes/store_inspec_attr.rb +8 -0
  293. data/cookbooks/mu-tools/recipes/updates.rb +96 -0
  294. data/cookbooks/mu-tools/recipes/windows-client.rb +202 -0
  295. data/cookbooks/mu-tools/resources/aws_windows.rb +33 -0
  296. data/cookbooks/mu-tools/resources/disk.rb +88 -0
  297. data/cookbooks/mu-tools/resources/mommacat_request.rb +11 -0
  298. data/cookbooks/mu-tools/resources/scheduled_tasks.rb +29 -0
  299. data/cookbooks/mu-tools/resources/sshd_service.rb +45 -0
  300. data/cookbooks/mu-tools/resources/windows_users.rb +242 -0
  301. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +168 -0
  302. data/cookbooks/mu-tools/templates/centos-6/sshd_config.erb +212 -0
  303. data/cookbooks/mu-tools/templates/centos-7/sshd_config.erb +215 -0
  304. data/cookbooks/mu-tools/templates/default/0-mu-log-client.conf.erb +13 -0
  305. data/cookbooks/mu-tools/templates/default/conf.maldet.erb +137 -0
  306. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +30 -0
  307. data/cookbooks/mu-tools/templates/default/etc_pamd_password-auth.erb +14 -0
  308. data/cookbooks/mu-tools/templates/default/etc_pamd_system-auth.erb +14 -0
  309. data/cookbooks/mu-tools/templates/default/etc_sysconfig_network.erb +12 -0
  310. data/cookbooks/mu-tools/templates/default/kubeconfig.erb +29 -0
  311. data/cookbooks/mu-tools/templates/default/kubelet.service.erb +35 -0
  312. data/cookbooks/mu-tools/templates/default/maldet_scanall.sh.erb +15 -0
  313. data/cookbooks/mu-tools/templates/default/nrpe.cfg.erb +233 -0
  314. data/cookbooks/mu-tools/templates/redhat-6/sshd_config.erb +213 -0
  315. data/cookbooks/mu-tools/templates/redhat-7/sshd_config.erb +215 -0
  316. data/cookbooks/mu-tools/templates/ubuntu-12.04/sshd_config.erb +146 -0
  317. data/cookbooks/mu-tools/templates/ubuntu-14.04/sshd_config.erb +145 -0
  318. data/cookbooks/mu-tools/templates/windows/Backup.xml.erb +20 -0
  319. data/cookbooks/mu-tools/templates/windows/bkupInfo.xml.erb +1 -0
  320. data/cookbooks/mu-tools/templates/windows/gpreprt.xml.erb +214 -0
  321. data/cookbooks/mu-tools/templates/windows/gptmpl.inf.erb +12 -0
  322. data/cookbooks/mu-tools/templates/windows/manifest.xml.erb +1 -0
  323. data/cookbooks/mu-tools/templates/windows/set_ad_dns_scheduled_task.ps1.erb +6 -0
  324. data/cookbooks/mu-tools/templates/windows/sshd_config.erb +136 -0
  325. data/cookbooks/mu-utility/CHANGELOG.md +12 -0
  326. data/cookbooks/mu-utility/LICENSE +37 -0
  327. data/cookbooks/mu-utility/README.md +6 -0
  328. data/cookbooks/mu-utility/attributes/default.rb +1 -0
  329. data/cookbooks/mu-utility/libraries/matchers.rb +21 -0
  330. data/cookbooks/mu-utility/metadata.rb +16 -0
  331. data/cookbooks/mu-utility/recipes/apt.rb +23 -0
  332. data/cookbooks/mu-utility/recipes/cleanup_image_helper.rb +118 -0
  333. data/cookbooks/mu-utility/recipes/iptables.rb +26 -0
  334. data/cookbooks/mu-utility/recipes/luks.rb +18 -0
  335. data/cookbooks/mu-utility/recipes/nat.rb +104 -0
  336. data/cookbooks/mu-utility/recipes/php.rb +33 -0
  337. data/cookbooks/mu-utility/recipes/rdp_gateway.rb +83 -0
  338. data/cookbooks/mu-utility/recipes/remi.rb +44 -0
  339. data/cookbooks/mu-utility/recipes/vim.rb +26 -0
  340. data/cookbooks/mu-utility/recipes/windows_basics.rb +37 -0
  341. data/cookbooks/mu-utility/recipes/zip.rb +26 -0
  342. data/cookbooks/mu-utility/templates/default/BundleConfig.xml.erb +34 -0
  343. data/cookbooks/mu-utility/templates/default/config.xml.erb +60 -0
  344. data/cookbooks/nagios/Berksfile +8 -0
  345. data/cookbooks/nagios/CHANGELOG.md +589 -0
  346. data/cookbooks/nagios/CONTRIBUTING.md +11 -0
  347. data/cookbooks/nagios/LICENSE +37 -0
  348. data/cookbooks/nagios/README.md +328 -0
  349. data/cookbooks/nagios/TESTING.md +2 -0
  350. data/cookbooks/nagios/attributes/config.rb +171 -0
  351. data/cookbooks/nagios/attributes/default.rb +228 -0
  352. data/cookbooks/nagios/chefignore +102 -0
  353. data/cookbooks/nagios/definitions/command.rb +33 -0
  354. data/cookbooks/nagios/definitions/contact.rb +33 -0
  355. data/cookbooks/nagios/definitions/contactgroup.rb +33 -0
  356. data/cookbooks/nagios/definitions/host.rb +33 -0
  357. data/cookbooks/nagios/definitions/hostdependency.rb +33 -0
  358. data/cookbooks/nagios/definitions/hostescalation.rb +34 -0
  359. data/cookbooks/nagios/definitions/hostgroup.rb +33 -0
  360. data/cookbooks/nagios/definitions/nagios_conf.rb +38 -0
  361. data/cookbooks/nagios/definitions/resource.rb +33 -0
  362. data/cookbooks/nagios/definitions/service.rb +33 -0
  363. data/cookbooks/nagios/definitions/servicedependency.rb +33 -0
  364. data/cookbooks/nagios/definitions/serviceescalation.rb +34 -0
  365. data/cookbooks/nagios/definitions/servicegroup.rb +33 -0
  366. data/cookbooks/nagios/definitions/timeperiod.rb +33 -0
  367. data/cookbooks/nagios/libraries/base.rb +314 -0
  368. data/cookbooks/nagios/libraries/command.rb +91 -0
  369. data/cookbooks/nagios/libraries/contact.rb +230 -0
  370. data/cookbooks/nagios/libraries/contactgroup.rb +112 -0
  371. data/cookbooks/nagios/libraries/custom_option.rb +36 -0
  372. data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
  373. data/cookbooks/nagios/libraries/default.rb +90 -0
  374. data/cookbooks/nagios/libraries/host.rb +412 -0
  375. data/cookbooks/nagios/libraries/hostdependency.rb +181 -0
  376. data/cookbooks/nagios/libraries/hostescalation.rb +173 -0
  377. data/cookbooks/nagios/libraries/hostgroup.rb +119 -0
  378. data/cookbooks/nagios/libraries/nagios.rb +282 -0
  379. data/cookbooks/nagios/libraries/resource.rb +59 -0
  380. data/cookbooks/nagios/libraries/service.rb +455 -0
  381. data/cookbooks/nagios/libraries/servicedependency.rb +215 -0
  382. data/cookbooks/nagios/libraries/serviceescalation.rb +195 -0
  383. data/cookbooks/nagios/libraries/servicegroup.rb +144 -0
  384. data/cookbooks/nagios/libraries/timeperiod.rb +160 -0
  385. data/cookbooks/nagios/libraries/users_helper.rb +54 -0
  386. data/cookbooks/nagios/metadata.rb +25 -0
  387. data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
  388. data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
  389. data/cookbooks/nagios/recipes/apache.rb +48 -0
  390. data/cookbooks/nagios/recipes/default.rb +204 -0
  391. data/cookbooks/nagios/recipes/nginx.rb +82 -0
  392. data/cookbooks/nagios/recipes/pagerduty.rb +143 -0
  393. data/cookbooks/nagios/recipes/server_package.rb +40 -0
  394. data/cookbooks/nagios/recipes/server_source.rb +164 -0
  395. data/cookbooks/nagios/templates/default/apache2.conf.erb +96 -0
  396. data/cookbooks/nagios/templates/default/cgi.cfg.erb +266 -0
  397. data/cookbooks/nagios/templates/default/commands.cfg.erb +13 -0
  398. data/cookbooks/nagios/templates/default/contacts.cfg.erb +37 -0
  399. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +25 -0
  400. data/cookbooks/nagios/templates/default/hosts.cfg.erb +15 -0
  401. data/cookbooks/nagios/templates/default/htpasswd.users.erb +6 -0
  402. data/cookbooks/nagios/templates/default/nagios.cfg.erb +22 -0
  403. data/cookbooks/nagios/templates/default/nginx.conf.erb +62 -0
  404. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +185 -0
  405. data/cookbooks/nagios/templates/default/resource.cfg.erb +27 -0
  406. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +15 -0
  407. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +14 -0
  408. data/cookbooks/nagios/templates/default/services.cfg.erb +14 -0
  409. data/cookbooks/nagios/templates/default/templates.cfg.erb +31 -0
  410. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +13 -0
  411. data/cookbooks/s3fs/CHANGELOG.md +13 -0
  412. data/cookbooks/s3fs/LICENSE +37 -0
  413. data/cookbooks/s3fs/README.md +6 -0
  414. data/cookbooks/s3fs/attributes/default.rb +15 -0
  415. data/cookbooks/s3fs/files/default/fuse-2.9.3.zip +0 -0
  416. data/cookbooks/s3fs/metadata.rb +16 -0
  417. data/cookbooks/s3fs/recipes/default.rb +91 -0
  418. data/data_bags/demo/app.json +7 -0
  419. data/data_bags/nagios_services/chef.json +6 -0
  420. data/data_bags/nagios_services/linux_diskspace.json +5 -0
  421. data/data_bags/nagios_services/momma_cat.json +6 -0
  422. data/data_bags/nagios_services/mu-master-memory.json +5 -0
  423. data/data_bags/nagios_services/nagios_ui.json +6 -0
  424. data/data_bags/nagios_services/node_ssh.json +6 -0
  425. data/data_bags/nagios_services/ssh.json +6 -0
  426. data/demo/lambda_test.yaml +29 -0
  427. data/environments/DEV.json +8 -0
  428. data/environments/PROD.json +8 -0
  429. data/environments/dev.json +8 -0
  430. data/environments/development.json +8 -0
  431. data/environments/prod.json +8 -0
  432. data/extras/README.md +1 -0
  433. data/extras/admin-role-binding.yaml +16 -0
  434. data/extras/admin-user.yaml +6 -0
  435. data/extras/aws-auth-cm.yaml.erb +12 -0
  436. data/extras/clean-stock-amis +48 -0
  437. data/extras/git-fix-permissions-hook +12 -0
  438. data/extras/gitlab-eks-helper.sh.erb +20 -0
  439. data/extras/image-generators/README.md +2 -0
  440. data/extras/image-generators/aws/centos6.yaml +18 -0
  441. data/extras/image-generators/aws/centos7-govcloud.yaml +24 -0
  442. data/extras/image-generators/aws/centos7.yaml +17 -0
  443. data/extras/image-generators/aws/rhel7.yaml +17 -0
  444. data/extras/image-generators/aws/win2k12.yaml +16 -0
  445. data/extras/image-generators/aws/win2k16.yaml +16 -0
  446. data/extras/image-generators/aws/windows.yaml +18 -0
  447. data/extras/image-generators/gcp/centos6.yaml +17 -0
  448. data/extras/lambda_waf_domain_blacklist.py +103 -0
  449. data/extras/platform_berksfile_base +50 -0
  450. data/extras/ruby_rpm/build.sh +17 -0
  451. data/extras/ruby_rpm/muby.spec +44 -0
  452. data/extras/vault_tools/README.md +6 -0
  453. data/extras/vault_tools/export_vaults.sh +3 -0
  454. data/extras/vault_tools/recreate_vaults.sh +5 -0
  455. data/extras/vault_tools/test_vaults.sh +5 -0
  456. data/install/README.md +8 -0
  457. data/install/cfn_create_mu_master.json +1034 -0
  458. data/install/chef-server.rb.erb +19 -0
  459. data/install/deprecated-bash-library.sh +1891 -0
  460. data/install/images/Usage.png +0 -0
  461. data/install/installer +71 -0
  462. data/install/jenkinskeys.rb +8 -0
  463. data/install/user-dot-murc.erb +14 -0
  464. data/modules/html.erb +19 -0
  465. data/modules/mommacat.ru +426 -0
  466. data/modules/mu/cleanup.rb +339 -0
  467. data/modules/mu/cloud.rb +1446 -0
  468. data/modules/mu/clouds/README.md +201 -0
  469. data/modules/mu/clouds/aws/alarm.rb +319 -0
  470. data/modules/mu/clouds/aws/cache_cluster.rb +1010 -0
  471. data/modules/mu/clouds/aws/collection.rb +373 -0
  472. data/modules/mu/clouds/aws/container_cluster.rb +667 -0
  473. data/modules/mu/clouds/aws/database.rb +1836 -0
  474. data/modules/mu/clouds/aws/dnszone.rb +911 -0
  475. data/modules/mu/clouds/aws/firewall_rule.rb +641 -0
  476. data/modules/mu/clouds/aws/folder.rb +92 -0
  477. data/modules/mu/clouds/aws/function.rb +349 -0
  478. data/modules/mu/clouds/aws/group.rb +251 -0
  479. data/modules/mu/clouds/aws/loadbalancer.rb +888 -0
  480. data/modules/mu/clouds/aws/log.rb +363 -0
  481. data/modules/mu/clouds/aws/msg_queue.rb +480 -0
  482. data/modules/mu/clouds/aws/notification.rb +139 -0
  483. data/modules/mu/clouds/aws/role.rb +656 -0
  484. data/modules/mu/clouds/aws/search_domain.rb +646 -0
  485. data/modules/mu/clouds/aws/server.rb +2294 -0
  486. data/modules/mu/clouds/aws/server_pool.rb +1388 -0
  487. data/modules/mu/clouds/aws/storage_pool.rb +495 -0
  488. data/modules/mu/clouds/aws/user.rb +382 -0
  489. data/modules/mu/clouds/aws/userdata/README.md +4 -0
  490. data/modules/mu/clouds/aws/userdata/linux.erb +179 -0
  491. data/modules/mu/clouds/aws/userdata/windows.erb +278 -0
  492. data/modules/mu/clouds/aws/vpc.rb +1943 -0
  493. data/modules/mu/clouds/aws.rb +1009 -0
  494. data/modules/mu/clouds/cloudformation/alarm.rb +146 -0
  495. data/modules/mu/clouds/cloudformation/cache_cluster.rb +167 -0
  496. data/modules/mu/clouds/cloudformation/collection.rb +117 -0
  497. data/modules/mu/clouds/cloudformation/database.rb +278 -0
  498. data/modules/mu/clouds/cloudformation/dnszone.rb +274 -0
  499. data/modules/mu/clouds/cloudformation/firewall_rule.rb +308 -0
  500. data/modules/mu/clouds/cloudformation/loadbalancer.rb +193 -0
  501. data/modules/mu/clouds/cloudformation/log.rb +170 -0
  502. data/modules/mu/clouds/cloudformation/server.rb +370 -0
  503. data/modules/mu/clouds/cloudformation/server_pool.rb +279 -0
  504. data/modules/mu/clouds/cloudformation/vpc.rb +322 -0
  505. data/modules/mu/clouds/cloudformation.rb +733 -0
  506. data/modules/mu/clouds/docker.rb +30 -0
  507. data/modules/mu/clouds/google/container_cluster.rb +290 -0
  508. data/modules/mu/clouds/google/database.rb +152 -0
  509. data/modules/mu/clouds/google/firewall_rule.rb +267 -0
  510. data/modules/mu/clouds/google/group.rb +164 -0
  511. data/modules/mu/clouds/google/loadbalancer.rb +479 -0
  512. data/modules/mu/clouds/google/server.rb +1510 -0
  513. data/modules/mu/clouds/google/server_pool.rb +274 -0
  514. data/modules/mu/clouds/google/user.rb +266 -0
  515. data/modules/mu/clouds/google/userdata/README.md +4 -0
  516. data/modules/mu/clouds/google/userdata/linux.erb +137 -0
  517. data/modules/mu/clouds/google/userdata/windows.erb +275 -0
  518. data/modules/mu/clouds/google/vpc.rb +890 -0
  519. data/modules/mu/clouds/google.rb +811 -0
  520. data/modules/mu/config/README.md +11 -0
  521. data/modules/mu/config/alarm.rb +271 -0
  522. data/modules/mu/config/cache_cluster.rb +172 -0
  523. data/modules/mu/config/collection.rb +87 -0
  524. data/modules/mu/config/container_cluster.rb +103 -0
  525. data/modules/mu/config/container_cluster.yml +36 -0
  526. data/modules/mu/config/database.rb +458 -0
  527. data/modules/mu/config/database.yml +26 -0
  528. data/modules/mu/config/dnszone.rb +327 -0
  529. data/modules/mu/config/firewall_rule.rb +118 -0
  530. data/modules/mu/config/folder.rb +70 -0
  531. data/modules/mu/config/function.rb +140 -0
  532. data/modules/mu/config/group.rb +64 -0
  533. data/modules/mu/config/loadbalancer.rb +482 -0
  534. data/modules/mu/config/log.rb +47 -0
  535. data/modules/mu/config/log.yml +6 -0
  536. data/modules/mu/config/msg_queue.rb +47 -0
  537. data/modules/mu/config/msg_queue.yml +9 -0
  538. data/modules/mu/config/notification.rb +44 -0
  539. data/modules/mu/config/project.rb +71 -0
  540. data/modules/mu/config/role.rb +102 -0
  541. data/modules/mu/config/search_domain.rb +61 -0
  542. data/modules/mu/config/search_domain.yml +25 -0
  543. data/modules/mu/config/server.rb +587 -0
  544. data/modules/mu/config/server.yml +8 -0
  545. data/modules/mu/config/server_pool.rb +216 -0
  546. data/modules/mu/config/server_pool.yml +71 -0
  547. data/modules/mu/config/storage_pool.rb +145 -0
  548. data/modules/mu/config/user.rb +78 -0
  549. data/modules/mu/config/vpc.rb +743 -0
  550. data/modules/mu/config/vpc.yml +6 -0
  551. data/modules/mu/config.rb +2000 -0
  552. data/modules/mu/defaults/README.md +2 -0
  553. data/modules/mu/defaults/amazon_images.yaml +121 -0
  554. data/modules/mu/defaults/google_images.yaml +16 -0
  555. data/modules/mu/deploy.rb +686 -0
  556. data/modules/mu/groomer.rb +123 -0
  557. data/modules/mu/groomers/README.md +58 -0
  558. data/modules/mu/groomers/chef.rb +1024 -0
  559. data/modules/mu/kittens.rb +11319 -0
  560. data/modules/mu/logger.rb +208 -0
  561. data/modules/mu/master/README.md +27 -0
  562. data/modules/mu/master/chef.rb +471 -0
  563. data/modules/mu/master/ldap.rb +1005 -0
  564. data/modules/mu/master.rb +415 -0
  565. data/modules/mu/mommacat.rb +2703 -0
  566. data/modules/mu-load-config.rb +1 -0
  567. data/modules/mu.rb +724 -0
  568. data/modules/scratchpad.erb +1 -0
  569. data/modules/tests/super_complex_bok.yml +41 -0
  570. data/modules/tests/super_simple_bok.yml +40 -0
  571. data/mu.gemspec +62 -0
  572. data/roles/demo-dbservice-configure.json +19 -0
  573. data/roles/demo-portal-configure.json +19 -0
  574. data/roles/mu-master-jenkins.json +24 -0
  575. data/roles/mu-master-nagios-only.json +13 -0
  576. data/roles/mu-master.json +12 -0
  577. data/roles/mu-node.json +19 -0
  578. data/roles/mu-splunk-server.json +13 -0
  579. data/roles/mu-splunk.json +13 -0
  580. data/test/clean_up.py +25 -0
  581. data/test/demo-test-profile/README.md +3 -0
  582. data/test/demo-test-profile/controls/flask.rb +84 -0
  583. data/test/demo-test-profile/inspec.lock +7 -0
  584. data/test/demo-test-profile/inspec.yml +11 -0
  585. data/test/etco-test-profile/README.md +3 -0
  586. data/test/etco-test-profile/controls/all-in-one.rb +182 -0
  587. data/test/etco-test-profile/inspec.lock +7 -0
  588. data/test/etco-test-profile/inspec.yml +11 -0
  589. data/test/exec_inspec.py +246 -0
  590. data/test/exec_mu_install.py +241 -0
  591. data/test/exec_retry.py +44 -0
  592. data/test/mu-master-test/README.md +3 -0
  593. data/test/mu-master-test/controls/all_in_one.rb +557 -0
  594. data/test/mu-master-test/inspec.lock +3 -0
  595. data/test/mu-master-test/inspec.yml +11 -0
  596. data/test/mu-tools-test/README.md +3 -0
  597. data/test/mu-tools-test/controls/base.rb +265 -0
  598. data/test/mu-tools-test/inspec.lock +3 -0
  599. data/test/mu-tools-test/inspec.yml +8 -0
  600. data/test/simple-server-php-test/README.md +3 -0
  601. data/test/simple-server-php-test/controls/apachephp.rb +25 -0
  602. data/test/simple-server-php-test/controls/example.rb +19 -0
  603. data/test/simple-server-php-test/inspec.lock +7 -0
  604. data/test/simple-server-php-test/inspec.yml +12 -0
  605. data/test/simple-server-rails-test/README.md +3 -0
  606. data/test/simple-server-rails-test/controls/rails.rb +188 -0
  607. data/test/simple-server-rails-test/inspec.lock +7 -0
  608. data/test/simple-server-rails-test/inspec.yml +11 -0
  609. data/test/simple-windows-test/README.md +3 -0
  610. data/test/simple-windows-test/controls/windows.rb +20 -0
  611. data/test/simple-windows-test/inspec.lock +7 -0
  612. data/test/simple-windows-test/inspec.yml +11 -0
  613. data/test/smoke_test.rb +75 -0
  614. data/test/wordpress-test/README.md +3 -0
  615. data/test/wordpress-test/controls/wordpress.rb +97 -0
  616. data/test/wordpress-test/inspec.lock +7 -0
  617. data/test/wordpress-test/inspec.yml +11 -0
  618. metadata +979 -0
@@ -0,0 +1,888 @@
1
+ # Copyright:: Copyright (c) 2014 eGlobalTech, Inc., all rights reserved
2
+ #
3
+ # Licensed under the BSD-3 license (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License in the root of the project or at
6
+ #
7
+ # http://egt-labs.com/mu/LICENSE.html
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module MU
16
+ class Cloud
17
+ class AWS
18
+ # A load balancer as configured in {MU::Config::BasketofKittens::loadbalancers}
19
+ class LoadBalancer < MU::Cloud::LoadBalancer
20
+
21
+ @deploy = nil
22
+ @lb = nil
23
+ attr_reader :mu_name
24
+ attr_reader :config
25
+ attr_reader :cloud_id
26
+ attr_reader :targetgroups
27
+
28
+ @cloudformation_data = {}
29
+ attr_reader :cloudformation_data
30
+
31
+ # @param mommacat [MU::MommaCat]: A {MU::Mommacat} object containing the deploy of which this resource is/will be a member.
32
+ # @param kitten_cfg [Hash]: The fully parsed and resolved {MU::Config} resource descriptor as defined in {MU::Config::BasketofKittens::loadbalancers}
33
+ def initialize(mommacat: nil, kitten_cfg: nil, mu_name: nil, cloud_id: nil)
34
+ @deploy = mommacat
35
+ @config = MU::Config.manxify(kitten_cfg)
36
+ @cloud_id ||= cloud_id
37
+ if !mu_name.nil?
38
+ @mu_name = mu_name
39
+ elsif @config['scrub_mu_isms']
40
+ @mu_name = @config['name']
41
+ else
42
+ @mu_name = @deploy.getResourceName(@config["name"], max_length: 32, need_unique_string: true)
43
+ @mu_name.gsub!(/[^\-a-z0-9]/i, "-") # AWS ELB naming rules
44
+ end
45
+ end
46
+
47
+ # Called automatically by {MU::Deploy#createResources}
48
+ def create
49
+ if @config["zones"] == nil
50
+ @config["zones"] = MU::Cloud::AWS.listAZs(@config['region'])
51
+ MU.log "Using zones from #{@config['region']}", MU::DEBUG, details: @config['zones']
52
+ end
53
+
54
+ lb_options = {
55
+ tags: []
56
+ }
57
+ if @config['classic']
58
+ lb_options[:load_balancer_name] = @mu_name
59
+ else
60
+ lb_options[:name] = @mu_name
61
+ end
62
+
63
+ MU::MommaCat.listStandardTags.each_pair { |name, value|
64
+ lb_options[:tags] << {key: name, value: value}
65
+ }
66
+
67
+ if @config['optional_tags']
68
+ MU::MommaCat.listOptionalTags.each_pair { |name, value|
69
+ lb_options[:tags] << {key: name, value: value}
70
+ }
71
+ end
72
+
73
+ if !@config['tags'].nil?
74
+ @config['tags'].each { |tag|
75
+ lb_options[:tags] << {key: tag['key'], value: tag['value']}
76
+ }
77
+ end
78
+
79
+ sgs = []
80
+ if @dependencies.has_key?("firewall_rule")
81
+ @dependencies['firewall_rule'].values.each { |sg|
82
+ sgs << sg.cloud_id
83
+ }
84
+ end
85
+ if sgs.size > 0 and !@config['vpc'].nil?
86
+ lb_options[:security_groups] = sgs
87
+ @config['sgs'] = sgs
88
+ end
89
+
90
+ if @config["vpc"] != nil
91
+ if @vpc.nil?
92
+ raise MuError, "LoadBalancer #{@config['name']} is configured to use a VPC, but no VPC found"
93
+ end
94
+ lb_options[:subnets] = []
95
+ @config["vpc"]["subnets"].each { |subnet|
96
+ subnet_obj = @vpc.getSubnet(cloud_id: subnet["subnet_id"], name: subnet["subnet_name"])
97
+ if subnet_obj.nil?
98
+ raise MuError, "Failed to locate subnet from #{subnet} in LoadBalancer #{@config['name']}"
99
+ end
100
+ lb_options[:subnets] << subnet_obj.cloud_id
101
+ }
102
+ if @config["private"]
103
+ lb_options[:scheme] = "internal"
104
+ end
105
+ else
106
+ lb_options[:availability_zones] = @config["zones"]
107
+ end
108
+
109
+ listeners = Array.new
110
+ if @config['classic']
111
+ @config["listeners"].each { |listener|
112
+ listen_struct = {
113
+ :load_balancer_port => listener["lb_port"],
114
+ :protocol => listener["lb_protocol"],
115
+ :instance_port => listener["instance_port"],
116
+ :instance_protocol => listener["instance_protocol"]
117
+ }
118
+ listen_struct[:ssl_certificate_id] = listener["ssl_certificate_id"] if !listener["ssl_certificate_id"].nil?
119
+
120
+ listeners << listen_struct
121
+ }
122
+ lb_options[:listeners] = listeners
123
+ end
124
+
125
+ zones_to_try = @config["zones"]
126
+ retries = 0
127
+ lb = nil
128
+ begin
129
+ if @config['classic']
130
+ MU.log "Creating Elastic Load Balancer #{@mu_name}", details: lb_options
131
+ lb = MU::Cloud::AWS.elb(@config['region']).create_load_balancer(lb_options)
132
+ else
133
+ MU.log "Creating Application Load Balancer #{@mu_name}", details: lb_options
134
+ lb = MU::Cloud::AWS.elb2(@config['region']).create_load_balancer(lb_options).load_balancers.first
135
+ begin
136
+ if lb.state.code != "active"
137
+ MU.log "Waiting for ALB #{@mu_name} to enter 'active' state", MU::NOTICE
138
+ sleep 20
139
+ lb = MU::Cloud::AWS.elb2(@config['region']).describe_load_balancers(
140
+ names: [@mu_name]
141
+ ).load_balancers.first
142
+ end
143
+ end while lb.state.code != "active"
144
+ end
145
+ rescue Aws::ElasticLoadBalancing::Errors::ValidationError, Aws::ElasticLoadBalancing::Errors::SubnetNotFound, Aws::ElasticLoadBalancing::Errors::InvalidConfigurationRequest => e
146
+ if zones_to_try.size > 0 and lb_options.has_key?(:availability_zones)
147
+ MU.log "Got #{e.inspect} when creating #{@mu_name} retrying with individual AZs in case that's the problem", MU::WARN
148
+ lb_options[:availability_zones] = [zones_to_try.pop]
149
+ retry
150
+ else
151
+ raise MuError, "#{e.inspect} when creating #{@mu_name}", e.backtrace
152
+ end
153
+ rescue Aws::ElasticLoadBalancing::Errors::InvalidSecurityGroup => e
154
+ if retries < 5
155
+ MU.log "#{e.inspect}, waiting then retrying", MU::WARN
156
+ sleep 10
157
+ retries = retries + 1
158
+ retry
159
+ else
160
+ raise MuError, "#{e.inspect} when creating #{@mu_name}", e.backtrace
161
+ end
162
+ end
163
+ @cloud_id = @mu_name
164
+ MU.log "LoadBalancer #{@config['name']} is at #{lb.dns_name}"
165
+ MU.log "LoadBalancer #{@config['name']} is at #{lb.dns_name}", MU::SUMMARY
166
+
167
+ parent_thread_id = Thread.current.object_id
168
+ generic_mu_dns = nil
169
+ dnsthread = Thread.new {
170
+ if !MU::Cloud::AWS.isGovCloud?
171
+ MU.dupGlobals(parent_thread_id)
172
+ generic_mu_dns = MU::Cloud::AWS::DNSZone.genericMuDNSEntry(name: @mu_name, target: "#{lb.dns_name}.", cloudclass: MU::Cloud::LoadBalancer, sync_wait: @config['dns_sync_wait'])
173
+ end
174
+ }
175
+
176
+ if zones_to_try.size < @config["zones"].size
177
+ zones_to_try.each { |zone|
178
+ begin
179
+ MU::Cloud::AWS.elb(@config['region']).enable_availability_zones_for_load_balancer(
180
+ load_balancer_name: @mu_name,
181
+ availability_zones: [zone]
182
+ )
183
+ rescue Aws::ElasticLoadBalancing::Errors::ValidationError => e
184
+ MU.log "Couldn't enable Availability Zone #{zone} for Load Balancer #{@mu_name} (#{e.message})", MU::WARN
185
+ end
186
+ }
187
+ end
188
+
189
+ @targetgroups = {}
190
+ if !@config['healthcheck'].nil? and @config['classic']
191
+ MU.log "Configuring custom health check for ELB #{@mu_name}", details: @config['healthcheck']
192
+ MU::Cloud::AWS.elb(@config['region']).configure_health_check(
193
+ load_balancer_name: @mu_name,
194
+ health_check: {
195
+ target: @config['healthcheck']['target'],
196
+ interval: @config['healthcheck']['interval'],
197
+ timeout: @config['healthcheck']['timeout'],
198
+ unhealthy_threshold: @config['healthcheck']['unhealthy_threshold'],
199
+ healthy_threshold: @config['healthcheck']['healthy_threshold']
200
+ }
201
+ )
202
+ elsif !@config['classic']
203
+ if @config['targetgroups']
204
+ MU.log "Configuring target groups and health checks check for ELB #{@mu_name}", details: @config['healthcheck']
205
+ @config['targetgroups'].each { |tg|
206
+ tg_name = @deploy.getResourceName(tg["name"], max_length: 32)
207
+ tg_descriptor = {
208
+ :name => tg_name,
209
+ :protocol => tg['proto'],
210
+ :vpc_id => @vpc.cloud_id,
211
+ :port => tg['port']
212
+ }
213
+ if tg['httpcode']
214
+ tg_descriptor[:matcher] = {
215
+ :http_code => tg['httpcode']
216
+ }
217
+ end
218
+ if tg['healthcheck']
219
+ hc_target = tg['healthcheck']['target'].match(/^([^:]+):(\d+)(.*)/)
220
+ tg_descriptor[:health_check_protocol] = hc_target[1]
221
+ tg_descriptor[:health_check_port] = hc_target[2]
222
+ tg_descriptor[:health_check_path] = hc_target[3]
223
+ tg_descriptor[:health_check_interval_seconds] = tg['healthcheck']['interval']
224
+ tg_descriptor[:health_check_timeout_seconds] = tg['healthcheck']['timeout']
225
+ tg_descriptor[:healthy_threshold_count] = tg['healthcheck']['healthy_threshold']
226
+ tg_descriptor[:unhealthy_threshold_count] = tg['healthcheck']['unhealthy_threshold']
227
+ if tg['healthcheck']['httpcode'] and !tg_descriptor.has_key?(:matcher)
228
+ tg_descriptor[:matcher] = {
229
+ :http_code => tg['healthcheck']['httpcode']
230
+ }
231
+ end
232
+ end
233
+
234
+ tg_resp = MU::Cloud::AWS.elb2(@config['region']).create_target_group(tg_descriptor)
235
+ @targetgroups[tg['name']] = tg_resp.target_groups.first
236
+ MU::Cloud::AWS.elb2(@config['region']).add_tags(
237
+ resource_arns: [tg_resp.target_groups.first.target_group_arn],
238
+ tags: lb_options[:tags]
239
+ )
240
+ }
241
+ end
242
+ end
243
+
244
+ if !@config['classic']
245
+ @config["listeners"].each { |l|
246
+ if !@targetgroups.has_key?(l['targetgroup'])
247
+ raise MuError, "Listener in #{@mu_name} configured for target group #{l['targetgroup']}, but I don't have data on a targetgroup by that name"
248
+ end
249
+ listen_descriptor = {
250
+ :default_actions => [{
251
+ :target_group_arn => @targetgroups[l['targetgroup']].target_group_arn,
252
+ :type => "forward"
253
+ }],
254
+ :load_balancer_arn => lb.load_balancer_arn,
255
+ :port => l['lb_port'],
256
+ :protocol => l['lb_protocol']
257
+ }
258
+ if l['ssl_certificate_id']
259
+ listen_descriptor[:certificates] = [{
260
+ :certificate_arn => l['ssl_certificate_id']
261
+ }]
262
+ listen_descriptor[:ssl_policy] = case l['tls_policy']
263
+ when "tls1.0"
264
+ "ELBSecurityPolicy-TLS-1-0-2015-04"
265
+ when "tls1.1"
266
+ "ELBSecurityPolicy-TLS-1-1-2017-01"
267
+ when "tls1.2"
268
+ "ELBSecurityPolicy-TLS-1-2-2017-01"
269
+ end
270
+ end
271
+ listen_resp = MU::Cloud::AWS.elb2(@config['region']).create_listener(listen_descriptor).listeners.first
272
+ if !l['rules'].nil?
273
+ l['rules'].each { |rule|
274
+ rule_descriptor = {
275
+ :listener_arn => listen_resp.listener_arn,
276
+ :priority => rule['order'],
277
+ :conditions => rule['conditions'],
278
+ :actions => []
279
+ }
280
+ rule['actions'].each { |a|
281
+ rule_descriptor[:actions] << {
282
+ :target_group_arn => @targetgroups[a['targetgroup']].target_group_arn,
283
+ :type => a['action']
284
+ }
285
+ }
286
+ MU::Cloud::AWS.elb2(@config['region']).create_rule(rule_descriptor)
287
+ }
288
+ end
289
+ }
290
+ else
291
+ @config["listeners"].each { |l|
292
+ if l['ssl_certificate_id']
293
+ resp = MU::Cloud::AWS.elb(@config['region']).set_load_balancer_policies_of_listener(
294
+ load_balancer_name: @cloud_id,
295
+ load_balancer_port: l['lb_port'],
296
+ policy_names: [
297
+ case l['tls_policy']
298
+ when "tls1.0"
299
+ "ELBSecurityPolicy-2016-08"
300
+ when "tls1.1"
301
+ # XXX This policy shows up in the console, but doesn't
302
+ # work there either. I think it's Amazon's bug, though we
303
+ # could get around it by creating a custom policy with all
304
+ # the bits we want. Ugh. Just use an ALB, man.
305
+ # "ELBSecurityPolicy-TLS-1-1-2017-01"
306
+ MU.log "Correct TLS1.1 cipher policy for classic Load Balancers is currently not supported, falling back to ELBSecurityPolicy-2016-08", MU::WARN
307
+ "ELBSecurityPolicy-2016-08"
308
+ when "tls1.2"
309
+ # XXX This policy shows up in the console, but doesn't
310
+ # work there either. I think it's Amazon's bug, though we
311
+ # could get around it by creating a custom policy with all
312
+ # the bits we want. Ugh. Just use an ALB, man.
313
+ # "ELBSecurityPolicy-TLS-1-2-2017-01"
314
+ MU.log "Correct TLS1.2 cipher policy for classic Load Balancers is currently not supported, falling back to ELBSecurityPolicy-2016-08", MU::WARN
315
+ "ELBSecurityPolicy-2016-08"
316
+ end
317
+ ]
318
+ )
319
+ end
320
+ }
321
+ end
322
+
323
+ if @config['cross_zone_unstickiness']
324
+ MU.log "Enabling cross-zone un-stickiness on #{lb.dns_name}"
325
+ if @config['classic']
326
+ MU::Cloud::AWS.elb(@config['region']).modify_load_balancer_attributes(
327
+ load_balancer_name: @mu_name,
328
+ load_balancer_attributes: {
329
+ cross_zone_load_balancing: {
330
+ enabled: true
331
+ }
332
+ }
333
+ )
334
+ else
335
+ @targetgroups.each_pair { |tg_name, tg|
336
+ MU::Cloud::AWS.elb2(@config['region']).modify_target_group_attributes(
337
+ target_group_arn: tg.target_group_arn,
338
+ attributes: [
339
+ {
340
+ key: "stickiness.enabled",
341
+ value: "true"
342
+ }
343
+ ]
344
+ )
345
+ }
346
+ end
347
+ end
348
+
349
+ if !@config['idle_timeout'].nil?
350
+ MU.log "Setting idle timeout to #{@config['idle_timeout']} #{lb.dns_name}"
351
+ if @config['classic']
352
+ MU::Cloud::AWS.elb(@config['region']).modify_load_balancer_attributes(
353
+ load_balancer_name: @mu_name,
354
+ load_balancer_attributes: {
355
+ connection_settings: {
356
+ idle_timeout: @config['idle_timeout']
357
+ }
358
+ }
359
+ )
360
+ else
361
+ MU::Cloud::AWS.elb2(@config['region']).modify_load_balancer_attributes(
362
+ load_balancer_arn: lb.load_balancer_arn,
363
+ attributes: [
364
+ {
365
+ key: "idle_timeout.timeout_seconds",
366
+ value: @config['idle_timeout'].to_s
367
+ }
368
+ ]
369
+ )
370
+ end
371
+ end
372
+
373
+ if !@config['connection_draining_timeout'].nil?
374
+ if @config['classic']
375
+ if @config['connection_draining_timeout'] >= 0
376
+ MU.log "Setting connection draining timeout to #{@config['connection_draining_timeout']} on #{lb.dns_name}"
377
+ MU::Cloud::AWS.elb(@config['region']).modify_load_balancer_attributes(
378
+ load_balancer_name: @mu_name,
379
+ load_balancer_attributes: {
380
+ connection_draining: {
381
+ enabled: true,
382
+ timeout: @config['connection_draining_timeout']
383
+ }
384
+ }
385
+ )
386
+ else
387
+ MU.log "Disabling connection draining on #{lb.dns_name}"
388
+ MU::Cloud::AWS.elb(@config['region']).modify_load_balancer_attributes(
389
+ load_balancer_name: @mu_name,
390
+ load_balancer_attributes: {
391
+ connection_draining: {
392
+ enabled: false
393
+ }
394
+ }
395
+ )
396
+ end
397
+ else
398
+ timeout = @config['connection_draining_timeout'].to_s
399
+ if @config['connection_draining_timeout'] >= 0
400
+ MU.log "Setting connection draining timeout to #{@config['connection_draining_timeout']} on #{lb.dns_name}"
401
+ else
402
+ timeout = 0
403
+ MU.log "Disabling connection draining on #{lb.dns_name}"
404
+ end
405
+ @targetgroups.each_pair { |tg_name, tg|
406
+ MU::Cloud::AWS.elb2(@config['region']).modify_target_group_attributes(
407
+ target_group_arn: tg.target_group_arn,
408
+ attributes: [
409
+ {
410
+ key: "deregistration_delay.timeout_seconds",
411
+ value: timeout.to_s
412
+ }
413
+ ]
414
+ )
415
+ }
416
+ end
417
+ end
418
+
419
+ if !@config['access_log'].nil?
420
+ MU.log "Setting access log params for #{lb.dns_name}", details: @config['access_log']
421
+ if @config['classic']
422
+ MU::Cloud::AWS.elb(@config['region']).modify_load_balancer_attributes(
423
+ load_balancer_name: @mu_name,
424
+ load_balancer_attributes: {
425
+ access_log: {
426
+ enabled: @config['access_log']['enabled'],
427
+ emit_interval: @config['access_log']['emit_interval'],
428
+ s3_bucket_name: @config['access_log']['s3_bucket_name'],
429
+ s3_bucket_prefix: @config['access_log']['s3_bucket_prefix']
430
+ }
431
+ }
432
+ )
433
+ else
434
+ MU::Cloud::AWS.elb2(@config['region']).modify_load_balancer_attributes(
435
+ load_balancer_arn: lb.load_balancer_arn,
436
+ attributes: [
437
+ {
438
+ key: "access_logs.s3.enabled",
439
+ value: "true"
440
+ },
441
+ {
442
+ key: "access_logs.s3.bucket",
443
+ value: @config['access_log']['s3_bucket_name']
444
+ },
445
+ {
446
+ key: "access_logs.s3.prefix",
447
+ value: @config['access_log']['s3_bucket_prefix']
448
+ }
449
+ ]
450
+ )
451
+ end
452
+ end
453
+
454
+ if !@config['lb_cookie_stickiness_policy'].nil?
455
+ MU.log "Setting ELB cookie stickiness policy for #{lb.dns_name}", details: @config['lb_cookie_stickiness_policy']
456
+ if @config['classic']
457
+ cookie_policy = {
458
+ load_balancer_name: @mu_name,
459
+ policy_name: @config['lb_cookie_stickiness_policy']['name']
460
+ }
461
+ if !@config['lb_cookie_stickiness_policy']['timeout'].nil?
462
+ cookie_policy[:cookie_expiration_period] = @config['lb_cookie_stickiness_policy']['timeout']
463
+ end
464
+ MU::Cloud::AWS.elb(@config['region']).create_lb_cookie_stickiness_policy(cookie_policy)
465
+ lb_policy_names = Array.new
466
+ lb_policy_names << @config['lb_cookie_stickiness_policy']['name']
467
+ listener_policy = {
468
+ load_balancer_name: @mu_name,
469
+ policy_names: lb_policy_names
470
+ }
471
+ lb_options[:listeners].each do |listener|
472
+ if listener[:protocol].upcase == 'HTTP' or listener[:protocol].upcase == 'HTTPS'
473
+ listener_policy[:load_balancer_port] = listener[:load_balancer_port]
474
+ MU::Cloud::AWS.elb(@config['region']).set_load_balancer_policies_of_listener(listener_policy)
475
+ end
476
+ end
477
+ else
478
+ @targetgroups.each_pair { |tg_name, tg|
479
+ MU::Cloud::AWS.elb2(@config['region']).modify_target_group_attributes(
480
+ target_group_arn: tg.target_group_arn,
481
+ attributes: [
482
+ {
483
+ key: "stickiness.type",
484
+ value: "lb_cookie"
485
+ },
486
+ {
487
+ key: "stickiness.enabled",
488
+ value: "true"
489
+ },
490
+ {
491
+ key: "stickiness.lb_cookie.duration_seconds",
492
+ value: @config['lb_cookie_stickiness_policy']['timeout'].to_s
493
+ }
494
+ ]
495
+ )
496
+ }
497
+ end
498
+ end
499
+
500
+ if !@config['app_cookie_stickiness_policy'].nil?
501
+ if @config['classic']
502
+ MU.log "Setting application cookie stickiness policy for #{lb.dns_name}", details: @config['app_cookie_stickiness_policy']
503
+ cookie_policy = {
504
+ load_balancer_name: @mu_name,
505
+ policy_name: @config['app_cookie_stickiness_policy']['name'],
506
+ cookie_name: @config['app_cookie_stickiness_policy']['cookie']
507
+ }
508
+ MU::Cloud::AWS.elb(@config['region']).create_app_cookie_stickiness_policy(cookie_policy)
509
+ lb_policy_names = Array.new
510
+ lb_policy_names << @config['app_cookie_stickiness_policy']['name']
511
+ listener_policy = {
512
+ load_balancer_name: @mu_name,
513
+ policy_names: lb_policy_names
514
+ }
515
+ lb_options[:listeners].each do |listener|
516
+ if listener[:protocol].upcase == 'HTTP' or listener[:protocol].upcase == 'HTTPS'
517
+ listener_policy[:load_balancer_port] = listener[:load_balancer_port]
518
+ MU::Cloud::AWS.elb(@config['region']).set_load_balancer_policies_of_listener(listener_policy)
519
+ end
520
+ end
521
+ else
522
+ MU.log "App cookie stickiness not supported in ALBs. Redeploy with 'classic' set to true if you need this functionality.", MU::WARN
523
+ end
524
+ end
525
+
526
+ dnsthread.join # from genericMuDNS
527
+
528
+ if !@config['dns_records'].nil?
529
+ # XXX this should be a call to @deploy.nameKitten
530
+ @config['dns_records'].each { |dnsrec|
531
+ dnsrec['name'] = @mu_name.downcase if !dnsrec.has_key?('name')
532
+ dnsrec['name'] = "#{dnsrec['name']}.#{MU.environment.downcase}" if dnsrec["append_environment_name"] && !dnsrec['name'].match(/\.#{MU.environment.downcase}$/)
533
+ }
534
+ if !@config['classic']
535
+ # XXX should be R53ALIAS, but we get "the alias target name does not lie within the target zone"
536
+ @config['dns_records'].each { |r|
537
+ r['type'] = "CNAME"
538
+ }
539
+ end
540
+ if !MU::Cloud::AWS.isGovCloud?
541
+ MU::Cloud::AWS::DNSZone.createRecordsFromConfig(@config['dns_records'], target: cloud_desc.dns_name)
542
+ end
543
+ end
544
+
545
+ notify
546
+ end
547
+
548
+ # Canonical Amazon Resource Number for this resource
549
+ # @return [String]
550
+ def arn
551
+ if @config['classic']
552
+ "arn:"+(MU::Cloud::AWS.isGovCloud?(@config["region"]) ? "aws-us-gov" : "aws")+":elasticloadbalancing:"+@config['region']+":"+MU.account_number+":loadbalancer/"+@cloud_id
553
+ else
554
+ cloud_desc.load_balancer_arn
555
+ end
556
+ end
557
+
558
+ # Wrapper for cloud_desc method that deals with elb vs. elb2 resources.
559
+ def cloud_desc
560
+ if @config['classic']
561
+ resp = MU::Cloud::AWS.elb(@config['region']).describe_load_balancers(
562
+ load_balancer_names: [@cloud_id]
563
+ ).load_balancer_descriptions.first
564
+ return resp
565
+ else
566
+ resp = MU::Cloud::AWS.elb2(@config['region']).describe_load_balancers(
567
+ names: [@cloud_id]
568
+ ).load_balancers.first
569
+ if @targetgroups.nil? and !@deploy.nil? and
570
+ @deploy.deployment['loadbalancers'].has_key?(@config['name']) and
571
+ @deploy.deployment['loadbalancers'][@config['name']].has_key?("targetgroups")
572
+ @targetgroups = {}
573
+ @deploy.deployment['loadbalancers'][@config['name']]["targetgroups"].each_pair { |tg_name, tg_arn|
574
+ @targetgroups[tg_name] = MU::Cloud::AWS.elb2(@config['region']).describe_target_groups(target_group_arns: [tg_arn]).target_groups.first
575
+ }
576
+ end
577
+
578
+ return resp
579
+ end
580
+ end
581
+
582
+ # Return the metadata for this LoadBalancer
583
+ # @return [Hash]
584
+ def notify
585
+ deploy_struct = {
586
+ "awsname" => @mu_name,
587
+ "dns" => cloud_desc.dns_name,
588
+ "targetgroups" => {}
589
+ }
590
+ deploy_struct["arn"] = cloud_desc.load_balancer_arn if !@config['classic']
591
+ @targetgroups.each { |tgname, tg|
592
+ deploy_struct["targetgroups"][tgname] = tg.target_group_arn
593
+ }
594
+ return deploy_struct
595
+ end
596
+
597
+ # Register a Server node with an existing LoadBalancer.
598
+ #
599
+ # @param instance_id [String] A node to register.
600
+ # @param targetgroups [Array<String>] The target group(s) of which this node should be made a member. Not applicable to classic LoadBalancers. If not supplied, the node will be registered to all available target groups on this LoadBalancer.
601
+ def registerNode(instance_id, targetgroups: nil)
602
+ if @config['classic'] or !@config.has_key?("classic")
603
+ MU::Cloud::AWS.elb(@config['region']).register_instances_with_load_balancer(
604
+ load_balancer_name: @cloud_id,
605
+ instances: [
606
+ {instance_id: instance_id}
607
+ ]
608
+ )
609
+ else
610
+ if targetgroups.nil? or !targetgroups.is_a?(Array) or targetgroups.size == 0
611
+ if @targetgroups.nil?
612
+ cloud_desc
613
+ return
614
+ end
615
+ targetgroups = @targetgroups.keys
616
+ end
617
+ targetgroups.each { |tg|
618
+ MU::Cloud::AWS.elb2(@config['region']).register_targets(
619
+ target_group_arn: @targetgroups[tg].target_group_arn,
620
+ targets: [
621
+ {id: instance_id}
622
+ ]
623
+ )
624
+ }
625
+ end
626
+ end
627
+
628
+ # Remove all load balancers associated with the currently loaded deployment.
629
+ # @param noop [Boolean]: If true, will only print what would be done
630
+ # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
631
+ # @param region [String]: The cloud provider region
632
+ # @return [void]
633
+ def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, flags: {})
634
+ raise MuError, "Can't touch ELBs without MU-ID" if MU.deploy_id.nil? or MU.deploy_id.empty?
635
+
636
+ # Check for tags matching the current deploy identifier on an elb or
637
+ # elb2 resource.
638
+ # @param arn [String]: The ARN of the resource to check
639
+ # @param region [String]: The cloud provider region
640
+ # @param ignoremaster [Boolean]: Whether to ignore the MU-MASTER-IP tag
641
+ # @param classic [Boolean]: Whether to look for a classic ELB instead of an ALB (ELB2)
642
+ def self.checkForTagMatch(arn, region, ignoremaster, classic = false)
643
+ tags = []
644
+ if classic
645
+ tags = MU::Cloud::AWS.elb(region).describe_tags(
646
+ load_balancer_names: [arn]
647
+ ).tag_descriptions.first.tags
648
+ else
649
+ tags = MU::Cloud::AWS.elb2(region).describe_tags(
650
+ resource_arns: [arn]
651
+ ).tag_descriptions.first.tags
652
+ end
653
+ muid_match = false
654
+ mumaster_match = false
655
+ saw_tags = []
656
+ if !tags.nil?
657
+ tags.each { |tag|
658
+ saw_tags << tag.key
659
+ muid_match = true if tag.key == "MU-ID" and tag.value == MU.deploy_id
660
+ mumaster_match = true if tag.key == "MU-MASTER-IP" and tag.value == MU.mu_public_ip
661
+ }
662
+ end
663
+ if saw_tags.include?("MU-ID") and (saw_tags.include?("MU-MASTER-IP") or ignoremaster)
664
+ if muid_match and (mumaster_match or ignoremaster)
665
+ return true
666
+ end
667
+ end
668
+ return false
669
+ end
670
+
671
+
672
+ resp = MU::Cloud::AWS.elb(region).describe_load_balancers
673
+ resp2 = MU::Cloud::AWS.elb2(region).describe_load_balancers
674
+ (resp.load_balancer_descriptions + resp2.load_balancers).each { |lb|
675
+ classic = true
676
+ if lb.class.name != "Aws::ElasticLoadBalancing::Types::LoadBalancerDescription" and !lb.type.nil? and lb.type == "application"
677
+ classic = false
678
+ end
679
+ begin
680
+ tags = []
681
+ matched = false
682
+ if classic
683
+ matched = self.checkForTagMatch(lb.load_balancer_name, region, ignoremaster, classic)
684
+ else
685
+ matched = self.checkForTagMatch(lb.load_balancer_arn, region, ignoremaster, classic)
686
+ end
687
+ if matched
688
+ if !MU::Cloud::AWS.isGovCloud?
689
+ MU::Cloud::AWS::DNSZone.genericMuDNSEntry(name: lb.load_balancer_name, target: lb.dns_name, cloudclass: MU::Cloud::LoadBalancer, delete: true) if !noop
690
+ end
691
+ MU.log "Removing Elastic Load Balancer #{lb.load_balancer_name}"
692
+ if classic
693
+ MU::Cloud::AWS.elb(region).delete_load_balancer(load_balancer_name: lb.load_balancer_name) if !noop
694
+ else
695
+ MU::Cloud::AWS.elb2(region).describe_listeners(
696
+ load_balancer_arn: lb.load_balancer_arn
697
+ ).listeners.each { |l|
698
+ MU.log "Removing ALB Listener #{l.listener_arn}"
699
+ MU::Cloud::AWS.elb2(region).delete_listener(
700
+ listener_arn: l.listener_arn
701
+ ) if !noop
702
+ }
703
+ tgs = MU::Cloud::AWS.elb2(region).describe_target_groups.target_groups
704
+ begin
705
+ if lb.state.code == "provisioning"
706
+ MU.log "Waiting for ALB #{lb.load_balancer_name} to leave 'provisioning' state", MU::NOTICE
707
+ sleep 45
708
+ lb = MU::Cloud::AWS.elb2(region).describe_load_balancers(
709
+ load_balancer_arns: [lb.load_balancer_arn]
710
+ ).load_balancers.first
711
+ end
712
+ end while lb.state.code == "provisioning"
713
+ MU::Cloud::AWS.elb2(region).delete_load_balancer(load_balancer_arn: lb.load_balancer_arn) if !noop
714
+
715
+
716
+ tgs.each { |tg|
717
+ if self.checkForTagMatch(tg.target_group_arn, region, ignoremaster)
718
+ MU.log "Removing Load Balancer Target Group #{tg.target_group_name}"
719
+ retries = 0
720
+ begin
721
+ MU::Cloud::AWS.elb2(region).delete_target_group(target_group_arn: tg.target_group_arn) if !noop
722
+ rescue Aws::ElasticLoadBalancingV2::Errors::ResourceInUse => e
723
+ if retries < 6
724
+ retries = retries + 1
725
+ sleep 10
726
+ retry
727
+ else
728
+ MU.log "Failed to delete ALB targetgroup #{tg.target_group_arn}: #{e.message}", MU::WARN
729
+ end
730
+ end
731
+ end
732
+ }
733
+ end
734
+ next
735
+ end
736
+ rescue Aws::ElasticLoadBalancing::Errors::LoadBalancerNotFound, Aws::ElasticLoadBalancingV2::Errors::LoadBalancerNotFound
737
+ MU.log "ELB #{lb.load_balancer_name} already deleted", MU::WARN
738
+ end
739
+ }
740
+ return nil
741
+ end
742
+
743
+ # Cloud-specific configuration properties.
744
+ # @param config [MU::Config]: The calling MU::Config object
745
+ # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
746
+ def self.schema(config)
747
+ toplevel_required = []
748
+ schema = {
749
+ "targetgroups" => {
750
+ "items" => {
751
+ "properties" => {
752
+ "proto" => {
753
+ "type" => "string",
754
+ "enum" => ["HTTP", "HTTPS", "TCP", "SSL"],
755
+ }
756
+ }
757
+ }
758
+ },
759
+ "ingress_rules" => {
760
+ "items" => {
761
+ "properties" => {
762
+ "sgs" => {
763
+ "type" => "array",
764
+ "items" => {
765
+ "description" => "Other AWS Security Groups; resources that are associated with this group will have this rule applied to their traffic",
766
+ "type" => "string"
767
+ }
768
+ },
769
+ "lbs" => {
770
+ "type" => "array",
771
+ "items" => {
772
+ "description" => "AWS Load Balancers which will have this rule applied to their traffic",
773
+ "type" => "string"
774
+ }
775
+ }
776
+ }
777
+ }
778
+ }
779
+ }
780
+ [toplevel_required, schema]
781
+ end
782
+
783
+ # Cloud-specific pre-processing of {MU::Config::BasketofKittens::loadbalancers}, bare and unvalidated.
784
+ # @param lb [Hash]: The resource to process and validate
785
+ # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
786
+ # @return [Boolean]: True if validation succeeded, False otherwise
787
+ def self.validateConfig(lb, configurator)
788
+ ok = true
789
+
790
+ # XXX what about raw targetgroup ssl declarations?
791
+ lb['listeners'].each { |listener|
792
+ if (!listener["ssl_certificate_name"].nil? and !listener["ssl_certificate_name"].empty?) or
793
+ (!listener["ssl_certificate_id"].nil? and !listener["ssl_certificate_id"].empty?)
794
+ if lb['cloud'] != "CloudFormation" # XXX or maybe do this anyway?
795
+ begin
796
+ listener["ssl_certificate_id"] = MU::Cloud::AWS.findSSLCertificate(name: listener["ssl_certificate_name"].to_s, id: listener["ssl_certificate_id"].to_s, region: lb['region'])
797
+ rescue MuError => e
798
+ ok = false
799
+ next
800
+ end
801
+ MU.log "Using SSL cert #{listener["ssl_certificate_id"]} on port #{listener['lb_port']} in ELB #{lb['name']}"
802
+ end
803
+ end
804
+ }
805
+
806
+ # if lb["alarms"] && !lb["alarms"].empty?
807
+ # lb["alarms"].each { |alarm|
808
+ # alarm["name"] = "lb-#{lb["name"]}-#{alarm["name"]}"
809
+ # alarm['dimensions'] = [] if !alarm['dimensions']
810
+ # alarm['dimensions'] << { "name" => lb["name"], "cloud_class" => "LoadBalancerName" }
811
+ # alarm["namespace"] = "AWS/ELB" if alarm["namespace"].nil?
812
+ # alarm['cloud'] = lb['cloud']
813
+ # alarms << alarm.dup
814
+ # }
815
+ # end
816
+
817
+ if !lb["classic"]
818
+ if lb["vpc"].nil?
819
+ MU.log "LoadBalancer #{lb['name']} has no VPC configured. Either set 'classic' to true or configure a VPC.", MU::ERR
820
+ ok = false
821
+ end
822
+ else
823
+ lb.delete("targetgroups")
824
+ end
825
+
826
+ ok
827
+ end
828
+
829
+ # Locate an existing LoadBalancer or LoadBalancers and return an array containing matching AWS resource descriptors for those that match.
830
+ # @param cloud_id [String]: The cloud provider's identifier for this resource.
831
+ # @param region [String]: The cloud provider region
832
+ # @param tag_key [String]: A tag key to search.
833
+ # @param tag_value [String]: The value of the tag specified by tag_key to match when searching by tag.
834
+ # @param flags [Hash]: Optional flags
835
+ # @return [Array<Hash<String,OpenStruct>>]: The cloud provider's complete descriptions of matching LoadBalancers
836
+ def self.find(cloud_id: nil, region: MU.curRegion, tag_key: "Name", tag_value: nil, flags: {})
837
+ classic = flags['classic'] ? true : false
838
+
839
+ matches = {}
840
+ list = {}
841
+ arn2name = {}
842
+ resp = nil
843
+ if classic
844
+ resp = MU::Cloud::AWS.elb(region).describe_load_balancers().load_balancer_descriptions
845
+ else
846
+ resp = MU::Cloud::AWS.elb2(region).describe_load_balancers().load_balancers
847
+ end
848
+
849
+ resp.each { |lb|
850
+ list[lb.load_balancer_name] = lb
851
+ arn2name[lb.load_balancer_arn] = lb.load_balancer_name if !classic
852
+ if !cloud_id.nil? and lb.load_balancer_name == cloud_id
853
+ matches[cloud_id] = lb
854
+ end
855
+ }
856
+
857
+ return matches if matches.size > 0
858
+
859
+ if !tag_key.nil? and !tag_value.nil? and !tag_key.empty? and list.size > 0
860
+ tag_descriptions = nil
861
+ if classic
862
+ tag_descriptions = MU::Cloud::AWS.elb(region).describe_tags(
863
+ load_balancer_names: list.keys
864
+ ).tag_descriptions
865
+ else
866
+ tag_descriptions = MU::Cloud::AWS.elb2(region).describe_tags(
867
+ resource_arns: list.values.map { |l| l.load_balancer_arn }
868
+ ).tag_descriptions
869
+ end
870
+ if !resp.nil?
871
+ tag_descriptions.each { |lb|
872
+ lb_name = classic ? lb.load_balancer_name : arn2name[lb.resource_arn]
873
+ lb.tags.each { |tag|
874
+ if tag.key == tag_key and tag.value == tag_value
875
+ matches[lb_name] = list[lb_name]
876
+ end
877
+ }
878
+ }
879
+ end
880
+ end
881
+
882
+ return matches
883
+
884
+ end
885
+ end
886
+ end
887
+ end
888
+ end