motherbrain 0.0.0.placeholder → 0.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.ruby-version +1 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +196 -0
- data/COMMANDS.md +9 -0
- data/CONTRIBUTING.md +24 -0
- data/Dockerfile +26 -0
- data/Gemfile +60 -2
- data/Guardfile +30 -0
- data/LICENSE +10 -0
- data/MANIFESTS.md +90 -0
- data/OPERATORS_GUIDE.md +195 -0
- data/PLUGINS.md +268 -0
- data/README.md +304 -16
- data/Thorfile +123 -0
- data/VAGRANT.md +116 -0
- data/bin/boot +9 -0
- data/bin/mb +5 -0
- data/bin/mbsrv +5 -0
- data/config.json +32 -0
- data/features/cli/bootstrap_command/configurable_scripts.feature +32 -0
- data/features/cli/configure_command.feature +57 -0
- data/features/cli/environment_command/create_command.feature +22 -0
- data/features/cli/environment_command/destroy_command.feature +33 -0
- data/features/cli/environment_command/from_command.feature +29 -0
- data/features/cli/environment_command/list_command.feature +0 -0
- data/features/cli/node_limiting.feature +47 -0
- data/features/cli/plugin_command/list_command.feature +46 -0
- data/features/cli/service_command/service_command.feature +21 -0
- data/features/cli/template_command.feature +10 -0
- data/features/cli/validate_config.feature +46 -0
- data/features/step_definitions/bootstrap_steps.rb +57 -0
- data/features/step_definitions/chef_server_steps.rb +3 -0
- data/features/step_definitions/configuration_steps.rb +18 -0
- data/features/step_definitions/core_cli_steps.rb +33 -0
- data/features/step_definitions/environment_steps.rb +43 -0
- data/features/step_definitions/node_steps.rb +3 -0
- data/features/step_definitions/plugin_steps.rb +15 -0
- data/features/step_definitions/template_steps.rb +7 -0
- data/features/support/env.rb +68 -0
- data/lib/mb/api.rb +8 -0
- data/lib/mb/api/application.rb +7 -0
- data/lib/mb/api/endpoint.rb +5 -0
- data/lib/mb/api/helpers.rb +38 -0
- data/lib/mb/api/v1.rb +56 -0
- data/lib/mb/api/v1/config_endpoint.rb +12 -0
- data/lib/mb/api/v1/environments_endpoint.rb +174 -0
- data/lib/mb/api/v1/jobs_endpoint.rb +31 -0
- data/lib/mb/api/v1/plugins_endpoint.rb +90 -0
- data/lib/mb/api/validators.rb +5 -0
- data/lib/mb/api/validators/sem_ver.rb +18 -0
- data/lib/mb/application.rb +148 -0
- data/lib/mb/berkshelf.rb +50 -0
- data/lib/mb/bootstrap.rb +9 -0
- data/lib/mb/bootstrap/manager.rb +250 -0
- data/lib/mb/bootstrap/manifest.rb +131 -0
- data/lib/mb/bootstrap/routine.rb +199 -0
- data/lib/mb/bootstrap/template.rb +73 -0
- data/lib/mb/bootstrap/worker.rb +227 -0
- data/lib/mb/chef.rb +6 -0
- data/lib/mb/chef/config.rb +69 -0
- data/lib/mb/chef/run_list_item.rb +115 -0
- data/lib/mb/chef_mutex.rb +304 -0
- data/lib/mb/clean_room_base.rb +39 -0
- data/lib/mb/cli.rb +50 -0
- data/lib/mb/cli/base.rb +51 -0
- data/lib/mb/cli/shell.rb +29 -0
- data/lib/mb/cli/shell/basic.rb +11 -0
- data/lib/mb/cli/shell/color.rb +11 -0
- data/lib/mb/cli/shell/ext.rb +41 -0
- data/lib/mb/cli/sub_command.rb +95 -0
- data/lib/mb/cli/sub_command/component.rb +56 -0
- data/lib/mb/cli/sub_command/plugin.rb +232 -0
- data/lib/mb/cli_client.rb +178 -0
- data/lib/mb/cli_gateway.rb +426 -0
- data/lib/mb/cli_gateway/sub_commands.rb +3 -0
- data/lib/mb/cli_gateway/sub_commands/environment.rb +124 -0
- data/lib/mb/cli_gateway/sub_commands/plugin.rb +148 -0
- data/lib/mb/command.rb +88 -0
- data/lib/mb/command_invoker.rb +235 -0
- data/lib/mb/command_invoker/worker.rb +40 -0
- data/lib/mb/command_runner.rb +233 -0
- data/lib/mb/component.rb +245 -0
- data/lib/mb/config.rb +275 -0
- data/lib/mb/config_manager.rb +75 -0
- data/lib/mb/console.rb +35 -0
- data/lib/mb/cookbook_metadata.rb +73 -0
- data/lib/mb/core_ext.rb +3 -0
- data/lib/mb/core_ext/dir.rb +37 -0
- data/lib/mb/core_ext/enumerable.rb +48 -0
- data/lib/mb/core_ext/file.rb +24 -0
- data/lib/mb/core_ext/signal.rb +11 -0
- data/lib/mb/environment_manager.rb +195 -0
- data/lib/mb/error_handler.rb +212 -0
- data/lib/mb/errors.rb +693 -0
- data/lib/mb/file_system.rb +60 -0
- data/lib/mb/file_system/tempfile.rb +25 -0
- data/lib/mb/gear.rb +154 -0
- data/lib/mb/gears.rb +8 -0
- data/lib/mb/gears/dynamic_service.rb +218 -0
- data/lib/mb/gears/jmx.rb +24 -0
- data/lib/mb/gears/jmx/action.rb +46 -0
- data/lib/mb/gears/mysql.rb +20 -0
- data/lib/mb/gears/mysql/action.rb +190 -0
- data/lib/mb/gears/service.rb +163 -0
- data/lib/mb/gears/service/action.rb +58 -0
- data/lib/mb/gears/service/action_runner.rb +161 -0
- data/lib/mb/grape_ext.rb +3 -0
- data/lib/mb/grape_ext/endpoint.rb +13 -0
- data/lib/mb/group.rb +143 -0
- data/lib/mb/job.rb +183 -0
- data/lib/mb/job/state_machine.rb +34 -0
- data/lib/mb/job/states.rb +46 -0
- data/lib/mb/job_manager.rb +96 -0
- data/lib/mb/job_record.rb +67 -0
- data/lib/mb/job_ticket.rb +25 -0
- data/lib/mb/lock_manager.rb +116 -0
- data/lib/mb/logging.rb +134 -0
- data/lib/mb/logging/basic_format.rb +31 -0
- data/lib/mb/manifest.rb +128 -0
- data/lib/mb/mixin.rb +3 -0
- data/lib/mb/mixin/attribute_setting.rb +265 -0
- data/lib/mb/mixin/coded_exit.rb +49 -0
- data/lib/mb/mixin/locks.rb +54 -0
- data/lib/mb/mixin/services.rb +100 -0
- data/lib/mb/node_filter.rb +97 -0
- data/lib/mb/node_querier.rb +527 -0
- data/lib/mb/plugin.rb +300 -0
- data/lib/mb/plugin_manager.rb +589 -0
- data/lib/mb/provisioner.rb +186 -0
- data/lib/mb/provisioner/manager.rb +213 -0
- data/lib/mb/provisioner/manifest.rb +125 -0
- data/lib/mb/provisioner/provision_data.rb +96 -0
- data/lib/mb/provisioners.rb +5 -0
- data/lib/mb/provisioners/aws.rb +395 -0
- data/lib/mb/rest_gateway.rb +72 -0
- data/lib/mb/ridley_ext.rb +5 -0
- data/lib/mb/ridley_ext/cookbook_object.rb +15 -0
- data/lib/mb/srv_ctl.rb +183 -0
- data/lib/mb/test.rb +104 -0
- data/lib/mb/thor_ext.rb +49 -0
- data/lib/mb/upgrade.rb +6 -0
- data/lib/mb/upgrade/manager.rb +85 -0
- data/lib/mb/upgrade/worker.rb +149 -0
- data/lib/mb/version.rb +1 -1
- data/lib/motherbrain.rb +166 -2
- data/man/man_helper.rb +81 -0
- data/man/mb.1 +494 -0
- data/man/mb.1.html +300 -0
- data/man/mb.1.ronn.erb +62 -0
- data/motherbrain.gemspec +56 -20
- data/scripts/node_name.rb +14 -0
- data/spec/fixtures/cb_metadata.json +7 -0
- data/spec/fixtures/cb_metadata.rb +14 -0
- data/spec/fixtures/fake_id_rsa +27 -0
- data/spec/fixtures/fake_key.pem +27 -0
- data/spec/fixtures/myface-0.1.0/metadata.rb +14 -0
- data/spec/fixtures/myface-0.1.0/motherbrain.rb +0 -0
- data/spec/fixtures/test_env.json +15 -0
- data/spec/spec_helper.rb +67 -0
- data/spec/support/actor_mocking.rb +7 -0
- data/spec/support/berkshelf.rb +24 -0
- data/spec/support/chef_server.rb +102 -0
- data/spec/support/doubles.rb +11 -0
- data/spec/support/klass.rb +10 -0
- data/spec/support/matchers/each.rb +12 -0
- data/spec/support/matchers/error_codes.rb +5 -0
- data/spec/support/matchers/exit_codes.rb +57 -0
- data/spec/support/matchers/jobs.rb +11 -0
- data/spec/support/spec_helpers.rb +145 -0
- data/spec/unit/mb/api/application_spec.rb +11 -0
- data/spec/unit/mb/api/helpers_spec.rb +5 -0
- data/spec/unit/mb/api/v1/config_endpoint_spec.rb +19 -0
- data/spec/unit/mb/api/v1/environments_endpoint_spec.rb +71 -0
- data/spec/unit/mb/api/v1/jobs_endpoint_spec.rb +24 -0
- data/spec/unit/mb/api/v1/plugins_endpoint_spec.rb +298 -0
- data/spec/unit/mb/api/v1_spec.rb +37 -0
- data/spec/unit/mb/api/validators/sem_ver_spec.rb +5 -0
- data/spec/unit/mb/application_spec.rb +19 -0
- data/spec/unit/mb/berkshelf_spec.rb +38 -0
- data/spec/unit/mb/bootstrap/manager_spec.rb +347 -0
- data/spec/unit/mb/bootstrap/manifest_spec.rb +333 -0
- data/spec/unit/mb/bootstrap/routine_spec.rb +393 -0
- data/spec/unit/mb/bootstrap/template_spec.rb +100 -0
- data/spec/unit/mb/bootstrap/worker_spec.rb +194 -0
- data/spec/unit/mb/chef/config_spec.rb +33 -0
- data/spec/unit/mb/chef/run_list_item_spec.rb +34 -0
- data/spec/unit/mb/chef_mutex_spec.rb +314 -0
- data/spec/unit/mb/clean_room_base_spec.rb +31 -0
- data/spec/unit/mb/cli/base_spec.rb +43 -0
- data/spec/unit/mb/cli/shell/basic_spec.rb +5 -0
- data/spec/unit/mb/cli/shell/color_spec.rb +5 -0
- data/spec/unit/mb/cli/shell/ext_spec.rb +11 -0
- data/spec/unit/mb/cli/shell_spec.rb +38 -0
- data/spec/unit/mb/cli/sub_command/base_spec.rb +102 -0
- data/spec/unit/mb/cli/sub_command/component_spec.rb +5 -0
- data/spec/unit/mb/cli/sub_command/plugin_spec.rb +91 -0
- data/spec/unit/mb/cli/sub_command_spec.rb +43 -0
- data/spec/unit/mb/cli/ui.rb +0 -0
- data/spec/unit/mb/cli_client_spec.rb +51 -0
- data/spec/unit/mb/cli_gateway_spec.rb +386 -0
- data/spec/unit/mb/command_invoker/worker_spec.rb +43 -0
- data/spec/unit/mb/command_invoker_spec.rb +230 -0
- data/spec/unit/mb/command_runner_spec.rb +299 -0
- data/spec/unit/mb/command_spec.rb +76 -0
- data/spec/unit/mb/component_spec.rb +185 -0
- data/spec/unit/mb/config_manager_spec.rb +31 -0
- data/spec/unit/mb/config_spec.rb +408 -0
- data/spec/unit/mb/cookbook_metadata_spec.rb +89 -0
- data/spec/unit/mb/core_ext/dir_spec.rb +92 -0
- data/spec/unit/mb/core_ext/enumerable_spec.rb +104 -0
- data/spec/unit/mb/core_ext/file_spec.rb +58 -0
- data/spec/unit/mb/core_ext/signal_spec.rb +24 -0
- data/spec/unit/mb/environment_manager_spec.rb +166 -0
- data/spec/unit/mb/error_handler_spec.rb +173 -0
- data/spec/unit/mb/errors_spec.rb +132 -0
- data/spec/unit/mb/file_system/tempfile_spec.rb +14 -0
- data/spec/unit/mb/file_system_spec.rb +69 -0
- data/spec/unit/mb/gear_spec.rb +125 -0
- data/spec/unit/mb/gears/dynamic_service_spec.rb +187 -0
- data/spec/unit/mb/gears/jmx/action_spec.rb +34 -0
- data/spec/unit/mb/gears/jmx_spec.rb +32 -0
- data/spec/unit/mb/gears/mysql/action_spec.rb +118 -0
- data/spec/unit/mb/gears/mysql_spec.rb +21 -0
- data/spec/unit/mb/gears/service/action_runner_spec.rb +182 -0
- data/spec/unit/mb/gears/service/action_spec.rb +44 -0
- data/spec/unit/mb/gears/service_spec.rb +124 -0
- data/spec/unit/mb/group_spec.rb +280 -0
- data/spec/unit/mb/job_manager_spec.rb +56 -0
- data/spec/unit/mb/job_record_spec.rb +60 -0
- data/spec/unit/mb/job_spec.rb +201 -0
- data/spec/unit/mb/locks_manager_spec.rb +88 -0
- data/spec/unit/mb/logging_spec.rb +133 -0
- data/spec/unit/mb/manifest_spec.rb +105 -0
- data/spec/unit/mb/mixin/attribute_setting_spec.rb +180 -0
- data/spec/unit/mb/mixin/coded_exit_spec.rb +25 -0
- data/spec/unit/mb/mixin/locks_spec.rb +32 -0
- data/spec/unit/mb/mixin/services_spec.rb +75 -0
- data/spec/unit/mb/node_filter_spec.rb +86 -0
- data/spec/unit/mb/node_querier_spec.rb +532 -0
- data/spec/unit/mb/plugin_manager_spec.rb +724 -0
- data/spec/unit/mb/plugin_spec.rb +247 -0
- data/spec/unit/mb/provisioner/manager_spec.rb +141 -0
- data/spec/unit/mb/provisioner/manifest_spec.rb +182 -0
- data/spec/unit/mb/provisioner/provision_data_spec.rb +113 -0
- data/spec/unit/mb/provisioner_spec.rb +251 -0
- data/spec/unit/mb/provisioners/aws_spec.rb +392 -0
- data/spec/unit/mb/provisioners/environment_factory_spec.rb +108 -0
- data/spec/unit/mb/rest_gateway_spec.rb +13 -0
- data/spec/unit/mb/ridley_ext/cookbook_object_spec.rb +105 -0
- data/spec/unit/mb/srv_ctl_spec.rb +142 -0
- data/spec/unit/mb/upgrade/manager_spec.rb +37 -0
- data/spec/unit/mb/upgrade/worker_spec.rb +219 -0
- data/spec/unit/motherbrain_spec.rb +58 -0
- data/templates/bootstrap.json +8 -0
- data/templates/motherbrain.rb +44 -0
- metadata +694 -15
- data/Rakefile +0 -1
@@ -0,0 +1,14 @@
|
|
1
|
+
name "motherbrain"
|
2
|
+
maintainer "Jamie Winsor"
|
3
|
+
maintainer_email "jamie@vialstudios.com"
|
4
|
+
license "Apache 2.0"
|
5
|
+
description "Installs/Configures motherbrain"
|
6
|
+
long_description "Installs/Configures motherbrain"
|
7
|
+
version "0.1.0"
|
8
|
+
|
9
|
+
%w{ centos }.each do |os|
|
10
|
+
supports os
|
11
|
+
end
|
12
|
+
|
13
|
+
depends "nginx", "~> 1.0.0"
|
14
|
+
depends "artifact", "~> 0.11.5"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEA2jE12CeifIMSlLkbqzVlS3esfZQNTU3hh5djO+KEi+10HJsO
|
3
|
+
6P571TvbFYZT3NQ2km72zrYscNABVmvg+K36EkPQ+NzlhfX1zRLvKRs9eVoG+mBy
|
4
|
+
yXSGL3bXYB9tWC2sBEO/aOoJShk1H8rlknO8vi/9fCC4DvMrCm3CtPzLybfqF/q1
|
5
|
+
HYDXfxQtAAy3RqKQWLpKeHsjd4TnmG7LA9rFirrLdkyBPueYP20BjLN9DrPO8yFb
|
6
|
+
PLphvVM+xbrNzSw/cwOVii1bqSSOt9e8OVaKM1AiFo1t/GfAbtac2i68Amwuj5QM
|
7
|
+
0G++UTg+BEubDw9zLiWRSmyLZo71nsY1kA/kdQIDAQABAoIBAQDT2m4ud6VkAhw7
|
8
|
+
fVQpM4or8YHw2Jzlz1XIwqwejD0oZCGWWNPsVJPGIf0B9FBfHUnzenx3jxitXLm/
|
9
|
+
wLVKoBosO96elFTjckL8oILIxeM1fb1Cw/0QL+zODzTl5v3TXV0lMuaaJotof/s9
|
10
|
+
6FJplajQfWZBbL9p/J9w28vu0XnJW9ZawXeTQbg7XppFjcXDVfeY+AjSRFV5/+ZD
|
11
|
+
RG0QT7kS0IaRObk4MeiNix5L7nCnRPE2NZcWhUNuelRPWsi828vvC4AY+6N6bwB5
|
12
|
+
O4+Y+hX/ThgnzEThMG1zQwummIJ5M/OYzLvuEC7fpgbsOGVIE4zpT/XThI/zanS3
|
13
|
+
fFZ2wFQhAoGBAP6mf59WkYHjZYhlCAyQAiTt/3z3/65gSAGnF5XbczwO0yAX3kWz
|
14
|
+
TzNuCGXOZCeZh1A4pgKcPR0hzK5TCoIv0oiwcYBH5ebxeCA0UzXhfC/prIQyaoif
|
15
|
+
j6dqBvjZtVmfeEx41txi9KEOOmugTg2EL3MKfyWFiVdOoLM0G1mQigM5AoGBANtZ
|
16
|
+
Px2ozhDQMzRfkrtz9BFJ0H3wwOFpHCAPMGZYTdDmPYYyW1B4ODxEgaS9INANy2ui
|
17
|
+
ZHlOTPWMFQB71Syqpw/xr+S27+h1/bGtjfnEVAfRMjNXMLySKBgJ1XuD3vl/ivyH
|
18
|
+
iVlWzWskFShJQYAivhcTSOVnmViZUaxIs07aNr8dAoGAarPPhC+c9uUW1UkoT0NE
|
19
|
+
cr77MB0mmKWlZnPicRusNH0twCPgMiqJRE6V3DrYQrOVPGsQPMXE4eEYx+7p11U8
|
20
|
+
jaQJWyxFTDjgEfZ663fZNqZecGJDu43IfujxlPJ8h9pHaRu1RFF+mcHBfvmD2ywJ
|
21
|
+
SdYbItjKjLfYpF5wG15yRhkCgYEAn0w6PST5ulYpybBbFM3KA8AyrTPqMAmwxkuh
|
22
|
+
n8IjiUGcjtgFXvRgCszJxkUgDljmUZ3XEA3gcDcyjW5hS5YHy9l/H0AIDS+bda0Q
|
23
|
+
PcLqL98qcQSyPVB707FYm+ISTenlmy4nfn0+o7/Jqb9B1Xfly0ZTG19Yi3KVUORf
|
24
|
+
bDWnqrUCgYASBuFHTDR1ZMBMdN32tftd5tQsLpcpdQgd5H1aSomeuA9+ric2HVMs
|
25
|
+
vz2OzP03z3YFXPJRTHVReTXr/ndwwpz259jcXlTDmIGXGwVSLeZTQx0J1og/K2P8
|
26
|
+
zVGwZZX2HJ1KLn3rzmL4wXtMiCd7wuq2hF0lQ7huDFQ7gb570EHBFA==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpQIBAAKCAQEAyyUMqrTh1IzKOyE0fvXEWC7m0AdMI8/dr9JJMUKtK9vhhP0w
|
3
|
+
rm6m95GoybFM2IRryukFsAxpcir3M1ungTU3Smq4MshhMJ7H9FbvZVfQoknTbCsR
|
4
|
+
w6scg2fBepxT2+fcGRufr8nAh92M3uUkN9bMMTAkt18D4br6035YvdmvHDJERxYq
|
5
|
+
ByA/720AdI9VNSIvw+x8oqsIkXLEdF6dgT9MpG5iWZT66pbFsnNZpRrd4/bFNWBY
|
6
|
+
+13aOqdmjiTL08/EdgQFKMT5qimpos1TuQhA7mwInOjQgzVu9uCDkMiYejaLbUz0
|
7
|
+
lGyS8y4uxu6z2hA900Jg/z+JJuXymH5QAX3GZQIDAQABAoIBAQCtFXkwbYPI1Nht
|
8
|
+
/wG6du5+8B9K+hy+mppY9wPTy+q+Zs9Ev3Fd/fuXDm1QxBckl9c8AMUO1dR2KPOM
|
9
|
+
t7gFl/DvH/SnmCFvCqp1nijFIUgrLlnMXPn6zG0z7RBlxpKQ2IGohufNIEpBuNwR
|
10
|
+
Ag2U4hgChPGTp4ooJ2cVEh7MS5AupYPDbC62dWEdW68aRTWhh2BCGAWBb6s16yl9
|
11
|
+
aZ7+OcxW2eeRJVbRfLkLQEDutJZi5TfOEn5QPc86ZgxcCmnvwulnpnhpz6QCkgQt
|
12
|
+
OP/+KRqDhWSDVCFREVT30fUIj1EWvK7NFWASZQxueZStuIvMEKeFebYfrbHxRFzJ
|
13
|
+
UmaxJnWVAoGBAPbKLpeky6ClccBaHHrCgjzakoDfGgyNKDQ9g753lJxB8nn7d9X4
|
14
|
+
HQpkWpfqAGFRZp1hI2H+VxyUXLh2Ob5OUeTm0OZJll35vycOaQEtfgIScXTcvzn0
|
15
|
+
16J9eX2YY4wIHEEMh85nKk8BEGgiNP5nuEviHocCeYXoi/Zq3+qj6v63AoGBANK5
|
16
|
+
4nyi6LBQFs1CUc7Sh7vjtOE3ia7KeRmOr7gS6QhS3iK3Oa8FzBLJ6ETjN2a9Bw8N
|
17
|
+
cF7I/+cr4s7DUJjxdb53D/J6TVSYORNNCUVnpF/uB2LqqdXDYmpO0PvFkXFoYTnJ
|
18
|
+
kaLAN8uCoLKr6JH9tq3DfXIfDIHiZ+BOIvI070fDAoGBAMDyzEDFmGruTyRLj66u
|
19
|
+
+rJnVVmqlKwxhLhrS+CTj74nlVOnt0a0KMhiM65IRqnPwcHUG5zXBPaUTHXwAS93
|
20
|
+
/nFPwQ37hLPOupPnoVNJZRZrowbyPBQtCJbDMURv64ylHqoBCQDoCd0hANnZvMMX
|
21
|
+
BrFVhfaaibaXXS542r6SD/27AoGAECadHE5kJTdOOBcwK/jo3Fa8g1J9Y/8yvum3
|
22
|
+
wBT69V9clS6T5j08geglvDnqAh7UzquKBEnFi1NKw+wmXkKLcrivaTdEfApavYb3
|
23
|
+
AfHKoGue907jC3Y5Mcquq81ds2J7qTEwz1eKLzfo1yjj32ShvrmwALIuhDn1GjUC
|
24
|
+
6qtx938CgYEApEqvu0nocR1jmVVlLe5uKQBj949dh6NGq0R5Lztz6xufaTYzMC3d
|
25
|
+
AZG9XPPjRqSLs+ylSXJpwHEwoeyLFDaJcO+GgW1/ut4MC2HppOx6aImwDdXMHUWR
|
26
|
+
KYGIFF4AU/IYoBcanAm4s078EH/Oz01B2c7tR2TqabisPgLYe7PXSCw=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,14 @@
|
|
1
|
+
name "myface"
|
2
|
+
maintainer "Jamie Winsor"
|
3
|
+
maintainer_email "jamie@vialstudios.com"
|
4
|
+
license "Apache 2.0"
|
5
|
+
description "Installs/Configures myface"
|
6
|
+
long_description "Installs/Configures myface"
|
7
|
+
version "0.1.0"
|
8
|
+
|
9
|
+
%w{ centos }.each do |os|
|
10
|
+
supports os
|
11
|
+
end
|
12
|
+
|
13
|
+
depends "nginx", "~> 1.0.0"
|
14
|
+
depends "artifact", "~> 0.11.5"
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
{
|
2
|
+
"name": "test_env",
|
3
|
+
"description": "test environment",
|
4
|
+
"cookbook_versions": {
|
5
|
+
"mb_base": "2.6.40"
|
6
|
+
},
|
7
|
+
"json_class": "Chef::Environment",
|
8
|
+
"chef_type": "environment",
|
9
|
+
"default_attributes": {
|
10
|
+
"motherbrain": true
|
11
|
+
},
|
12
|
+
"override_attributes": {
|
13
|
+
"awesome_level": 7
|
14
|
+
}
|
15
|
+
}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
ENV['RUBY_ENV'] ||= 'test'
|
2
|
+
ENV['MOTHERBRAIN_PATH'] ||= File.join(File.expand_path(File.dirname(__FILE__)), "tmp/.mb")
|
3
|
+
ENV['BERKSHELF_PATH'] ||= File.join(File.expand_path(File.dirname(__FILE__)), "tmp/.berkshelf")
|
4
|
+
ENV['CHEF_API_URL'] = 'http://localhost:28890'
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'bundler'
|
8
|
+
require 'rspec'
|
9
|
+
require 'json_spec'
|
10
|
+
require 'webmock/rspec'
|
11
|
+
require 'rack/test'
|
12
|
+
require 'motherbrain'
|
13
|
+
require 'chef_zero/server'
|
14
|
+
|
15
|
+
def setup_rspec
|
16
|
+
Dir[File.join(File.expand_path("../../spec/support/**/*.rb", __FILE__))].each { |f| require f }
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.include JsonSpec::Helpers
|
20
|
+
config.include MotherBrain::RSpec::Doubles
|
21
|
+
config.include MotherBrain::Matchers
|
22
|
+
config.include MotherBrain::SpecHelpers
|
23
|
+
config.include MotherBrain::RSpec::Berkshelf
|
24
|
+
config.include MotherBrain::RSpec::ChefServer
|
25
|
+
config.include MotherBrain::Mixin::Services
|
26
|
+
|
27
|
+
config.mock_with :rspec
|
28
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
29
|
+
config.filter_run focus: true
|
30
|
+
config.run_all_when_everything_filtered = true
|
31
|
+
|
32
|
+
config.before(:suite) do
|
33
|
+
WebMock.disable_net_connect!(allow_localhost: true, net_http_connect_on_start: true)
|
34
|
+
MB::RSpec::ChefServer.start
|
35
|
+
end
|
36
|
+
|
37
|
+
config.before(:all) do
|
38
|
+
Celluloid.shutdown
|
39
|
+
@config = generate_valid_config
|
40
|
+
@app = MB::Application.run!(@config)
|
41
|
+
MB::Logging.setup(location: '/dev/null')
|
42
|
+
end
|
43
|
+
|
44
|
+
config.before(:each) do
|
45
|
+
clean_tmp_path
|
46
|
+
MB::RSpec::ChefServer.server.clear_data
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
if jruby?
|
52
|
+
setup_rspec
|
53
|
+
else
|
54
|
+
require 'spork'
|
55
|
+
|
56
|
+
Spork.prefork do
|
57
|
+
setup_rspec
|
58
|
+
end
|
59
|
+
|
60
|
+
Spork.each_run do
|
61
|
+
require 'motherbrain'
|
62
|
+
|
63
|
+
# Required to ensure Celluloid boots properly on each run
|
64
|
+
Celluloid::Notifications::Fanout.supervise_as :notifications_fanout
|
65
|
+
Celluloid::IncidentReporter.supervise_as :default_incident_reporter, STDERR
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'spec_helpers'
|
2
|
+
|
3
|
+
module MotherBrain::RSpec
|
4
|
+
module Berkshelf
|
5
|
+
include MB::SpecHelpers
|
6
|
+
|
7
|
+
# @param [String] name
|
8
|
+
# name of the cookbook
|
9
|
+
# @param [String] version
|
10
|
+
# version of the cookbook
|
11
|
+
#
|
12
|
+
# @option options [Boolean] :with_plugin
|
13
|
+
# if this cookbook should contain a motherbrain plugin
|
14
|
+
#
|
15
|
+
# @return [String]
|
16
|
+
def install_cookbook(name, version, options = {})
|
17
|
+
options = options.reverse_merge(with_plugin: true)
|
18
|
+
options[:path] = MB::Berkshelf.path.join("cookbooks", "#{name}-#{version}")
|
19
|
+
options[:version] = version
|
20
|
+
|
21
|
+
generate_cookbook(name, options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'chef_zero/server'
|
2
|
+
require_relative 'spec_helpers'
|
3
|
+
|
4
|
+
module MotherBrain::RSpec
|
5
|
+
module ChefServer
|
6
|
+
class << self
|
7
|
+
def clear_data
|
8
|
+
server.clear_data
|
9
|
+
end
|
10
|
+
|
11
|
+
def clear_request_log
|
12
|
+
@request_log = Array.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def port
|
16
|
+
if ENV['CHEF_API_URL']
|
17
|
+
ENV['CHEF_API_URL'].split(?:).last.to_i
|
18
|
+
else
|
19
|
+
28890
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def request_log
|
24
|
+
@request_log ||= Array.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def server
|
28
|
+
@server ||= ChefZero::Server.new(port: port, generate_real_keys: false)
|
29
|
+
end
|
30
|
+
|
31
|
+
def server_url
|
32
|
+
(@server && @server.url) || "http://localhost:#{port}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def start
|
36
|
+
return if running?
|
37
|
+
|
38
|
+
server.start_background
|
39
|
+
server.on_response do |request, response|
|
40
|
+
request_log << [ request, response ]
|
41
|
+
end
|
42
|
+
clear_request_log
|
43
|
+
|
44
|
+
@running = true
|
45
|
+
|
46
|
+
server
|
47
|
+
end
|
48
|
+
|
49
|
+
def stop
|
50
|
+
@server.stop if @server
|
51
|
+
end
|
52
|
+
|
53
|
+
def running?
|
54
|
+
@running
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
include MotherBrain::SpecHelpers
|
59
|
+
include MotherBrain::RSpec::Berkshelf
|
60
|
+
|
61
|
+
def chef_client(name, hash = Hash.new)
|
62
|
+
load_data(:clients, name, hash)
|
63
|
+
end
|
64
|
+
|
65
|
+
def chef_cookbook(name, version, options = {})
|
66
|
+
options = options.reverse_merge(with_plugin: true)
|
67
|
+
options[:version] = version
|
68
|
+
options[:path] = tmp_path.join("cookbook-#{name}-#{version}")
|
69
|
+
|
70
|
+
ridley_zero do |r|
|
71
|
+
r.cookbook.upload(generate_cookbook(name, options))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def chef_data_bag(name, hash = Hash.new)
|
76
|
+
ChefServer.server.load_data({ 'data' => { name => hash }})
|
77
|
+
end
|
78
|
+
|
79
|
+
def chef_environment(name, hash = Hash.new)
|
80
|
+
load_data(:environments, name, hash)
|
81
|
+
end
|
82
|
+
|
83
|
+
def chef_node(name, hash = Hash.new)
|
84
|
+
load_data(:nodes, name, hash)
|
85
|
+
end
|
86
|
+
|
87
|
+
def chef_role(name, hash = Hash.new)
|
88
|
+
load_data(:roles, name, hash)
|
89
|
+
end
|
90
|
+
|
91
|
+
def ridley_zero(&block)
|
92
|
+
Ridley::Client.open(server_url: ChefServer.server_url, client_name: "reset",
|
93
|
+
client_key: fixtures_path.join('fake_key.pem').to_s, &block)
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def load_data(key, name, hash)
|
99
|
+
ChefServer.server.load_data(key.to_s => { name => JSON.fast_generate(hash) })
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module MotherBrain
|
2
|
+
module RSpec
|
3
|
+
# Pre-defined commonly used doubles for testing motherbrain
|
4
|
+
module Doubles
|
5
|
+
def job_double(name = "job")
|
6
|
+
double(name, alive?: true, terminate: nil, set_status: nil, report_running: nil,
|
7
|
+
report_failure: nil, report_pending: nil, report_success: nil, report_boolean: nil)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
RSpec::Matchers.define :each do |check|
|
2
|
+
match do |actual|
|
3
|
+
actual.each_with_index do |index, o|
|
4
|
+
@object = o
|
5
|
+
index.should check
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
failure_message_for_should do |actual|
|
10
|
+
"at[#{@object}] #{check.failure_message_for_should}"
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module MotherBrain
|
2
|
+
module Matchers
|
3
|
+
class ExitCodes
|
4
|
+
include MB::Mixin::CodedExit
|
5
|
+
|
6
|
+
def initialize(target_err)
|
7
|
+
@target_err = target_err
|
8
|
+
@actual_err = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def matches?(given_proc)
|
12
|
+
given_proc.call
|
13
|
+
rescue SystemExit => @actual_err
|
14
|
+
return false unless target_has_exit_code?
|
15
|
+
|
16
|
+
@actual_status = @actual_err.status
|
17
|
+
@target_status = @target_err.exit_code
|
18
|
+
|
19
|
+
if @actual_status.nil? || @target_status.nil?
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
23
|
+
return @actual_status == @target_status
|
24
|
+
end
|
25
|
+
|
26
|
+
def failure_message_for_should
|
27
|
+
unless target_has_exit_code?
|
28
|
+
msg = "the program exited but the exception the exception you you gave does not respond to" +
|
29
|
+
" #exit_code. Is it an MB::MBError?"
|
30
|
+
return msg
|
31
|
+
end
|
32
|
+
|
33
|
+
"the program exited with an exit status of #{@actual_status} but you expected it to be #{@target_status}."
|
34
|
+
end
|
35
|
+
|
36
|
+
def failure_message_for_should_not
|
37
|
+
unless target_has_exit_code?
|
38
|
+
msg = "the program exited but the exception the exception you you gave does not respond to" +
|
39
|
+
" #exit_code. Is it an MB::MBError?"
|
40
|
+
return msg
|
41
|
+
end
|
42
|
+
|
43
|
+
"the program exited with an exit status of #{@actual_status} but you expected it not to."
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def target_has_exit_code?
|
49
|
+
@target_err.respond_to?(:exit_code)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def exit_with(err_const)
|
54
|
+
Matchers::ExitCodes.new(err_const)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module MotherBrain
|
2
|
+
module SpecHelpers
|
3
|
+
|
4
|
+
def json_post(endpoint, params)
|
5
|
+
post endpoint, params, "CONTENT_TYPE" => "application/json"
|
6
|
+
end
|
7
|
+
|
8
|
+
def app_root_path
|
9
|
+
Pathname.new(File.expand_path('../../../', __FILE__))
|
10
|
+
end
|
11
|
+
|
12
|
+
def app_tmp_path
|
13
|
+
app_root_path.join('spec/tmp/.mb')
|
14
|
+
end
|
15
|
+
|
16
|
+
def berkshelf_path
|
17
|
+
MB::Berkshelf.default_path
|
18
|
+
end
|
19
|
+
|
20
|
+
def tmp_path
|
21
|
+
app_root_path.join('spec/tmp')
|
22
|
+
end
|
23
|
+
|
24
|
+
def fixtures_path
|
25
|
+
app_root_path.join('spec/fixtures')
|
26
|
+
end
|
27
|
+
|
28
|
+
def clean_tmp_path
|
29
|
+
FileUtils.rm_rf(tmp_path)
|
30
|
+
FileUtils.rm_rf(app_tmp_path)
|
31
|
+
FileUtils.mkdir_p(tmp_path)
|
32
|
+
MB::FileSystem.init
|
33
|
+
end
|
34
|
+
|
35
|
+
def mb_config
|
36
|
+
@mb_config ||= MB::Config.new(nil,
|
37
|
+
{
|
38
|
+
chef: {
|
39
|
+
api_client: "zero",
|
40
|
+
api_key: File.join(fixtures_path, "fake_key.pem"),
|
41
|
+
validator_client: "chef-validator",
|
42
|
+
validator_path: File.join(fixtures_path, "fake_key.pem")
|
43
|
+
},
|
44
|
+
ssh: {
|
45
|
+
user: 'reset',
|
46
|
+
password: 'whatever',
|
47
|
+
keys: []
|
48
|
+
},
|
49
|
+
ef: {
|
50
|
+
api_key: "asdf",
|
51
|
+
api_url: "https://ef.riotgames.com"
|
52
|
+
},
|
53
|
+
rest_gateway: {
|
54
|
+
port: 26101
|
55
|
+
},
|
56
|
+
plugin_manager: {
|
57
|
+
eager_loading: false
|
58
|
+
}
|
59
|
+
}
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
def mb_config_path
|
64
|
+
MB::Config.default_path
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param [String] name
|
68
|
+
# name of the cookbook to generate
|
69
|
+
#
|
70
|
+
# @option options [String] :path
|
71
|
+
# path to the directory to place the cookbook in
|
72
|
+
# @option options [String] :version
|
73
|
+
# version of the cookbook to generate
|
74
|
+
# @option options [Boolean] :with_plugin
|
75
|
+
# should this cookbook include a motherbrain plugin?
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
# path to the generated cookbook
|
79
|
+
def generate_cookbook(name, options = {})
|
80
|
+
options = options.reverse_merge(version: "0.1.0", with_plugin: true)
|
81
|
+
|
82
|
+
cookbook_path = options[:path] || File.join(berkshelf_path, 'cookbooks', "#{name}-#{options[:version]}")
|
83
|
+
|
84
|
+
FileUtils.mkdir_p(cookbook_path)
|
85
|
+
File.open(File.join(cookbook_path, MB::CookbookMetadata::RUBY_FILENAME), 'w+') do |f|
|
86
|
+
f.write <<-EOH
|
87
|
+
name "#{name}"
|
88
|
+
maintainer "Jamie Winsor"
|
89
|
+
maintainer_email "jamie@vialstudios.com"
|
90
|
+
license "Apache 2.0"
|
91
|
+
description "Installs/Configures #{name}"
|
92
|
+
long_description "Installs/Configures #{name}"
|
93
|
+
version "#{options[:version]}"
|
94
|
+
|
95
|
+
%w{ ubuntu centos }.each do |os|
|
96
|
+
supports os
|
97
|
+
end
|
98
|
+
EOH
|
99
|
+
end
|
100
|
+
|
101
|
+
File.open(File.join(cookbook_path, MB::Plugin::PLUGIN_FILENAME), 'w+') do |f|
|
102
|
+
f.write "# #{name} plugin\n"
|
103
|
+
if options[:with_bootstrap]
|
104
|
+
f.write <<-PLUGIN
|
105
|
+
stack_order do
|
106
|
+
bootstrap("#{name}::server")
|
107
|
+
end
|
108
|
+
|
109
|
+
component "#{name}" do
|
110
|
+
description "The #{name} service"
|
111
|
+
group "server" do
|
112
|
+
recipe "#{name}::server"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
PLUGIN
|
116
|
+
end
|
117
|
+
end if options[:with_plugin]
|
118
|
+
|
119
|
+
cookbook_path
|
120
|
+
end
|
121
|
+
|
122
|
+
# @param [String] path
|
123
|
+
#
|
124
|
+
# @return [MB::Config]
|
125
|
+
def generate_valid_config(path = MB::Config.default_path)
|
126
|
+
FileUtils.rm_rf(path)
|
127
|
+
mb_config.save(path)
|
128
|
+
|
129
|
+
mb_config
|
130
|
+
end
|
131
|
+
|
132
|
+
def generate_invalid_config(path)
|
133
|
+
FileUtils.rm_rf(path)
|
134
|
+
File.write(path, "{asdf : }{")
|
135
|
+
end
|
136
|
+
|
137
|
+
def klass
|
138
|
+
described_class
|
139
|
+
end
|
140
|
+
|
141
|
+
def ridley
|
142
|
+
@ridley ||= Ridley::Client.new(mb_config.to_ridley)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|