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.
- checksums.yaml +7 -0
- data/Berksfile +56 -0
- data/Berksfile.lock +250 -0
- data/Jenkinsfile +184 -0
- data/LICENSE.md +37 -0
- data/README.md +26 -0
- data/bin/mu-aws-setup +376 -0
- data/bin/mu-cleanup +68 -0
- data/bin/mu-configure +1133 -0
- data/bin/mu-deploy +166 -0
- data/bin/mu-firewall-allow-clients +30 -0
- data/bin/mu-gcp-setup +200 -0
- data/bin/mu-gen-docs +34 -0
- data/bin/mu-gen-env +42 -0
- data/bin/mu-load-config.rb +158 -0
- data/bin/mu-node-manage +683 -0
- data/bin/mu-self-update +228 -0
- data/bin/mu-ssh +23 -0
- data/bin/mu-tunnel-nagios +144 -0
- data/bin/mu-upload-chef-artifacts +757 -0
- data/bin/mu-user-manage +275 -0
- data/cookbooks/awscli/LICENSE +37 -0
- data/cookbooks/awscli/README.md +58 -0
- data/cookbooks/awscli/attributes/default.rb +1 -0
- data/cookbooks/awscli/libraries/instance_metadata.rb +21 -0
- data/cookbooks/awscli/metadata.rb +20 -0
- data/cookbooks/awscli/recipes/default.rb +56 -0
- data/cookbooks/awscli/templates/default/config.erb +18 -0
- data/cookbooks/mu-activedirectory/CHANGELOG.md +13 -0
- data/cookbooks/mu-activedirectory/LICENSE +37 -0
- data/cookbooks/mu-activedirectory/README.md +6 -0
- data/cookbooks/mu-activedirectory/attributes/default.rb +98 -0
- data/cookbooks/mu-activedirectory/files/default/password-auth +32 -0
- data/cookbooks/mu-activedirectory/files/default/sshd_pol.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/sshd_pol.te +32 -0
- data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.te +10 -0
- data/cookbooks/mu-activedirectory/files/default/system-auth +34 -0
- data/cookbooks/mu-activedirectory/files/default/winbindpol.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/winbindpol.te +37 -0
- data/cookbooks/mu-activedirectory/libraries/config.rb +106 -0
- data/cookbooks/mu-activedirectory/libraries/helper.rb +86 -0
- data/cookbooks/mu-activedirectory/metadata.rb +17 -0
- data/cookbooks/mu-activedirectory/providers/domain.rb +152 -0
- data/cookbooks/mu-activedirectory/providers/domain_controller.rb +89 -0
- data/cookbooks/mu-activedirectory/providers/domain_node.rb +275 -0
- data/cookbooks/mu-activedirectory/recipes/default.rb +8 -0
- data/cookbooks/mu-activedirectory/recipes/domain-controller.rb +44 -0
- data/cookbooks/mu-activedirectory/recipes/domain-node.rb +50 -0
- data/cookbooks/mu-activedirectory/recipes/domain.rb +43 -0
- data/cookbooks/mu-activedirectory/recipes/sssd.rb +185 -0
- data/cookbooks/mu-activedirectory/resources/domain.rb +25 -0
- data/cookbooks/mu-activedirectory/resources/domain_controller.rb +25 -0
- data/cookbooks/mu-activedirectory/resources/domain_node.rb +20 -0
- data/cookbooks/mu-activedirectory/templates/default/dhclient-eth0.conf.erb +4 -0
- data/cookbooks/mu-activedirectory/templates/default/interface +0 -0
- data/cookbooks/mu-activedirectory/templates/default/krb5.conf.erb +23 -0
- data/cookbooks/mu-activedirectory/templates/default/ntp.conf.erb +56 -0
- data/cookbooks/mu-activedirectory/templates/default/smb.conf.erb +33 -0
- data/cookbooks/mu-activedirectory/templates/default/sssd.conf.erb +60 -0
- data/cookbooks/mu-activedirectory/templates/windows/Backup.xml.erb +20 -0
- data/cookbooks/mu-activedirectory/templates/windows/bkupInfo.xml.erb +1 -0
- data/cookbooks/mu-activedirectory/templates/windows/gpreprt.xml.erb +198 -0
- data/cookbooks/mu-activedirectory/templates/windows/gptmpl.inf.erb +12 -0
- data/cookbooks/mu-activedirectory/templates/windows/manifest.xml.erb +1 -0
- data/cookbooks/mu-firewall/CHANGELOG.md +11 -0
- data/cookbooks/mu-firewall/LICENSE +37 -0
- data/cookbooks/mu-firewall/README.md +5 -0
- data/cookbooks/mu-firewall/attributes/default.rb +3 -0
- data/cookbooks/mu-firewall/metadata.rb +16 -0
- data/cookbooks/mu-firewall/recipes/default.rb +10 -0
- data/cookbooks/mu-glusterfs/CHANGELOG.md +13 -0
- data/cookbooks/mu-glusterfs/LICENSE +37 -0
- data/cookbooks/mu-glusterfs/README.md +5 -0
- data/cookbooks/mu-glusterfs/attributes/default.rb +34 -0
- data/cookbooks/mu-glusterfs/metadata.rb +17 -0
- data/cookbooks/mu-glusterfs/recipes/client.rb +62 -0
- data/cookbooks/mu-glusterfs/recipes/default.rb +16 -0
- data/cookbooks/mu-glusterfs/recipes/samba.rb +57 -0
- data/cookbooks/mu-glusterfs/recipes/server.rb +200 -0
- data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +71 -0
- data/cookbooks/mu-glusterfs/templates/default/smb.conf.erb +14 -0
- data/cookbooks/mu-jenkins/CHANGELOG.md +13 -0
- data/cookbooks/mu-jenkins/LICENSE +37 -0
- data/cookbooks/mu-jenkins/README.md +105 -0
- data/cookbooks/mu-jenkins/attributes/default.rb +42 -0
- data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +73 -0
- data/cookbooks/mu-jenkins/files/default/deploy_config.xml +44 -0
- data/cookbooks/mu-jenkins/metadata.rb +21 -0
- data/cookbooks/mu-jenkins/recipes/default.rb +195 -0
- data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +54 -0
- data/cookbooks/mu-jenkins/recipes/public_key.rb +24 -0
- data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +24 -0
- data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +14 -0
- data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +6 -0
- data/cookbooks/mu-master/CHANGELOG.md +13 -0
- data/cookbooks/mu-master/LICENSE +37 -0
- data/cookbooks/mu-master/README.md +6 -0
- data/cookbooks/mu-master/attributes/default.rb +95 -0
- data/cookbooks/mu-master/files/default/0-mu-log-server.conf +19 -0
- data/cookbooks/mu-master/files/default/addRSA.ldif +8 -0
- data/cookbooks/mu-master/files/default/check_mem.pl +197 -0
- data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
- data/cookbooks/mu-master/files/default/dirsrv_admin.pp +0 -0
- data/cookbooks/mu-master/files/default/dirsrv_admin.te +13 -0
- data/cookbooks/mu-master/files/default/nagios_selinux.pp +0 -0
- data/cookbooks/mu-master/files/default/nagios_selinux.te +51 -0
- data/cookbooks/mu-master/files/default/nagios_selinux_7.pp +0 -0
- data/cookbooks/mu-master/files/default/nagios_selinux_7.te +17 -0
- data/cookbooks/mu-master/files/default/pam_sshd +18 -0
- data/cookbooks/mu-master/files/default/ssl_enable.ldif +18 -0
- data/cookbooks/mu-master/files/default/syslogd_oddjobd.pp +0 -0
- data/cookbooks/mu-master/files/default/syslogd_oddjobd.te +10 -0
- data/cookbooks/mu-master/files/default/vimrc +19 -0
- data/cookbooks/mu-master/libraries/mu.rb +29 -0
- data/cookbooks/mu-master/metadata.rb +30 -0
- data/cookbooks/mu-master/providers/user.rb +41 -0
- data/cookbooks/mu-master/recipes/389ds.rb +164 -0
- data/cookbooks/mu-master/recipes/basepackages.rb +58 -0
- data/cookbooks/mu-master/recipes/caching_nameserver.rb +37 -0
- data/cookbooks/mu-master/recipes/default.rb +451 -0
- data/cookbooks/mu-master/recipes/eks-kubectl.rb +41 -0
- data/cookbooks/mu-master/recipes/firewall-holes.rb +70 -0
- data/cookbooks/mu-master/recipes/init.rb +542 -0
- data/cookbooks/mu-master/recipes/ssl-certs.rb +109 -0
- data/cookbooks/mu-master/recipes/sssd.rb +89 -0
- data/cookbooks/mu-master/recipes/update_nagios_only.rb +242 -0
- data/cookbooks/mu-master/recipes/vault.rb +111 -0
- data/cookbooks/mu-master/resources/user.rb +19 -0
- data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +28 -0
- data/cookbooks/mu-master/templates/default/chef-server.rb.erb +18 -0
- data/cookbooks/mu-master/templates/default/dhclient-eth0.conf.erb +9 -0
- data/cookbooks/mu-master/templates/default/mu-momma-cat.erb +149 -0
- data/cookbooks/mu-master/templates/default/mu.rc.erb +9 -0
- data/cookbooks/mu-master/templates/default/openssl.cnf.erb +354 -0
- data/cookbooks/mu-master/templates/default/sssd.conf.erb +44 -0
- data/cookbooks/mu-master/templates/default/web_app.conf.erb +90 -0
- data/cookbooks/mu-mongo/CHANGELOG.md +13 -0
- data/cookbooks/mu-mongo/LICENSE +37 -0
- data/cookbooks/mu-mongo/README.md +5 -0
- data/cookbooks/mu-mongo/attributes/default.rb +22 -0
- data/cookbooks/mu-mongo/files/default/keyfile +16 -0
- data/cookbooks/mu-mongo/files/default/remove_nodes.js +5 -0
- data/cookbooks/mu-mongo/metadata.rb +17 -0
- data/cookbooks/mu-mongo/recipes/default.rb +149 -0
- data/cookbooks/mu-mongo/recipes/yum-update-rule.rb +18 -0
- data/cookbooks/mu-mongo/templates/default/mongo_create_openfema_db.js.erb +2 -0
- data/cookbooks/mu-mongo/templates/default/mongo_init.js.erb +1 -0
- data/cookbooks/mu-mongo/templates/default/mongo_logrotate.erb +14 -0
- data/cookbooks/mu-mongo/templates/default/mongo_replset_addnodes.js.erb +6 -0
- data/cookbooks/mu-mongo/templates/default/replset_init.js.erb +2 -0
- data/cookbooks/mu-openvpn/CHANGELOG.md +13 -0
- data/cookbooks/mu-openvpn/LICENSE +37 -0
- data/cookbooks/mu-openvpn/README.md +6 -0
- data/cookbooks/mu-openvpn/attributes/default.rb +119 -0
- data/cookbooks/mu-openvpn/metadata.rb +18 -0
- data/cookbooks/mu-openvpn/recipes/default.rb +108 -0
- data/cookbooks/mu-openvpn/templates/default/users.json.erb +42 -0
- data/cookbooks/mu-php54/CHANGELOG.md +12 -0
- data/cookbooks/mu-php54/LICENSE +37 -0
- data/cookbooks/mu-php54/README.md +0 -0
- data/cookbooks/mu-php54/files/centos/php.ini +1802 -0
- data/cookbooks/mu-php54/files/ubuntu/php.ini +1870 -0
- data/cookbooks/mu-php54/metadata.rb +21 -0
- data/cookbooks/mu-php54/recipes/default.rb +97 -0
- data/cookbooks/mu-splunk/CHANGELOG.md +37 -0
- data/cookbooks/mu-splunk/LICENSE +37 -0
- data/cookbooks/mu-splunk/README.md +451 -0
- data/cookbooks/mu-splunk/attributes/default.rb +95 -0
- data/cookbooks/mu-splunk/attributes/upgrade.rb +49 -0
- data/cookbooks/mu-splunk/definitions/splunk_installer.rb +103 -0
- data/cookbooks/mu-splunk/files/default/splunk-nocheck +10 -0
- data/cookbooks/mu-splunk/libraries/helpers.rb +72 -0
- data/cookbooks/mu-splunk/libraries/splunk_app_provider.rb +156 -0
- data/cookbooks/mu-splunk/libraries/splunk_app_resource.rb +43 -0
- data/cookbooks/mu-splunk/metadata.json +30 -0
- data/cookbooks/mu-splunk/metadata.rb +17 -0
- data/cookbooks/mu-splunk/recipes/client.rb +143 -0
- data/cookbooks/mu-splunk/recipes/default.rb +31 -0
- data/cookbooks/mu-splunk/recipes/disabled.rb +41 -0
- data/cookbooks/mu-splunk/recipes/install_forwarder.rb +23 -0
- data/cookbooks/mu-splunk/recipes/install_server.rb +23 -0
- data/cookbooks/mu-splunk/recipes/server.rb +53 -0
- data/cookbooks/mu-splunk/recipes/service.rb +95 -0
- data/cookbooks/mu-splunk/recipes/setup_auth.rb +49 -0
- data/cookbooks/mu-splunk/recipes/setup_ssl.rb +63 -0
- data/cookbooks/mu-splunk/recipes/upgrade.rb +94 -0
- data/cookbooks/mu-splunk/recipes/user.rb +34 -0
- data/cookbooks/mu-splunk/templates/default/base_logs_unix_inputs.conf.erb +26 -0
- data/cookbooks/mu-splunk/templates/default/inputs.conf.erb +13 -0
- data/cookbooks/mu-splunk/templates/default/outputs.conf.erb +9 -0
- data/cookbooks/mu-splunk/templates/default/splunk-init.erb +74 -0
- data/cookbooks/mu-splunk/templates/default/system-web.conf.erb +7 -0
- data/cookbooks/mu-tools/CHANGELOG.md +12 -0
- data/cookbooks/mu-tools/LICENSE +37 -0
- data/cookbooks/mu-tools/README.md +188 -0
- data/cookbooks/mu-tools/attributes/default.rb +142 -0
- data/cookbooks/mu-tools/attributes/ebs_rolling_snapshots.rb +3 -0
- data/cookbooks/mu-tools/files/amazon/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/centos/CentOS-Base.repo +52 -0
- data/cookbooks/mu-tools/files/centos/etc/bashrc +93 -0
- data/cookbooks/mu-tools/files/centos/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/centos/etc/login.defs +72 -0
- data/cookbooks/mu-tools/files/centos/etc/profile +77 -0
- data/cookbooks/mu-tools/files/centos/etc/security/limits.conf +57 -0
- data/cookbooks/mu-tools/files/centos/etc/sysconfig/init +19 -0
- data/cookbooks/mu-tools/files/centos/etc/sysctl.conf +82 -0
- data/cookbooks/mu-tools/files/centos-6/README_MU +0 -0
- data/cookbooks/mu-tools/files/centos-6/etc/audit/stig.rules +173 -0
- data/cookbooks/mu-tools/files/centos-6/etc/bashrc +90 -0
- data/cookbooks/mu-tools/files/centos-6/etc/login.defs +70 -0
- data/cookbooks/mu-tools/files/centos-6/etc/pam.d/su +12 -0
- data/cookbooks/mu-tools/files/centos-6/etc/profile +83 -0
- data/cookbooks/mu-tools/files/centos-6/etc/securetty +12 -0
- data/cookbooks/mu-tools/files/centos-6/etc/sysconfig/init +30 -0
- data/cookbooks/mu-tools/files/centos-6/etc/sysctl.conf +40 -0
- data/cookbooks/mu-tools/files/default/Mu_CA.pem +34 -0
- data/cookbooks/mu-tools/files/default/PSWindowsUpdate.zip +0 -0
- data/cookbooks/mu-tools/files/default/ebs_snapshots.py +123 -0
- data/cookbooks/mu-tools/files/default/etc/BANNER +0 -0
- data/cookbooks/mu-tools/files/default/etc/BANNER-FEDERAL +19 -0
- data/cookbooks/mu-tools/files/default/gpo_no_uac.zip +0 -0
- data/cookbooks/mu-tools/files/default/mypol.pp +0 -0
- data/cookbooks/mu-tools/files/default/mypol.te +37 -0
- data/cookbooks/mu-tools/files/default/nrpe_c7.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_c7.te +31 -0
- data/cookbooks/mu-tools/files/default/nrpe_check_disk.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_check_disk.te +11 -0
- data/cookbooks/mu-tools/files/default/nrpe_disk.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_disk.te +10 -0
- data/cookbooks/mu-tools/files/default/nrpe_file.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_file.te +31 -0
- data/cookbooks/mu-tools/files/default/ntrights +0 -0
- data/cookbooks/mu-tools/files/default/serverclass.conf +18 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/app.conf +1 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/inputs.conf +13 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/app.conf +1 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/inputs.conf +8 -0
- data/cookbooks/mu-tools/files/default/sshd_pol.pp +0 -0
- data/cookbooks/mu-tools/files/default/sshd_pol.te +32 -0
- data/cookbooks/mu-tools/files/redhat/etc/bashrc +93 -0
- data/cookbooks/mu-tools/files/redhat/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/redhat/etc/login.defs +72 -0
- data/cookbooks/mu-tools/files/redhat/etc/profile +77 -0
- data/cookbooks/mu-tools/files/redhat/etc/security/limits.conf +57 -0
- data/cookbooks/mu-tools/files/redhat/etc/sysconfig/init +19 -0
- data/cookbooks/mu-tools/files/redhat/etc/sysctl.conf +82 -0
- data/cookbooks/mu-tools/files/redhat-6/README_MU +0 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/audit/stig.rules +173 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/bashrc +90 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/login.defs +70 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/pam.d/su +12 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/profile +83 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/securetty +12 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/sysconfig/init +30 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/sysctl.conf +40 -0
- data/cookbooks/mu-tools/files/redhat-7.1/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/bash.bashrc +64 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/common-session +30 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/login.defs +338 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/profile +30 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/security/limits.conf +56 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/sysctl.conf +60 -0
- data/cookbooks/mu-tools/libraries/helper.rb +292 -0
- data/cookbooks/mu-tools/metadata.rb +28 -0
- data/cookbooks/mu-tools/recipes/add_admin_ssh_keys.rb +35 -0
- data/cookbooks/mu-tools/recipes/apply_security.rb +440 -0
- data/cookbooks/mu-tools/recipes/aws_api.rb +23 -0
- data/cookbooks/mu-tools/recipes/base_repositories.rb +31 -0
- data/cookbooks/mu-tools/recipes/cisbenchmark.rb +59 -0
- data/cookbooks/mu-tools/recipes/clamav.rb +53 -0
- data/cookbooks/mu-tools/recipes/cloudinit.rb +58 -0
- data/cookbooks/mu-tools/recipes/configure_oracle_tools.rb +81 -0
- data/cookbooks/mu-tools/recipes/disable-requiretty.rb +22 -0
- data/cookbooks/mu-tools/recipes/ebs_rolling_snapshots.rb +75 -0
- data/cookbooks/mu-tools/recipes/efs.rb +70 -0
- data/cookbooks/mu-tools/recipes/eks.rb +160 -0
- data/cookbooks/mu-tools/recipes/gcloud.rb +98 -0
- data/cookbooks/mu-tools/recipes/google_api.rb +25 -0
- data/cookbooks/mu-tools/recipes/maldet.rb +67 -0
- data/cookbooks/mu-tools/recipes/nagios.rb +19 -0
- data/cookbooks/mu-tools/recipes/newclient.rb +23 -0
- data/cookbooks/mu-tools/recipes/nrpe.rb +115 -0
- data/cookbooks/mu-tools/recipes/python_pip.rb +35 -0
- data/cookbooks/mu-tools/recipes/retrieve_application.rb +51 -0
- data/cookbooks/mu-tools/recipes/rsyslog.rb +65 -0
- data/cookbooks/mu-tools/recipes/set_local_fw.rb +57 -0
- data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +81 -0
- data/cookbooks/mu-tools/recipes/split_var_partitions.rb +86 -0
- data/cookbooks/mu-tools/recipes/splunk-client.rb +69 -0
- data/cookbooks/mu-tools/recipes/splunk-server.rb +104 -0
- data/cookbooks/mu-tools/recipes/store_inspec_attr.rb +8 -0
- data/cookbooks/mu-tools/recipes/updates.rb +96 -0
- data/cookbooks/mu-tools/recipes/windows-client.rb +202 -0
- data/cookbooks/mu-tools/resources/aws_windows.rb +33 -0
- data/cookbooks/mu-tools/resources/disk.rb +88 -0
- data/cookbooks/mu-tools/resources/mommacat_request.rb +11 -0
- data/cookbooks/mu-tools/resources/scheduled_tasks.rb +29 -0
- data/cookbooks/mu-tools/resources/sshd_service.rb +45 -0
- data/cookbooks/mu-tools/resources/windows_users.rb +242 -0
- data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +168 -0
- data/cookbooks/mu-tools/templates/centos-6/sshd_config.erb +212 -0
- data/cookbooks/mu-tools/templates/centos-7/sshd_config.erb +215 -0
- data/cookbooks/mu-tools/templates/default/0-mu-log-client.conf.erb +13 -0
- data/cookbooks/mu-tools/templates/default/conf.maldet.erb +137 -0
- data/cookbooks/mu-tools/templates/default/etc_hosts.erb +30 -0
- data/cookbooks/mu-tools/templates/default/etc_pamd_password-auth.erb +14 -0
- data/cookbooks/mu-tools/templates/default/etc_pamd_system-auth.erb +14 -0
- data/cookbooks/mu-tools/templates/default/etc_sysconfig_network.erb +12 -0
- data/cookbooks/mu-tools/templates/default/kubeconfig.erb +29 -0
- data/cookbooks/mu-tools/templates/default/kubelet.service.erb +35 -0
- data/cookbooks/mu-tools/templates/default/maldet_scanall.sh.erb +15 -0
- data/cookbooks/mu-tools/templates/default/nrpe.cfg.erb +233 -0
- data/cookbooks/mu-tools/templates/redhat-6/sshd_config.erb +213 -0
- data/cookbooks/mu-tools/templates/redhat-7/sshd_config.erb +215 -0
- data/cookbooks/mu-tools/templates/ubuntu-12.04/sshd_config.erb +146 -0
- data/cookbooks/mu-tools/templates/ubuntu-14.04/sshd_config.erb +145 -0
- data/cookbooks/mu-tools/templates/windows/Backup.xml.erb +20 -0
- data/cookbooks/mu-tools/templates/windows/bkupInfo.xml.erb +1 -0
- data/cookbooks/mu-tools/templates/windows/gpreprt.xml.erb +214 -0
- data/cookbooks/mu-tools/templates/windows/gptmpl.inf.erb +12 -0
- data/cookbooks/mu-tools/templates/windows/manifest.xml.erb +1 -0
- data/cookbooks/mu-tools/templates/windows/set_ad_dns_scheduled_task.ps1.erb +6 -0
- data/cookbooks/mu-tools/templates/windows/sshd_config.erb +136 -0
- data/cookbooks/mu-utility/CHANGELOG.md +12 -0
- data/cookbooks/mu-utility/LICENSE +37 -0
- data/cookbooks/mu-utility/README.md +6 -0
- data/cookbooks/mu-utility/attributes/default.rb +1 -0
- data/cookbooks/mu-utility/libraries/matchers.rb +21 -0
- data/cookbooks/mu-utility/metadata.rb +16 -0
- data/cookbooks/mu-utility/recipes/apt.rb +23 -0
- data/cookbooks/mu-utility/recipes/cleanup_image_helper.rb +118 -0
- data/cookbooks/mu-utility/recipes/iptables.rb +26 -0
- data/cookbooks/mu-utility/recipes/luks.rb +18 -0
- data/cookbooks/mu-utility/recipes/nat.rb +104 -0
- data/cookbooks/mu-utility/recipes/php.rb +33 -0
- data/cookbooks/mu-utility/recipes/rdp_gateway.rb +83 -0
- data/cookbooks/mu-utility/recipes/remi.rb +44 -0
- data/cookbooks/mu-utility/recipes/vim.rb +26 -0
- data/cookbooks/mu-utility/recipes/windows_basics.rb +37 -0
- data/cookbooks/mu-utility/recipes/zip.rb +26 -0
- data/cookbooks/mu-utility/templates/default/BundleConfig.xml.erb +34 -0
- data/cookbooks/mu-utility/templates/default/config.xml.erb +60 -0
- data/cookbooks/nagios/Berksfile +8 -0
- data/cookbooks/nagios/CHANGELOG.md +589 -0
- data/cookbooks/nagios/CONTRIBUTING.md +11 -0
- data/cookbooks/nagios/LICENSE +37 -0
- data/cookbooks/nagios/README.md +328 -0
- data/cookbooks/nagios/TESTING.md +2 -0
- data/cookbooks/nagios/attributes/config.rb +171 -0
- data/cookbooks/nagios/attributes/default.rb +228 -0
- data/cookbooks/nagios/chefignore +102 -0
- data/cookbooks/nagios/definitions/command.rb +33 -0
- data/cookbooks/nagios/definitions/contact.rb +33 -0
- data/cookbooks/nagios/definitions/contactgroup.rb +33 -0
- data/cookbooks/nagios/definitions/host.rb +33 -0
- data/cookbooks/nagios/definitions/hostdependency.rb +33 -0
- data/cookbooks/nagios/definitions/hostescalation.rb +34 -0
- data/cookbooks/nagios/definitions/hostgroup.rb +33 -0
- data/cookbooks/nagios/definitions/nagios_conf.rb +38 -0
- data/cookbooks/nagios/definitions/resource.rb +33 -0
- data/cookbooks/nagios/definitions/service.rb +33 -0
- data/cookbooks/nagios/definitions/servicedependency.rb +33 -0
- data/cookbooks/nagios/definitions/serviceescalation.rb +34 -0
- data/cookbooks/nagios/definitions/servicegroup.rb +33 -0
- data/cookbooks/nagios/definitions/timeperiod.rb +33 -0
- data/cookbooks/nagios/libraries/base.rb +314 -0
- data/cookbooks/nagios/libraries/command.rb +91 -0
- data/cookbooks/nagios/libraries/contact.rb +230 -0
- data/cookbooks/nagios/libraries/contactgroup.rb +112 -0
- data/cookbooks/nagios/libraries/custom_option.rb +36 -0
- data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
- data/cookbooks/nagios/libraries/default.rb +90 -0
- data/cookbooks/nagios/libraries/host.rb +412 -0
- data/cookbooks/nagios/libraries/hostdependency.rb +181 -0
- data/cookbooks/nagios/libraries/hostescalation.rb +173 -0
- data/cookbooks/nagios/libraries/hostgroup.rb +119 -0
- data/cookbooks/nagios/libraries/nagios.rb +282 -0
- data/cookbooks/nagios/libraries/resource.rb +59 -0
- data/cookbooks/nagios/libraries/service.rb +455 -0
- data/cookbooks/nagios/libraries/servicedependency.rb +215 -0
- data/cookbooks/nagios/libraries/serviceescalation.rb +195 -0
- data/cookbooks/nagios/libraries/servicegroup.rb +144 -0
- data/cookbooks/nagios/libraries/timeperiod.rb +160 -0
- data/cookbooks/nagios/libraries/users_helper.rb +54 -0
- data/cookbooks/nagios/metadata.rb +25 -0
- data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
- data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
- data/cookbooks/nagios/recipes/apache.rb +48 -0
- data/cookbooks/nagios/recipes/default.rb +204 -0
- data/cookbooks/nagios/recipes/nginx.rb +82 -0
- data/cookbooks/nagios/recipes/pagerduty.rb +143 -0
- data/cookbooks/nagios/recipes/server_package.rb +40 -0
- data/cookbooks/nagios/recipes/server_source.rb +164 -0
- data/cookbooks/nagios/templates/default/apache2.conf.erb +96 -0
- data/cookbooks/nagios/templates/default/cgi.cfg.erb +266 -0
- data/cookbooks/nagios/templates/default/commands.cfg.erb +13 -0
- data/cookbooks/nagios/templates/default/contacts.cfg.erb +37 -0
- data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +25 -0
- data/cookbooks/nagios/templates/default/hosts.cfg.erb +15 -0
- data/cookbooks/nagios/templates/default/htpasswd.users.erb +6 -0
- data/cookbooks/nagios/templates/default/nagios.cfg.erb +22 -0
- data/cookbooks/nagios/templates/default/nginx.conf.erb +62 -0
- data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +185 -0
- data/cookbooks/nagios/templates/default/resource.cfg.erb +27 -0
- data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +15 -0
- data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +14 -0
- data/cookbooks/nagios/templates/default/services.cfg.erb +14 -0
- data/cookbooks/nagios/templates/default/templates.cfg.erb +31 -0
- data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +13 -0
- data/cookbooks/s3fs/CHANGELOG.md +13 -0
- data/cookbooks/s3fs/LICENSE +37 -0
- data/cookbooks/s3fs/README.md +6 -0
- data/cookbooks/s3fs/attributes/default.rb +15 -0
- data/cookbooks/s3fs/files/default/fuse-2.9.3.zip +0 -0
- data/cookbooks/s3fs/metadata.rb +16 -0
- data/cookbooks/s3fs/recipes/default.rb +91 -0
- data/data_bags/demo/app.json +7 -0
- data/data_bags/nagios_services/chef.json +6 -0
- data/data_bags/nagios_services/linux_diskspace.json +5 -0
- data/data_bags/nagios_services/momma_cat.json +6 -0
- data/data_bags/nagios_services/mu-master-memory.json +5 -0
- data/data_bags/nagios_services/nagios_ui.json +6 -0
- data/data_bags/nagios_services/node_ssh.json +6 -0
- data/data_bags/nagios_services/ssh.json +6 -0
- data/demo/lambda_test.yaml +29 -0
- data/environments/DEV.json +8 -0
- data/environments/PROD.json +8 -0
- data/environments/dev.json +8 -0
- data/environments/development.json +8 -0
- data/environments/prod.json +8 -0
- data/extras/README.md +1 -0
- data/extras/admin-role-binding.yaml +16 -0
- data/extras/admin-user.yaml +6 -0
- data/extras/aws-auth-cm.yaml.erb +12 -0
- data/extras/clean-stock-amis +48 -0
- data/extras/git-fix-permissions-hook +12 -0
- data/extras/gitlab-eks-helper.sh.erb +20 -0
- data/extras/image-generators/README.md +2 -0
- data/extras/image-generators/aws/centos6.yaml +18 -0
- data/extras/image-generators/aws/centos7-govcloud.yaml +24 -0
- data/extras/image-generators/aws/centos7.yaml +17 -0
- data/extras/image-generators/aws/rhel7.yaml +17 -0
- data/extras/image-generators/aws/win2k12.yaml +16 -0
- data/extras/image-generators/aws/win2k16.yaml +16 -0
- data/extras/image-generators/aws/windows.yaml +18 -0
- data/extras/image-generators/gcp/centos6.yaml +17 -0
- data/extras/lambda_waf_domain_blacklist.py +103 -0
- data/extras/platform_berksfile_base +50 -0
- data/extras/ruby_rpm/build.sh +17 -0
- data/extras/ruby_rpm/muby.spec +44 -0
- data/extras/vault_tools/README.md +6 -0
- data/extras/vault_tools/export_vaults.sh +3 -0
- data/extras/vault_tools/recreate_vaults.sh +5 -0
- data/extras/vault_tools/test_vaults.sh +5 -0
- data/install/README.md +8 -0
- data/install/cfn_create_mu_master.json +1034 -0
- data/install/chef-server.rb.erb +19 -0
- data/install/deprecated-bash-library.sh +1891 -0
- data/install/images/Usage.png +0 -0
- data/install/installer +71 -0
- data/install/jenkinskeys.rb +8 -0
- data/install/user-dot-murc.erb +14 -0
- data/modules/html.erb +19 -0
- data/modules/mommacat.ru +426 -0
- data/modules/mu/cleanup.rb +339 -0
- data/modules/mu/cloud.rb +1446 -0
- data/modules/mu/clouds/README.md +201 -0
- data/modules/mu/clouds/aws/alarm.rb +319 -0
- data/modules/mu/clouds/aws/cache_cluster.rb +1010 -0
- data/modules/mu/clouds/aws/collection.rb +373 -0
- data/modules/mu/clouds/aws/container_cluster.rb +667 -0
- data/modules/mu/clouds/aws/database.rb +1836 -0
- data/modules/mu/clouds/aws/dnszone.rb +911 -0
- data/modules/mu/clouds/aws/firewall_rule.rb +641 -0
- data/modules/mu/clouds/aws/folder.rb +92 -0
- data/modules/mu/clouds/aws/function.rb +349 -0
- data/modules/mu/clouds/aws/group.rb +251 -0
- data/modules/mu/clouds/aws/loadbalancer.rb +888 -0
- data/modules/mu/clouds/aws/log.rb +363 -0
- data/modules/mu/clouds/aws/msg_queue.rb +480 -0
- data/modules/mu/clouds/aws/notification.rb +139 -0
- data/modules/mu/clouds/aws/role.rb +656 -0
- data/modules/mu/clouds/aws/search_domain.rb +646 -0
- data/modules/mu/clouds/aws/server.rb +2294 -0
- data/modules/mu/clouds/aws/server_pool.rb +1388 -0
- data/modules/mu/clouds/aws/storage_pool.rb +495 -0
- data/modules/mu/clouds/aws/user.rb +382 -0
- data/modules/mu/clouds/aws/userdata/README.md +4 -0
- data/modules/mu/clouds/aws/userdata/linux.erb +179 -0
- data/modules/mu/clouds/aws/userdata/windows.erb +278 -0
- data/modules/mu/clouds/aws/vpc.rb +1943 -0
- data/modules/mu/clouds/aws.rb +1009 -0
- data/modules/mu/clouds/cloudformation/alarm.rb +146 -0
- data/modules/mu/clouds/cloudformation/cache_cluster.rb +167 -0
- data/modules/mu/clouds/cloudformation/collection.rb +117 -0
- data/modules/mu/clouds/cloudformation/database.rb +278 -0
- data/modules/mu/clouds/cloudformation/dnszone.rb +274 -0
- data/modules/mu/clouds/cloudformation/firewall_rule.rb +308 -0
- data/modules/mu/clouds/cloudformation/loadbalancer.rb +193 -0
- data/modules/mu/clouds/cloudformation/log.rb +170 -0
- data/modules/mu/clouds/cloudformation/server.rb +370 -0
- data/modules/mu/clouds/cloudformation/server_pool.rb +279 -0
- data/modules/mu/clouds/cloudformation/vpc.rb +322 -0
- data/modules/mu/clouds/cloudformation.rb +733 -0
- data/modules/mu/clouds/docker.rb +30 -0
- data/modules/mu/clouds/google/container_cluster.rb +290 -0
- data/modules/mu/clouds/google/database.rb +152 -0
- data/modules/mu/clouds/google/firewall_rule.rb +267 -0
- data/modules/mu/clouds/google/group.rb +164 -0
- data/modules/mu/clouds/google/loadbalancer.rb +479 -0
- data/modules/mu/clouds/google/server.rb +1510 -0
- data/modules/mu/clouds/google/server_pool.rb +274 -0
- data/modules/mu/clouds/google/user.rb +266 -0
- data/modules/mu/clouds/google/userdata/README.md +4 -0
- data/modules/mu/clouds/google/userdata/linux.erb +137 -0
- data/modules/mu/clouds/google/userdata/windows.erb +275 -0
- data/modules/mu/clouds/google/vpc.rb +890 -0
- data/modules/mu/clouds/google.rb +811 -0
- data/modules/mu/config/README.md +11 -0
- data/modules/mu/config/alarm.rb +271 -0
- data/modules/mu/config/cache_cluster.rb +172 -0
- data/modules/mu/config/collection.rb +87 -0
- data/modules/mu/config/container_cluster.rb +103 -0
- data/modules/mu/config/container_cluster.yml +36 -0
- data/modules/mu/config/database.rb +458 -0
- data/modules/mu/config/database.yml +26 -0
- data/modules/mu/config/dnszone.rb +327 -0
- data/modules/mu/config/firewall_rule.rb +118 -0
- data/modules/mu/config/folder.rb +70 -0
- data/modules/mu/config/function.rb +140 -0
- data/modules/mu/config/group.rb +64 -0
- data/modules/mu/config/loadbalancer.rb +482 -0
- data/modules/mu/config/log.rb +47 -0
- data/modules/mu/config/log.yml +6 -0
- data/modules/mu/config/msg_queue.rb +47 -0
- data/modules/mu/config/msg_queue.yml +9 -0
- data/modules/mu/config/notification.rb +44 -0
- data/modules/mu/config/project.rb +71 -0
- data/modules/mu/config/role.rb +102 -0
- data/modules/mu/config/search_domain.rb +61 -0
- data/modules/mu/config/search_domain.yml +25 -0
- data/modules/mu/config/server.rb +587 -0
- data/modules/mu/config/server.yml +8 -0
- data/modules/mu/config/server_pool.rb +216 -0
- data/modules/mu/config/server_pool.yml +71 -0
- data/modules/mu/config/storage_pool.rb +145 -0
- data/modules/mu/config/user.rb +78 -0
- data/modules/mu/config/vpc.rb +743 -0
- data/modules/mu/config/vpc.yml +6 -0
- data/modules/mu/config.rb +2000 -0
- data/modules/mu/defaults/README.md +2 -0
- data/modules/mu/defaults/amazon_images.yaml +121 -0
- data/modules/mu/defaults/google_images.yaml +16 -0
- data/modules/mu/deploy.rb +686 -0
- data/modules/mu/groomer.rb +123 -0
- data/modules/mu/groomers/README.md +58 -0
- data/modules/mu/groomers/chef.rb +1024 -0
- data/modules/mu/kittens.rb +11319 -0
- data/modules/mu/logger.rb +208 -0
- data/modules/mu/master/README.md +27 -0
- data/modules/mu/master/chef.rb +471 -0
- data/modules/mu/master/ldap.rb +1005 -0
- data/modules/mu/master.rb +415 -0
- data/modules/mu/mommacat.rb +2703 -0
- data/modules/mu-load-config.rb +1 -0
- data/modules/mu.rb +724 -0
- data/modules/scratchpad.erb +1 -0
- data/modules/tests/super_complex_bok.yml +41 -0
- data/modules/tests/super_simple_bok.yml +40 -0
- data/mu.gemspec +62 -0
- data/roles/demo-dbservice-configure.json +19 -0
- data/roles/demo-portal-configure.json +19 -0
- data/roles/mu-master-jenkins.json +24 -0
- data/roles/mu-master-nagios-only.json +13 -0
- data/roles/mu-master.json +12 -0
- data/roles/mu-node.json +19 -0
- data/roles/mu-splunk-server.json +13 -0
- data/roles/mu-splunk.json +13 -0
- data/test/clean_up.py +25 -0
- data/test/demo-test-profile/README.md +3 -0
- data/test/demo-test-profile/controls/flask.rb +84 -0
- data/test/demo-test-profile/inspec.lock +7 -0
- data/test/demo-test-profile/inspec.yml +11 -0
- data/test/etco-test-profile/README.md +3 -0
- data/test/etco-test-profile/controls/all-in-one.rb +182 -0
- data/test/etco-test-profile/inspec.lock +7 -0
- data/test/etco-test-profile/inspec.yml +11 -0
- data/test/exec_inspec.py +246 -0
- data/test/exec_mu_install.py +241 -0
- data/test/exec_retry.py +44 -0
- data/test/mu-master-test/README.md +3 -0
- data/test/mu-master-test/controls/all_in_one.rb +557 -0
- data/test/mu-master-test/inspec.lock +3 -0
- data/test/mu-master-test/inspec.yml +11 -0
- data/test/mu-tools-test/README.md +3 -0
- data/test/mu-tools-test/controls/base.rb +265 -0
- data/test/mu-tools-test/inspec.lock +3 -0
- data/test/mu-tools-test/inspec.yml +8 -0
- data/test/simple-server-php-test/README.md +3 -0
- data/test/simple-server-php-test/controls/apachephp.rb +25 -0
- data/test/simple-server-php-test/controls/example.rb +19 -0
- data/test/simple-server-php-test/inspec.lock +7 -0
- data/test/simple-server-php-test/inspec.yml +12 -0
- data/test/simple-server-rails-test/README.md +3 -0
- data/test/simple-server-rails-test/controls/rails.rb +188 -0
- data/test/simple-server-rails-test/inspec.lock +7 -0
- data/test/simple-server-rails-test/inspec.yml +11 -0
- data/test/simple-windows-test/README.md +3 -0
- data/test/simple-windows-test/controls/windows.rb +20 -0
- data/test/simple-windows-test/inspec.lock +7 -0
- data/test/simple-windows-test/inspec.yml +11 -0
- data/test/smoke_test.rb +75 -0
- data/test/wordpress-test/README.md +3 -0
- data/test/wordpress-test/controls/wordpress.rb +97 -0
- data/test/wordpress-test/inspec.lock +7 -0
- data/test/wordpress-test/inspec.yml +11 -0
- 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
|