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,890 @@
1
+ # Copyright:: Copyright (c) 2017 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 Google
18
+
19
+ # Creation of Virtual Private Clouds and associated artifacts (routes, subnets, etc).
20
+ class VPC < MU::Cloud::VPC
21
+
22
+ @deploy = nil
23
+ @config = nil
24
+ attr_reader :mu_name
25
+ attr_reader :cloud_id
26
+ attr_reader :url
27
+ attr_reader :config
28
+
29
+ # @param mommacat [MU::MommaCat]: A {MU::Mommacat} object containing the deploy of which this resource is/will be a member.
30
+ # @param kitten_cfg [Hash]: The fully parsed and resolved {MU::Config} resource descriptor as defined in {MU::Config::BasketofKittens::vpcs}
31
+ def initialize(mommacat: nil, kitten_cfg: nil, mu_name: nil, cloud_id: nil)
32
+ @deploy = mommacat
33
+ @config = MU::Config.manxify(kitten_cfg)
34
+ @subnets = []
35
+ @subnetcachesemaphore = Mutex.new
36
+ if cloud_id and cloud_id.match(/^https:\/\//)
37
+ @url = cloud_id.clone
38
+ @cloud_id = cloud_id.to_s.gsub(/.*?\//, "")
39
+ elsif cloud_id and !cloud_id.empty?
40
+ @cloud_id = cloud_id.to_s
41
+ end
42
+
43
+ if !mu_name.nil?
44
+ @mu_name = mu_name
45
+ if @cloud_id.nil? or @cloud_id.empty?
46
+ @cloud_id = MU::Cloud::Google.nameStr(@mu_name)
47
+ end
48
+ loadSubnets
49
+ elsif @config['scrub_mu_isms']
50
+ @mu_name = @config['name']
51
+ else
52
+ @mu_name = @deploy.getResourceName(@config['name'])
53
+ end
54
+
55
+ end
56
+
57
+ # Called automatically by {MU::Deploy#createResources}
58
+ def create
59
+ networkobj = MU::Cloud::Google.compute(:Network).new(
60
+ name: MU::Cloud::Google.nameStr(@mu_name),
61
+ description: @deploy.deploy_id,
62
+ auto_create_subnetworks: false
63
+ # i_pv4_range: @config['ip_block']
64
+ )
65
+ MU.log "Creating network #{@mu_name} (#{@config['ip_block']}) in project #{@config['project']}", details: networkobj
66
+ resp = MU::Cloud::Google.compute.insert_network(@config['project'], networkobj)
67
+ @url = resp.self_link # XXX needs to go in notify
68
+ @cloud_id = resp.name
69
+
70
+ if @config['subnets']
71
+ subnetthreads = []
72
+ parent_thread_id = Thread.current.object_id
73
+ @config['subnets'].each { |subnet|
74
+ subnetthreads << Thread.new {
75
+ MU.dupGlobals(parent_thread_id)
76
+ subnet_name = @config['name']+"-"+subnet['name']
77
+ subnet_mu_name = MU::Cloud::Google.nameStr(@deploy.getResourceName(subnet_name))
78
+ MU.log "Creating subnetwork #{subnet_mu_name} (#{subnet['ip_block']}) in project #{@config['project']}", details: subnet
79
+ subnetobj = MU::Cloud::Google.compute(:Subnetwork).new(
80
+ name: subnet_mu_name,
81
+ description: @deploy.deploy_id,
82
+ ip_cidr_range: subnet['ip_block'],
83
+ network: @url,
84
+ region: subnet['availability_zone']
85
+ )
86
+ resp = MU::Cloud::Google.compute.insert_subnetwork(@config['project'], subnet['availability_zone'], subnetobj)
87
+
88
+ }
89
+ }
90
+ subnetthreads.each do |t|
91
+ t.join
92
+ end
93
+ end
94
+
95
+ route_table_ids = []
96
+ if !@config['route_tables'].nil?
97
+ @config['route_tables'].each { |rtb|
98
+ rtb['routes'].each { |route|
99
+ # GCP does these for us, by default
100
+ next if route['destination_network'] == "0.0.0.0/0" and
101
+ route['gateway'] == "#INTERNET"
102
+ # sibling NAT host routes will get set up our groom phrase
103
+ next if route['gateway'] == "#NAT" and !route['nat_host_name'].nil?
104
+ createRoute(route, network: @url)
105
+ }
106
+ }
107
+ end
108
+ end
109
+
110
+ # Configure IP traffic logging on a given VPC/Subnet. Logs are saved in cloudwatch based on the network interface ID of each instance.
111
+ # @param log_group_name [String]: The name of the CloudWatch log group all logs will be saved in.
112
+ # @param resource_id [String]: The cloud provider's identifier of the resource that traffic logging will be enabled on.
113
+ # @param resource_type [String]: What resource type to enable logging on (VPC or Subnet).
114
+ # @param traffic_type [String]: What traffic to log (ALL, ACCEPT or REJECT).
115
+ def trafficLogging(log_group_name: nil, resource_id: nil, resource_type: "VPC", traffic_type: "ALL")
116
+ end
117
+
118
+ # Describe this VPC
119
+ # @return [Hash]
120
+ def notify
121
+ base = MU.structToHash(cloud_desc)
122
+ base["cloud_id"] = @cloud_id
123
+ base.merge!(@config.to_h)
124
+ base
125
+ end
126
+
127
+ # Describe this VPC from the cloud platform's perspective
128
+ # @return [Hash]
129
+ def cloud_desc
130
+ @config['project'] ||= MU::Cloud::Google.defaultProject
131
+
132
+ resp = MU::Cloud::Google.compute.get_network(@config['project'], @cloud_id)
133
+ if @cloud_id.nil? or @cloud_id == ""
134
+ MU.log "Couldn't describe #{self}, @cloud_id #{@cloud_id.nil? ? "undefined" : "empty" }", MU::ERR
135
+ return nil
136
+ end
137
+
138
+ resp = resp.to_h
139
+ @url ||= resp[:self_link]
140
+ routes = MU::Cloud::Google.compute.list_routes(
141
+ @config['project'],
142
+ filter: "network eq #{@cloud_id}"
143
+ ).items
144
+ resp[:routes] = routes.map { |r| r.to_h } if routes
145
+ # XXX subnets too
146
+
147
+ resp
148
+ end
149
+
150
+ # Called automatically by {MU::Deploy#createResources}
151
+ def groom
152
+ rtb = @config['route_tables'].first
153
+
154
+ rtb['routes'].each { |route|
155
+ # If we had a sibling server being spun up as a NAT, rig up the
156
+ # route that the hosts behind it will need.
157
+ if route['gateway'] == "#NAT" and !route['nat_host_name'].nil?
158
+ createRoute(route, network: @url)
159
+ end
160
+ }
161
+
162
+ if !@config['peers'].nil?
163
+ count = 0
164
+ @config['peers'].each { |peer|
165
+ tag_key, tag_value = peer['vpc']['tag'].split(/=/, 2) if !peer['vpc']['tag'].nil?
166
+ if peer['vpc']['deploy_id'].nil? and peer['vpc']['vpc_id'].nil? and tag_key.nil?
167
+ peer['vpc']['deploy_id'] = @deploy.deploy_id
168
+ end
169
+
170
+ peer_obj = MU::MommaCat.findStray(
171
+ "Google",
172
+ "vpcs",
173
+ deploy_id: peer['vpc']['deploy_id'],
174
+ cloud_id: peer['vpc']['vpc_id'],
175
+ name: peer['vpc']['vpc_name'],
176
+ tag_key: tag_key,
177
+ tag_value: tag_value,
178
+ dummy_ok: true
179
+ )
180
+
181
+ raise MuError, "No result looking for #{@mu_name}'s peer VPCs (#{peer['vpc']})" if peer_obj.nil? or peer_obj.first.nil?
182
+
183
+ url = peer_obj.first.cloudobj.url || peer_obj.first.cloudobj.deploydata['self_link']
184
+ peerreq = MU::Cloud::Google.compute(:NetworksAddPeeringRequest).new(
185
+ name: MU::Cloud::Google.nameStr(@mu_name+"-peer-"+count.to_s),
186
+ auto_create_routes: true,
187
+ peer_network: url
188
+ )
189
+
190
+ MU.log "Peering #{@mu_name} with #{url}", details: peerreq
191
+ MU::Cloud::Google.compute.add_network_peering(
192
+ @config['project'],
193
+ @cloud_id,
194
+ peerreq
195
+ )
196
+
197
+ }
198
+ end
199
+ end
200
+
201
+ # Locate an existing VPC or VPCs and return an array containing matching Google cloud resource descriptors for those that match.
202
+ # @param cloud_id [String]: The cloud provider's identifier for this resource.
203
+ # @param region [String]: The cloud provider region
204
+ # @param tag_key [String]: A tag key to search.
205
+ # @param tag_value [String]: The value of the tag specified by tag_key to match when searching by tag.
206
+ # @return [Array<Hash<String,OpenStruct>>]: The cloud provider's complete descriptions of matching VPCs
207
+ def self.find(cloud_id: nil, region: MU.curRegion, tag_key: "Name", tag_value: nil, flags: {})
208
+ flags["project"] ||= MU::Cloud::Google.defaultProject
209
+ #MU.log "CALLED MU::Cloud::Google::VPC.find(#{cloud_id}, #{region}, #{tag_key}, #{tag_value}) from #{caller[0]}", MU::NOTICE, details: flags
210
+
211
+ resp = {}
212
+ if cloud_id
213
+ vpc = MU::Cloud::Google.compute.get_network(
214
+ flags['project'],
215
+ cloud_id.to_s.sub(/^.*?\/([^\/]+)$/, '\1')
216
+ )
217
+ resp[cloud_id] = vpc if !vpc.nil?
218
+ else # XXX other criteria
219
+ MU::Cloud::Google.compute.list_networks(
220
+ flags["project"]
221
+ ).items.each { |vpc|
222
+ resp[vpc.name] = vpc
223
+ }
224
+ end
225
+ #MU.log "THINGY", MU::WARN, details: resp
226
+ resp.each_pair { |cloud_id, vpc|
227
+ routes = MU::Cloud::Google.compute.list_routes(
228
+ flags["project"],
229
+ filter: "network eq #{vpc.self_link}"
230
+ ).items
231
+ # pp routes
232
+ }
233
+ #MU.log "RETURNING RESPONSE FROM VPC FIND (#{resp.class.name})", MU::WARN, details: resp
234
+ resp
235
+ end
236
+
237
+ # Return an array of MU::Cloud::Google::VPC::Subnet objects describe the
238
+ # member subnets of this VPC.
239
+ #
240
+ # @return [Array<MU::Cloud::Google::VPC::Subnet>]
241
+ def subnets
242
+ if @subnets.nil? or @subnets.size == 0
243
+ return loadSubnets
244
+ end
245
+ return @subnets
246
+ end
247
+
248
+ # Describe subnets associated with this VPC. We'll compose identifying
249
+ # information similar to what MU::Cloud.describe builds for first-class
250
+ # resources.
251
+ # @return [Array<Hash>]: A list of cloud provider identifiers of subnets associated with this VPC.
252
+ def loadSubnets
253
+ network = cloud_desc
254
+ if network.nil?
255
+ MU.log "Unabled to load cloud description in #{self}", MU::ERR
256
+ return nil
257
+ end
258
+ found = []
259
+
260
+ resp = nil
261
+ MU::Cloud::Google.listRegions(@config['us_only']).each { |r|
262
+ resp = MU::Cloud::Google.compute.list_subnetworks(
263
+ @config['project'],
264
+ r,
265
+ filter: "network eq #{network[:self_link]}"
266
+ )
267
+ next if resp.nil? or resp.items.nil?
268
+ resp.items.each { |subnet|
269
+ found << subnet
270
+ }
271
+ }
272
+
273
+ @subnetcachesemaphore.synchronize {
274
+ @subnets ||= []
275
+ ext_ids = @subnets.each.collect { |s| s.cloud_id }
276
+
277
+ # If we're a plain old Mu resource, load our config and deployment
278
+ # metadata. Like ya do.
279
+ if !@config.nil? and @config.has_key?("subnets")
280
+ @config['subnets'].each { |subnet|
281
+ subnet['mu_name'] = @mu_name+"-"+subnet['name'] if !subnet.has_key?("mu_name")
282
+ subnet['region'] = @config['region']
283
+ found.each { |desc|
284
+ if desc.ip_cidr_range == subnet["ip_block"]
285
+ subnet["cloud_id"] = desc.name
286
+ subnet["url"] = desc.self_link
287
+ subnet['az'] = desc.region.gsub(/.*?\//, "")
288
+ break
289
+ end
290
+ }
291
+
292
+
293
+ if !ext_ids.include?(subnet["cloud_id"])
294
+ @subnets << MU::Cloud::Google::VPC::Subnet.new(self, subnet)
295
+ end
296
+ }
297
+
298
+ # Of course we might be loading up a dummy subnet object from a
299
+ # foreign or non-Mu-created VPC and subnet. So make something up.
300
+ elsif !found.nil?
301
+ found.each { |desc|
302
+ subnet = {}
303
+ subnet["ip_block"] = desc.ip_cidr_range
304
+ subnet["name"] = subnet["ip_block"].gsub(/[\.\/]/, "_")
305
+ subnet['mu_name'] = @mu_name+"-"+subnet['name']
306
+ subnet["cloud_id"] = desc.name
307
+ subnet['az'] = subnet['region'] = desc.region.gsub(/.*?\//, "")
308
+ if !ext_ids.include?(desc.name)
309
+ @subnets << MU::Cloud::Google::VPC::Subnet.new(self, subnet)
310
+ end
311
+ }
312
+ end
313
+
314
+ }
315
+ return @subnets
316
+
317
+ end
318
+
319
+ # Given some search criteria try locating a NAT Gaateway in this VPC.
320
+ # @param nat_cloud_id [String]: The cloud provider's identifier for this NAT.
321
+ # @param nat_filter_key [String]: A cloud provider filter to help identify the resource, used in conjunction with nat_filter_value.
322
+ # @param nat_filter_value [String]: A cloud provider filter to help identify the resource, used in conjunction with nat_filter_key.
323
+ # @param region [String]: The cloud provider region of the target instance.
324
+ def findNat(nat_cloud_id: nil, nat_filter_key: nil, nat_filter_value: nil, region: MU.curRegion)
325
+ end
326
+
327
+ # Given some search criteria for a {MU::Cloud::Server}, see if we can
328
+ # locate a NAT host in this VPC.
329
+ # @param nat_name [String]: The name of the resource as defined in its 'name' Basket of Kittens field, typically used in conjunction with deploy_id.
330
+ # @param nat_cloud_id [String]: The cloud provider's identifier for this NAT.
331
+ # @param nat_tag_key [String]: A cloud provider tag to help identify the resource, used in conjunction with tag_value.
332
+ # @param nat_tag_value [String]: A cloud provider tag to help identify the resource, used in conjunction with tag_key.
333
+ # @param nat_ip [String]: An IP address associated with the NAT instance.
334
+ def findBastion(nat_name: nil, nat_cloud_id: nil, nat_tag_key: nil, nat_tag_value: nil, nat_ip: nil)
335
+ nat = nil
336
+ deploy_id = nil
337
+ nat_name = nat_name.to_s if !nat_name.nil? and nat_name.class.to_s == "MU::Config::Tail"
338
+ nat_ip = nat_ip.to_s if !nat_ip.nil? and nat_ip.class.to_s == "MU::Config::Tail"
339
+ nat_cloud_id = nat_cloud_id.to_s if !nat_cloud_id.nil? and nat_cloud_id.class.to_s == "MU::Config::Tail"
340
+ nat_tag_key = nat_tag_key.to_s if !nat_tag_key.nil? and nat_tag_key.class.to_s == "MU::Config::Tail"
341
+ nat_tag_value = nat_tag_value.to_s if !nat_tag_value.nil? and nat_tag_value.class.to_s == "MU::Config::Tail"
342
+ # If we're searching by name, assume it's part of this here deploy.
343
+ if nat_cloud_id.nil? and !@deploy.nil?
344
+ deploy_id = @deploy.deploy_id
345
+ end
346
+ found = MU::MommaCat.findStray(
347
+ "Google",
348
+ "server",
349
+ name: nat_name,
350
+ cloud_id: nat_cloud_id,
351
+ deploy_id: deploy_id,
352
+ tag_key: nat_tag_key,
353
+ tag_value: nat_tag_value,
354
+ allow_multi: true,
355
+ dummy_ok: true,
356
+ calling_deploy: @deploy
357
+ )
358
+ # XXX wat
359
+ return nil if found.nil? || found.empty?
360
+ if found.size > 1
361
+ found.each { |nat|
362
+ # Try some cloud-specific criteria
363
+ cloud_desc = nat.cloud_desc
364
+ if !nat_host_ip.nil? and
365
+ # XXX this is AWS code, is wrong here
366
+ (cloud_desc.private_ip_address == nat_host_ip or cloud_desc.public_ip_address == nat_host_ip)
367
+ return nat
368
+ elsif cloud_desc.vpc_id == @cloud_id
369
+ # XXX Strictly speaking we could have different NATs in different
370
+ # subnets, so this can be wrong in corner cases. Why you'd
371
+ # architect something that obnoxiously, I have no idea.
372
+ return nat
373
+ end
374
+ }
375
+ elsif found.size == 1
376
+ return found.first
377
+ end
378
+ return nil
379
+ end
380
+
381
+ # Check for a subnet in this VPC matching one or more of the specified
382
+ # criteria, and return it if found.
383
+ def getSubnet(cloud_id: nil, name: nil, tag_key: nil, tag_value: nil, ip_block: nil)
384
+ loadSubnets
385
+ if !cloud_id.nil? and cloud_id.match(/^https:\/\//)
386
+ cloud_id.gsub!(/.*?\//, "")
387
+ end
388
+ MU.log "getSubnet(cloud_id: #{cloud_id}, name: #{name}, tag_key: #{tag_key}, tag_value: #{tag_value}, ip_block: #{ip_block})", MU::DEBUG, details: caller[0]
389
+
390
+ @subnets.each { |subnet|
391
+ if !cloud_id.nil? and !subnet.cloud_id.nil? and subnet.cloud_id.to_s == cloud_id.to_s
392
+ return subnet
393
+ elsif !name.nil? and !subnet.name.nil? and subnet.name.to_s == name.to_s
394
+ return subnet
395
+ end
396
+ }
397
+ return nil
398
+ end
399
+
400
+ # Get the subnets associated with an instance.
401
+ # @param instance_id [String]: The cloud identifier of the instance
402
+ # @param instance [String]: A cloud descriptor for the instance, to save us an API call if we already have it
403
+ # @param region [String]: The cloud provider region of the target instance
404
+ # @return [Array<String>]
405
+ def self.getInstanceSubnets(instance_id: nil, instance: nil, region: MU.curRegion)
406
+ end
407
+
408
+ @route_cache = {}
409
+ @rtb_cache = {}
410
+ @rtb_cache_semaphore = Mutex.new
411
+ # Check whether we (the Mu Master) have a direct route to a particular
412
+ # instance. Useful for skipping hops through bastion hosts to get
413
+ # directly at child nodes in peered VPCs, the public internet, and the
414
+ # like.
415
+ # @param target_instance [OpenStruct]: The cloud descriptor of the instance to check.
416
+ # @param region [String]: The cloud provider region of the target subnet.
417
+ # @return [Boolean]
418
+ def self.haveRouteToInstance?(target_instance, region: MU.curRegion)
419
+ project ||= MU::Cloud::Google.defaultProject
420
+ return false if MU.myCloud != "Google"
421
+ # XXX see if we reside in the same Network and overlap subnets
422
+ # XXX see if we peer with the target's Network
423
+ target_instance.network_interfaces.each { |iface|
424
+ resp = MU::Cloud::Google.compute.list_routes(
425
+ project,
426
+ filter: "network eq #{iface.network}"
427
+ )
428
+
429
+ if resp and resp.items
430
+ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
431
+ end
432
+ }
433
+ false
434
+ end
435
+
436
+ # updates the route table cache (@rtb_cache).
437
+ # @param subnet_key [String]: The subnet/subnets route tables will be extracted from.
438
+ # @param use_cache [Boolean]: If to use the existing cache and add records to cache only if missing, or to also replace exising records in cache.
439
+ # @param region [String]: The cloud provider region of the target subnet.
440
+ def self.update_route_tables_cache(subnet_key, use_cache: true, region: MU.curRegion)
441
+ end
442
+
443
+ # Checks if the MU master has a route to a subnet in a peered VPC. Can be used on any subnets
444
+ # @param source_subnets_key [String]: The subnet/subnets on one side of the peered VPC.
445
+ # @param target_subnets_key [String]: The subnet/subnets on the other side of the peered VPC.
446
+ # @param instance_id [String]: The instance ID in the target subnet/subnets.
447
+ # @return [Boolean]
448
+ def self.have_route_peered_vpc?(source_subnets_key, target_subnets_key, instance_id)
449
+ end
450
+
451
+ # Retrieves the route tables of used by subnets
452
+ # @param subnet_ids [Array]: The cloud identifier of the subnets to retrieve the route tables for.
453
+ # @param vpc_ids [Array]: The cloud identifier of the VPCs to retrieve route tables for.
454
+ # @param region [String]: The cloud provider region of the target subnet.
455
+ # @return [Array<OpenStruct>]: The cloud provider's complete descriptions of the route tables
456
+ def self.get_route_tables(subnet_ids: [], vpc_ids: [], region: MU.curRegion)
457
+ end
458
+
459
+ # Remove all VPC resources associated with the currently loaded deployment.
460
+ # @param noop [Boolean]: If true, will only print what would be done
461
+ # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
462
+ # @param region [String]: The cloud provider region
463
+ # @return [void]
464
+ def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, flags: {})
465
+ flags["project"] ||= MU::Cloud::Google.defaultProject
466
+
467
+ purge_subnets(noop, project: flags['project'])
468
+ ["route", "network"].each { |type|
469
+ # XXX tagged routes aren't showing up in list, and the networks that own them
470
+ # fail to delete silently
471
+ MU::Cloud::Google.compute.delete(
472
+ type,
473
+ flags["project"],
474
+ nil,
475
+ noop
476
+ )
477
+ }
478
+ end
479
+
480
+ # Cloud-specific configuration properties.
481
+ # @param config [MU::Config]: The calling MU::Config object
482
+ # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
483
+ def self.schema(config)
484
+ toplevel_required = []
485
+ schema = {
486
+ "regions" => {
487
+ "type" => "array",
488
+ "items" => MU::Config.region_primitive
489
+ },
490
+ "project" => {
491
+ "type" => "string",
492
+ "description" => "The project into which to deploy resources"
493
+ }
494
+ }
495
+ [toplevel_required, schema]
496
+ end
497
+
498
+
499
+ # Cloud-specific pre-processing of {MU::Config::BasketofKittens::vpcs}, bare and unvalidated.
500
+ # @param vpc [Hash]: The resource to process and validate
501
+ # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
502
+ # @return [Boolean]: True if validation succeeded, False otherwise
503
+ def self.validateConfig(vpc, configurator)
504
+ ok = true
505
+
506
+ if vpc['create_standard_subnets']
507
+ # Manufacture some generic routes, if applicable.
508
+ if !vpc['route_tables'] or vpc['route_tables'].empty?
509
+ vpc['route_tables'] = [
510
+ {
511
+ "name" => "internet",
512
+ "routes" => [ { "destination_network" => "0.0.0.0/0", "gateway" => "#INTERNET" } ]
513
+ },
514
+ {
515
+ "name" => "private",
516
+ "routes" => [ { "destination_network" => "0.0.0.0/0", "gateway" => "#NAT" } ]
517
+ }
518
+ ]
519
+ end
520
+
521
+ # Generate a set of subnets per route, if none are declared
522
+ if !vpc['subnets'] or vpc['subnets'].empty?
523
+ if vpc['regions'].nil? or vpc['regions'].empty?
524
+ vpc['regions'] = MU::Cloud::Google.listRegions(vpc['us_only'])
525
+ end
526
+ blocks = configurator.divideNetwork(vpc['ip_block'], vpc['regions'].size*vpc['route_tables'].size, 29)
527
+ ok = false if blocks.nil?
528
+
529
+ vpc["subnets"] = []
530
+ vpc['route_tables'].each { |t|
531
+ count = 0
532
+ vpc['regions'].each { |r|
533
+ block = blocks.shift
534
+ vpc["subnets"] << {
535
+ "availability_zone" => r,
536
+ "route_table" => t["name"],
537
+ "ip_block" => block.to_s,
538
+ "name" => "Subnet"+count.to_s+t["name"].capitalize,
539
+ "map_public_ips" => true
540
+ }
541
+ count = count + 1
542
+ }
543
+ }
544
+ end
545
+ end
546
+
547
+ # Google VPCs can't have routes that are anything other than global
548
+ # (they can be tied to individual instances by tags, but w/e). So we
549
+ # decompose our VPCs into littler VPCs, one for each declared route
550
+ # table, so that the routes therein will only apply to the portion of
551
+ # our network we want them to.
552
+ if vpc['route_tables'].size > 1
553
+ blocks = configurator.divideNetwork(vpc['ip_block'], vpc['route_tables'].size*2, 29)
554
+ peernames = []
555
+ vpc['route_tables'].each { |tbl|
556
+ peernames << vpc['name']+"-"+tbl['name']
557
+ }
558
+ vpc['route_tables'].each { |tbl|
559
+ newvpc = {
560
+ "name" => vpc['name']+"-"+tbl['name'],
561
+ "ip_block" => blocks.shift,
562
+ "route_tables" => [tbl],
563
+ "parent_block" => vpc['ip_block'],
564
+ "subnets" => []
565
+ }
566
+ MU.log "Splitting VPC #{newvpc['name']} off from #{vpc['name']}", MU::NOTICE
567
+
568
+ vpc.each_pair { |key, val|
569
+ next if ["name", "route_tables", "subnets", "ip_block"].include?(key)
570
+ newvpc[key] = val
571
+ }
572
+ newvpc['peers'] ||= []
573
+ peernames.each { |peer|
574
+ if peer != vpc['name']+"-"+tbl['name']
575
+ newvpc['peers'] << { "vpc" => { "vpc_name" => peer } }
576
+ end
577
+ }
578
+ vpc["subnets"].each { |subnet|
579
+ newvpc["subnets"] << subnet if subnet["route_table"] == tbl["name"]
580
+ }
581
+ ok = false if !configurator.insertKitten(newvpc, "vpcs", true)
582
+ }
583
+ configurator.removeKitten(vpc['name'], "vpcs")
584
+ else
585
+ has_nat = vpc['route_tables'].first["routes"].include?({"gateway"=>"#NAT", "destination_network"=>"0.0.0.0/0"})
586
+ has_deny = vpc['route_tables'].first["routes"].include?({"gateway"=>"#DENY", "destination_network"=>"0.0.0.0/0"})
587
+ # XXX we need routes to peered Networks too
588
+
589
+ if has_nat or has_deny
590
+ ok = false if !genStandardSubnetACLs(vpc['parent_block'] || vpc['ip_block'], vpc['name'], configurator, vpc["project"], false)
591
+ else
592
+ ok = false if !genStandardSubnetACLs(vpc['parent_block'] || vpc['ip_block'], vpc['name'], configurator, vpc["project"])
593
+ end
594
+ if has_nat and !has_deny
595
+ vpc['route_tables'].first["routes"] << {
596
+ "gateway"=>"#DENY",
597
+ "destination_network"=>"0.0.0.0/0"
598
+ }
599
+ end
600
+ nat_count = 0
601
+ # You know what, let's just guarantee that we'll have a route from
602
+ # this master, always
603
+ # XXX this confuses machines that don't have public IPs
604
+ if !vpc['scrub_mu_isms']
605
+ # vpc['route_tables'].first["routes"] << {
606
+ # 'gateway' => "#INTERNET",
607
+ # 'destination_network' => MU.mu_public_ip+"/32"
608
+ # }
609
+ end
610
+ vpc['route_tables'].first["routes"].each { |route|
611
+ # No such thing as a NAT gateway in Google... so make an instance
612
+ # that'll do the deed.
613
+ if route['gateway'] == "#NAT"
614
+ nat_cfg = MU::Cloud::Google::Server.genericNAT
615
+ nat_cfg['name'] = vpc['name']+"-natstion-"+nat_count.to_s
616
+ # XXX ingress/egress rules?
617
+ # XXX for master too if applicable
618
+ nat_cfg["application_attributes"] = {
619
+ "nat" => {
620
+ "private_net" => vpc["parent_block"].to_s
621
+ }
622
+ }
623
+ route['nat_host_name'] = nat_cfg['name']
624
+ route['priority'] = 100
625
+ vpc["dependencies"] << {
626
+ "type" => "server",
627
+ "name" => nat_cfg['name'],
628
+ }
629
+
630
+ nat_cfg['vpc'] = {
631
+ "vpc_name" => vpc["name"],
632
+ "subnet_pref" => "any"
633
+ }
634
+ nat_count = nat_count + 1
635
+ ok = false if !configurator.insertKitten(nat_cfg, "servers", true)
636
+ end
637
+ }
638
+ end
639
+
640
+ # MU.log "GOOGLE VPC", MU::WARN, details: vpc
641
+ ok
642
+ end
643
+
644
+ # @param route [Hash]: A route description, per the Basket of Kittens schema
645
+ # @param server [MU::Cloud::Google::Server]: Instance to which this route will apply
646
+ def createRouteForInstance(route, server)
647
+ createRoute(route, network: @url, tags: [MU::Cloud::Google.nameStr(server.mu_name)])
648
+ end
649
+
650
+ private
651
+
652
+ def self.genStandardSubnetACLs(vpc_cidr, vpc_name, configurator, project, publicroute = true)
653
+ private_acl = {
654
+ "name" => vpc_name+"-routables",
655
+ "cloud" => "Google",
656
+ "project" => project,
657
+ "vpc" => { "vpc_name" => vpc_name },
658
+ "dependencies" => [ { "type" => "vpc", "name" => vpc_name } ],
659
+ "rules" => [
660
+ { "ingress" => true, "proto" => "all", "hosts" => [vpc_cidr] }
661
+ ]
662
+ }
663
+ # if publicroute
664
+ # XXX distinguish between "I have a NAT" and "I really shouldn't be
665
+ # able to talk to the world"
666
+ private_acl["rules"] << {
667
+ "egress" => true, "proto" => "all", "hosts" => ["0.0.0.0/0"]
668
+ }
669
+ # else
670
+ # private_acl["rules"] << {
671
+ # "egress" => true, "proto" => "all", "hosts" => [vpc_cidr], "weight" => 999
672
+ # }
673
+ # private_acl["rules"] << {
674
+ # "egress" => true, "proto" => "all", "hosts" => ["0.0.0.0/0"], "deny" => true
675
+ # }
676
+ # end
677
+ configurator.insertKitten(private_acl, "firewall_rules", true)
678
+ end
679
+
680
+ # Helper method for manufacturing routes. Expect to be called from
681
+ # {MU::Cloud::Google::VPC#create} or {MU::Cloud::Google::VPC#groom}.
682
+ # @param route [Hash]: A route description, per the Basket of Kittens schema
683
+ # @param network [String]: Cloud identifier of the VPC to which we're adding this route
684
+ # @param tags [Array<String>]: Instance tags to which this route applies. If empty, applies to entire VPC.
685
+ # @return [Hash]: The modified configuration that was originally passed in.
686
+ def createRoute(route, network: @url, tags: [])
687
+ routename = MU::Cloud::Google.nameStr(@mu_name+"-route-"+route['destination_network'])
688
+ if !tags.nil? and tags.size > 0
689
+ routename = MU::Cloud::Google.nameStr(routename+"-"+tags.first).slice(0,63)
690
+ end
691
+ route["priority"] ||= 999
692
+ if route['gateway'] == "#NAT"
693
+ if !route['nat_host_name'].nil? or !route['nat_host_id'].nil?
694
+ sleep 5
695
+ nat_instance = findBastion(
696
+ nat_name: route["nat_host_name"],
697
+ nat_cloud_id: route["nat_host_id"]
698
+ )
699
+ if nat_instance.nil? or nat_instance.cloud_desc.nil?
700
+ raise MuError, "Failed to find NAT host for #NAT route in #{@mu_name} (#{route})"
701
+ end
702
+
703
+ routeobj = ::Google::Apis::ComputeBeta::Route.new(
704
+ name: routename,
705
+ next_hop_instance: nat_instance.cloud_desc.self_link,
706
+ dest_range: route['destination_network'],
707
+ priority: route["priority"],
708
+ description: @deploy.deploy_id,
709
+ tags: tags,
710
+ network: network
711
+ )
712
+ end
713
+ # several other cases missing for various types of routers (raw IPs, instance ids, etc) XXX
714
+ elsif route['gateway'] == "#DENY"
715
+ resp = MU::Cloud::Google.compute.list_routes(
716
+ @config['project'],
717
+ filter: "network eq #{network}"
718
+ )
719
+
720
+ if !resp.nil? and !resp.items.nil?
721
+ resp.items.each { |r|
722
+ next if r.next_hop_gateway.nil? or !r.next_hop_gateway.match(/\/global\/gateways\/default-internet-gateway$/)
723
+ MU.log "Removing standard route #{r.name} per our #DENY entry"
724
+ MU::Cloud::Google.compute.delete_route(@config['project'], r.name)
725
+ }
726
+ end
727
+ elsif route['gateway'] == "#INTERNET"
728
+ routeobj = ::Google::Apis::ComputeBeta::Route.new(
729
+ name: routename,
730
+ next_hop_gateway: "global/gateways/default-internet-gateway",
731
+ dest_range: route['destination_network'],
732
+ priority: route["priority"],
733
+ description: @deploy.deploy_id,
734
+ tags: tags,
735
+ network: network
736
+ )
737
+ else
738
+ routeobj = ::Google::Apis::ComputeBeta::Route.new(
739
+ name: routename,
740
+ dest_range: route['destination_network'],
741
+ network: network,
742
+ priority: route["priority"],
743
+ description: @deploy.deploy_id,
744
+ tags: tags,
745
+ next_hop_network: network
746
+ )
747
+ end
748
+
749
+ if route['gateway'] != "#DENY"
750
+ begin
751
+ MU::Cloud::Google.compute.get_route(@config['project'], routename)
752
+ rescue ::Google::Apis::ClientError, MU::MuError => e
753
+ if e.message.match(/notFound/)
754
+ MU.log "Creating route #{routename} in project #{@config['project']}", details: routeobj
755
+ resp = MU::Cloud::Google.compute.insert_route(@config['project'], routeobj)
756
+ else
757
+ # TODO can't update GCP routes, would have to delete and re-create
758
+ end
759
+ end
760
+ end
761
+ end
762
+
763
+
764
+ # Remove all network gateways associated with the currently loaded deployment.
765
+ # @param noop [Boolean]: If true, will only print what would be done
766
+ # @param region [String]: The cloud provider region
767
+ # @return [void]
768
+ def self.purge_gateways(noop = false, tagfilters = [{name: "tag:MU-ID", values: [MU.deploy_id]}], region: MU.curRegion)
769
+ end
770
+
771
+ # Remove all NAT gateways associated with the VPC of the currently loaded deployment.
772
+ # @param noop [Boolean]: If true, will only print what would be done
773
+ # @param vpc_id [String]: The cloud provider's unique VPC identifier
774
+ # @param region [String]: The cloud provider region
775
+ # @return [void]
776
+ def self.purge_nat_gateways(noop = false, vpc_id: nil, region: MU.curRegion)
777
+ end
778
+
779
+ # Remove all VPC endpoints associated with the VPC of the currently loaded deployment.
780
+ # @param noop [Boolean]: If true, will only print what would be done
781
+ # @param vpc_id [String]: The cloud provider's unique VPC identifier
782
+ # @param region [String]: The cloud provider region
783
+ # @return [void]
784
+ def self.purge_endpoints(noop = false, vpc_id: nil, region: MU.curRegion)
785
+ end
786
+
787
+ # Remove all network interfaces associated with the currently loaded deployment.
788
+ # @param noop [Boolean]: If true, will only print what would be done
789
+ # @param tagfilters [Array<Hash>]: EC2 tags to filter against when search for resources to purge
790
+ # @param region [String]: The cloud provider region
791
+ # @return [void]
792
+ def self.purge_interfaces(noop = false, tagfilters = [{name: "tag:MU-ID", values: [MU.deploy_id]}], region: MU.curRegion)
793
+ end
794
+
795
+ # Remove all subnets associated with the currently loaded deployment.
796
+ # @param noop [Boolean]: If true, will only print what would be done
797
+ # @param tagfilters [Array<Hash>]: EC2 tags to filter against when search for resources to purge
798
+ # @param regions [Array<String>]: The cloud provider regions to check
799
+ # @return [void]
800
+ def self.purge_subnets(noop = false, tagfilters = [{name: "tag:MU-ID", values: [MU.deploy_id]}], regions: MU::Cloud::Google.listRegions, project: MU::Cloud::Google.defaultProject)
801
+ parent_thread_id = Thread.current.object_id
802
+ regionthreads = []
803
+ regions.each { |r|
804
+ regionthreads << Thread.new {
805
+ MU.dupGlobals(parent_thread_id)
806
+ MU::Cloud::Google.compute.delete(
807
+ "subnetwork",
808
+ project,
809
+ r,
810
+ noop
811
+ )
812
+ }
813
+ }
814
+ regionthreads.each do |t|
815
+ t.join
816
+ end
817
+ end
818
+
819
+ # Remove all DHCP options sets associated with the currently loaded
820
+ # deployment.
821
+ # @param noop [Boolean]: If true, will only print what would be done
822
+ # @param tagfilters [Array<Hash>]: EC2 tags to filter against when search for resources to purge
823
+ # @param region [String]: The cloud provider region
824
+ # @return [void]
825
+ def self.purge_dhcpopts(noop = false, tagfilters = [{name: "tag:MU-ID", values: [MU.deploy_id]}], region: MU.curRegion)
826
+ end
827
+
828
+ # Remove all VPCs associated with the currently loaded deployment.
829
+ # @param noop [Boolean]: If true, will only print what would be done
830
+ # @param tagfilters [Array<Hash>]: EC2 tags to filter against when search for resources to purge
831
+ # @param region [String]: The cloud provider region
832
+ # @return [void]
833
+ def self.purge_vpcs(noop = false, tagfilters = [{name: "tag:MU-ID", values: [MU.deploy_id]}], region: MU.curRegion)
834
+ end
835
+
836
+ protected
837
+
838
+ # Subnets are almost a first-class resource. So let's kinda sorta treat
839
+ # them like one. This should only be invoked on objects that already
840
+ # exists in the cloud layer.
841
+ class Subnet < MU::Cloud::Google::VPC
842
+
843
+ attr_reader :cloud_id
844
+ attr_reader :url
845
+ attr_reader :ip_block
846
+ attr_reader :mu_name
847
+ attr_reader :name
848
+ attr_reader :az
849
+
850
+
851
+ # @param parent [MU::Cloud::Google::VPC]: The parent VPC of this subnet.
852
+ # @param config [Hash<String>]:
853
+ def initialize(parent, config)
854
+ @parent = parent
855
+ @config = MU::Config.manxify(config)
856
+ @cloud_id = config['cloud_id']
857
+ @url = config['url']
858
+ @mu_name = config['mu_name']
859
+ @name = config['name']
860
+ @deploydata = config # This is a dummy for the sake of describe()
861
+ @az = config['az']
862
+ @ip_block = config['ip_block']
863
+ end
864
+
865
+ # Return the cloud identifier for the default route of this subnet.
866
+ def defaultRoute
867
+ end
868
+
869
+ # Is this subnet privately-routable only, or public?
870
+ # @return [Boolean]
871
+ def private?
872
+ routes = MU::Cloud::Google.compute.list_routes(
873
+ @parent.config['project'],
874
+ filter: "network eq #{@parent.url}"
875
+ ).items
876
+ routes.map { |r|
877
+ if r.dest_range == "0.0.0.0/0" and !r.next_hop_gateway.nil? and
878
+ (r.tags.nil? or r.tags.size == 0) and
879
+ r.next_hop_gateway.match(/\/global\/gateways\/default-internet-gateway/)
880
+ return false
881
+ end
882
+ }
883
+ return true
884
+ end
885
+ end
886
+
887
+ end #class
888
+ end #class
889
+ end
890
+ end #module