diff --git a/Dockerfile b/Dockerfile index 4c547b59..7e69595d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,12 +16,13 @@ RUN echo 'deb https://deb.nodesource.com/node_14.x buster main' > /etc/apt/sourc rm -rf /var/lib/apt/lists/* RUN gem update --no-document --system RUN npm install -g conventional-changelog-cli +RUN pip3 install mike mkdocs-material yamllint RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen RUN locale-gen ENV LC_ALL en_US.UTF-8 -RUN pip3 install mike mkdocs-material yamllint +ENV CHEF_LICENSE=accept RUN echo 'deb [trusted=yes] https://packages.chef.io/repos/apt/stable bionic main' > /etc/apt/sources.list.d/chefdk.list && \ curl -s https://packages.chef.io/chef.asc | apt-key add - && \ apt-get update && \ @@ -33,8 +34,7 @@ RUN mkdir -p "$APP_HOME" COPY Gemfile* $APP_HOME/ WORKDIR $APP_HOME -RUN gem install bundler -v "$(cat Gemfile.lock | grep 'BUNDLED WITH' -A2 | tail -n 1)" -RUN bundle install -j 4 +RUN chef exec bundle install -j 4 COPY package.json $APP_HOME/ RUN npm install @@ -49,6 +49,5 @@ COPY README.md $APP_HOME/ COPY metadata.rb $APP_HOME/ COPY Berksfile* $APP_HOME/ -ENV CHEF_LICENSE=accept RUN chef exec berks diff --git a/TESTING.md b/TESTING.md index 58ff4c77..23ed4c19 100644 --- a/TESTING.md +++ b/TESTING.md @@ -4,7 +4,7 @@ ``` docker-compose run --rm -e SKIP="AuthorName AuthorEmail" cookbook \ -bash -c "overcommit --sign && overcommit -r && rspec" +bash -c "chef exec bundle exec overcommit --sign && chef exec bundle exec overcommit -r && chef exec bundle exec rspec" ``` ## Integration Testing diff --git a/spec/unit/recipes/configure_spec.rb b/spec/unit/recipes/configure_spec.rb index a1ef19d4..ad6a8404 100644 --- a/spec/unit/recipes/configure_spec.rb +++ b/spec/unit/recipes/configure_spec.rb @@ -7,23 +7,6 @@ require 'spec_helper' describe 'opsworks_ruby::configure' do - let(:chef_runner) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - solo_node.set['deploy'] = node['deploy'] - solo_node.set['nginx'] = node['nginx'] - end - end - let(:chef_run) do - chef_runner.converge(described_recipe) - end - let(:chef_runner_rhel) do - ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| - solo_node.set['deploy'] = node['deploy'] - end - end - let(:chef_run_rhel) do - chef_runner_rhel.converge(described_recipe) - end let(:monit_installed) { false } before do stub_search(:aws_opsworks_app, '*:*').and_return([aws_opsworks_app]) @@ -32,6 +15,24 @@ end context 'context savvy' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['nginx'] = node['nginx'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'creates shared' do expect(chef_run).to create_directory("/srv/www/#{aws_opsworks_app['shortname']}/shared") end @@ -67,6 +68,23 @@ end context 'Postgresql + Git + Unicorn + Nginx + Rails + Sidekiq' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['nginx'] = node['nginx'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end let(:monit_installed) { true } it 'creates proper database.yml template with connection options' do @@ -79,7 +97,7 @@ end context 'custom database config' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| app_name = aws_opsworks_app['shortname'] solo_node.set['deploy'][app_name]['database'] = { @@ -88,6 +106,9 @@ } end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'creates proper database.yml template when multi-level config is provided' do db_config = { primary: { test: 1 }, secondary: { test: 2 } } @@ -114,7 +135,7 @@ context 'when the logrotate settings are overridden by attributes at various levels of precedence' do let(:logrotate_paths) { %w[/some/path/to/a.log] } - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['defaults']['global']['logrotate_cookbook'] = 'default_global_cookbook' solo_node.set['defaults']['global']['logrotate_template_name'] = 'default_global_template.erb' @@ -142,6 +163,9 @@ solo_node.set['nginx'] = node['nginx'] end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'configures logrotate for the app framework using the provided framework and global settings' do expect(chef_run) @@ -174,6 +198,37 @@ context 'when the set of logrotate paths empty' do let(:logrotate_paths) { [] } + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['defaults']['global']['logrotate_cookbook'] = 'default_global_cookbook' + solo_node.set['defaults']['global']['logrotate_template_name'] = 'default_global_template.erb' + solo_node.set['defaults']['global']['logrotate_template_owner'] = 'me' + solo_node.set['defaults']['global']['logrotate_template_group'] = 'a_group' + solo_node.set['defaults']['global']['logrotate_template_mode'] = '0700' + solo_node.set['defaults']['global']['logrotate_options'] = %w[a b c d] + solo_node.set['defaults']['framework']['logrotate_rotate'] = 60 + solo_node.set['defaults']['framework']['logrotate_template_name'] = 'some_template.erb' + + app_name = aws_opsworks_app['shortname'] + solo_node.set['deploy'][app_name]['global']['logrotate_name'] = 'app_global_name' + solo_node.set['deploy'][app_name]['global']['logrotate_cookbook'] = 'app_global_cookbook' + solo_node.set['deploy'][app_name]['global']['logrotate_rotate'] = 45 + solo_node.set['deploy'][app_name]['global']['logrotate_template_mode'] = '0750' + solo_node.set['deploy'][app_name]['framework']['logrotate_name'] = 'myapp' + solo_node.set['deploy'][app_name]['framework']['logrotate_cookbook'] = 'other_cookbook' + solo_node.set['deploy'][app_name]['framework']['logrotate_log_paths'] = logrotate_paths + solo_node.set['deploy'][app_name]['framework']['logrotate_frequency'] = 'weekly' + solo_node.set['deploy'][app_name]['framework']['logrotate_rotate'] = 15 + solo_node.set['deploy'][app_name]['framework']['logrotate_template_owner'] = 'you' + solo_node.set['deploy'][app_name]['framework']['logrotate_template_mode'] = '0755' + solo_node.set['deploy'][app_name]['framework']['logrotate_options'] = %w[g h i j] + + solo_node.set['nginx'] = node['nginx'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'does not create any logrotate file' do expect(chef_run).not_to enable_logrotate_app('myapp') @@ -495,7 +550,7 @@ end context 'Mysql + Puma + Apache2 + hanami.rb + resque' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'puma' @@ -769,7 +824,7 @@ end context 'rhel' do - let(:chef_run_rhel) do + cached(:chef_run_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'puma' @@ -880,7 +935,7 @@ end context 'Postgres (postgis) + Passenger + Apache2' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['database'] = { @@ -903,7 +958,7 @@ solo_node.set['deploy'] = deploy end end - let(:chef_run) { chef_runner.converge(described_recipe) } + cached(:chef_run) { chef_runner.converge(described_recipe) } before do stub_search(:aws_opsworks_rds_db_instance, '*:*').and_return([]) @@ -986,10 +1041,32 @@ end context 'when default ports are overridden' do - before do - chef_runner.node.set['deploy'][aws_opsworks_app['shortname']]['webserver']['port'] = 8080 - chef_runner.node.set['deploy'][aws_opsworks_app['shortname']]['webserver']['ssl_port'] = 8443 + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['database'] = { + 'adapter' => 'postgis', + 'username' => 'dbuser', + 'password' => '03c1bc98cdd5eb2f9c75', + 'host' => 'dummy-project.c298jfowejf.us-west-2.rds.amazon.com', + 'port' => 3265 + } + deploy['dummy_project']['appserver']['adapter'] = 'passenger' + deploy['dummy_project']['appserver']['max_pool_size'] = 10 + deploy['dummy_project']['appserver']['min_instances'] = 5 + deploy['dummy_project']['appserver']['mount_point'] = '/some/mount/point' + deploy['dummy_project']['appserver']['pool_idle_time'] = 300 + deploy['dummy_project']['appserver']['max_request_queue_size'] = 100 + deploy['dummy_project']['appserver']['error_document'] = { "503": '503.html', "504": '504.html' } + deploy['dummy_project']['appserver']['passenger_max_preloader_idle_time'] = 300 + deploy['dummy_project']['webserver']['adapter'] = 'apache2' + deploy['dummy_project']['webserver']['port'] = 8080 + deploy['dummy_project']['webserver']['ssl_port'] = 8443 + deploy['dummy_project']['global']['environment'] = 'production' + solo_node.set['deploy'] = deploy + end end + cached(:chef_run) { chef_runner.converge(described_recipe) } it 'listens on the specified ports rather than the default ports' do f = "/etc/apache2/sites-available/#{aws_opsworks_app['shortname']}.conf" @@ -1016,13 +1093,13 @@ } ) end - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['deploy'] = dummy_node['deploy'] solo_node.set['nginx'] = node['nginx'] end.converge(described_recipe) end - let(:chef_run_rhel) do + cached(:chef_run_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| solo_node.set['deploy'] = dummy_node['deploy'] solo_node.set['nginx'] = node['nginx'] @@ -1294,7 +1371,7 @@ } }) end - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['deploy'] = supplied_node['deploy'] end.converge(described_recipe) @@ -1330,6 +1407,11 @@ } }) end + cached(:chef_run) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = supplied_node['deploy'] + end.converge(described_recipe) + end before do stub_search(:aws_opsworks_app, '*:*').and_return([aws_opsworks_app(data_sources: [])]) @@ -1349,7 +1431,7 @@ end context 'empty node[\'deploy\']' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['lsb'] = node['lsb'] end.converge(described_recipe) diff --git a/spec/unit/recipes/deploy_spec.rb b/spec/unit/recipes/deploy_spec.rb index b839caaa..dc2d2549 100644 --- a/spec/unit/recipes/deploy_spec.rb +++ b/spec/unit/recipes/deploy_spec.rb @@ -7,19 +7,6 @@ require 'spec_helper' describe 'opsworks_ruby::deploy' do - let(:chef_runner) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - deploy = node['deploy'] - deploy['dummy_project']['source'].delete('ssh_wrapper') - solo_node.set['deploy'] = deploy - end - end - let(:chef_run) do - chef_runner.converge(described_recipe) - end - let(:chef_run_rhel) do - chef_runner_rhel.converge(described_recipe) - end let(:monit_installed) { false } before do stub_search(:aws_opsworks_app, '*:*').and_return([aws_opsworks_app]) @@ -27,25 +14,27 @@ stub_command('which monit').and_return(monit_installed) end - it 'includes recipes' do - expect(chef_run).to include_recipe('opsworks_ruby::configure') - end - context 'DEPRECATION' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['keep_releases'] = 10 solo_node.set['deploy'] = deploy end end - let(:chef_runner_rhel) do + cached(:chef_runner_rhel) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['keep_releases'] = 10 solo_node.set['deploy'] = deploy end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end let(:logs) { [] } before do @@ -71,8 +60,25 @@ end context 'Postgresql + Git + Unicorn + Nginx + Sidekiq' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['source'].delete('ssh_wrapper') + solo_node.set['deploy'] = deploy + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end let(:monit_installed) { true } + it 'includes recipes' do + expect(chef_run).to include_recipe('opsworks_ruby::configure') + end + it 'creates git wrapper script' do expect(chef_run).to create_template('/tmp/ssh-git-wrapper.sh') end @@ -108,7 +114,7 @@ end context 'with nodejs enabled' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'].delete('ssh_wrapper') @@ -119,6 +125,9 @@ solo_node.set['use-nodejs'] = true end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'performs a deploy' do deploy = chef_run.deploy(aws_opsworks_app['shortname']) @@ -156,7 +165,7 @@ end context 'when the location of the generated Git SSH wrapper is overridden' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'].delete('ssh_wrapper') @@ -164,6 +173,9 @@ solo_node.set['deploy'] = deploy end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'creates git wrapper script in the specified location' do expect(chef_run).to create_template('/var/tmp/my-git-ssh-wrapper.sh') @@ -178,7 +190,7 @@ end context 'Puma + S3 + Apache + resque' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'] = { @@ -193,7 +205,7 @@ solo_node.set['deploy'] = deploy end end - let(:chef_runner_rhel) do + cached(:chef_runner_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'] = { @@ -208,6 +220,12 @@ solo_node.set['deploy'] = deploy end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end let(:monit_installed) { true } let(:tmpdir) { '/tmp/opsworks_ruby' } @@ -266,7 +284,7 @@ end context 'Thin + http + delayed_job' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'] = { @@ -280,7 +298,7 @@ solo_node.set['deploy'] = deploy end end - let(:chef_runner_rhel) do + cached(:chef_runner_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['source'] = { @@ -294,6 +312,12 @@ solo_node.set['deploy'] = deploy end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end let(:monit_installed) { true } let(:tmpdir) { '/tmp/opsworks_ruby' } @@ -388,18 +412,17 @@ ]) end - let(:chef_runner) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - solo_node.set['lsb'] = node['lsb'] - solo_node.set['deploy'] = { 'a1' => {} } - solo_node.set['deploy']['a1']['global']['deploy_dir'] = deploy_dir if deploy_dir - solo_node.set['deploy']['a1']['global']['deploy_revision'] = deploy_revision if deploy_revision - end - end context 'when deploy_dir is not specified' do - let(:deploy_dir) { nil } - let(:deploy_revision) { false } + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['lsb'] = node['lsb'] + solo_node.set['deploy'] = { 'a1' => {} } + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'deploys a1 using the default deploy directory of /srv/www' do expect(chef_run).to create_directory('/srv/www/a1/shared') @@ -415,8 +438,16 @@ end context 'when a deploy_dir is specified' do - let(:deploy_dir) { '/some/other/path/to/a1' } - let(:deploy_revision) { false } + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['lsb'] = node['lsb'] + solo_node.set['deploy'] = { 'a1' => {} } + solo_node.set['deploy']['a1']['global']['deploy_dir'] = '/some/other/path/to/a1' + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'deploys a1 using the provided deploy directory instead' do expect(chef_run).to create_directory('/some/other/path/to/a1/shared') diff --git a/spec/unit/recipes/setup_spec.rb b/spec/unit/recipes/setup_spec.rb index 1dee8ccd..89cfd859 100644 --- a/spec/unit/recipes/setup_spec.rb +++ b/spec/unit/recipes/setup_spec.rb @@ -7,24 +7,6 @@ require 'spec_helper' describe 'opsworks_ruby::setup' do - let(:chef_runner) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - solo_node.set['deploy'] = node['deploy'] - solo_node.set['lsb'] = node['lsb'] - end - end - let(:chef_run) do - chef_runner.converge(described_recipe) - end - let(:chef_runner_rhel) do - ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| - solo_node.set['deploy'] = node['deploy'] - end - end - let(:chef_run_rhel) do - chef_runner_rhel.converge(described_recipe) - end - before do stub_search(:aws_opsworks_app, '*:*').and_return([aws_opsworks_app]) stub_search(:aws_opsworks_rds_db_instance, '*:*').and_return([aws_opsworks_rds_db_instance]) @@ -33,16 +15,15 @@ end context 'Patches' do - let(:chef_run) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - solo_node.set['patches'] = { - 'chef12_ssl_fix' => chef12_ssl_fix - } - end.converge(described_recipe) - end - let(:chef12_ssl_fix) { true } - context 'when fix ssl certificates is enabled' do + cached(:chef_run) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['patches'] = { + 'chef12_ssl_fix' => true + } + end.converge(described_recipe) + end + it 'fixes SSL certificates' do expect(chef_run).to create_remote_file('/opt/chef/embedded/ssl/certs/cacert.pem') .with( @@ -55,7 +36,14 @@ end context 'when fix ssl certificates is disabled' do - let(:chef12_ssl_fix) { false } + cached(:chef_run) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['patches'] = { + 'chef12_ssl_fix' => false + } + end.converge(described_recipe) + end + it 'does not fix SSL certificates' do expect(chef_run).not_to create_remote_file('/opt/chef/embedded/ssl/certs/cacert.pem') end @@ -63,6 +51,24 @@ end context 'Chef version' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'not set' do expect(chef_run).not_to create_directory('/opt/aws/opsworks/current/plugins') end @@ -97,6 +103,24 @@ end context 'Deployer' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'debian user' do expect(chef_run).to create_group('deploy').with(gid: 5000) expect(chef_run).to create_user('deploy').with( @@ -119,7 +143,7 @@ end context 'Ruby fullstaq' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['ruby'] = { 'version' => '2.6' } solo_node.set['lsb'] = node['lsb'] @@ -255,6 +279,12 @@ it 'adds fullstaq apt repository' do keyurl = 'https://raw.githubusercontent.com/fullstaq-labs/fullstaq-ruby-server-edition/main/fullstaq-ruby.asc' + chef_run = ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['ruby'] = { 'version' => '3.0' } + solo_node.set['lsb'] = node['lsb'] + solo_node.set['deploy'] = node['deploy'] + solo_node.set['ruby-provider'] = 'fullstaq' + end.converge(described_recipe) expect(chef_run).to add_apt_repository('fullstaq-ruby').with( uri: 'https://apt.fullstaqruby.org', @@ -272,7 +302,7 @@ end context 'rhel' do - let(:chef_run_rhel) do + cached(:chef_run_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| solo_node.set['ruby'] = { 'version' => '2.6' } solo_node.set['lsb'] = node['lsb'] @@ -469,6 +499,24 @@ stub_const('Gem::VERSION', '2.7.8') end + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'debian bundler' do expect(chef_run).to install_gem_package(:bundler).with(version: '~> 1') expect(chef_run).to create_link('/usr/local/bin/bundle').with(to: '/usr/bin/bundle') @@ -485,6 +533,24 @@ stub_const('Gem::VERSION', '3.0.2') end + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'debian bundler' do expect(chef_run).to install_gem_package(:bundler) expect(chef_run).not_to install_gem_package(:bundler).with(version: '~> 1') @@ -500,6 +566,16 @@ end context 'debian preparations' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + it 'javascript-common' do expect(chef_run).to purge_apt_package('javascript-common') end @@ -513,18 +589,50 @@ end context 'epel' do + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'rhel' do expect(chef_run_rhel).to run_execute('yum-config-manager --enable epel') end end context 'apt_repository' do + context 'debian' do - it 'installs the PPA apt repository for Apache2' do - expect(chef_run).to add_apt_repository('apache2') + context 'when use_apache2_ppa is set to true' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + + it 'installs the PPA apt repository for Apache2' do + expect(chef_run).to add_apt_repository('apache2') + end end context 'when use_apache2_ppa is set to false' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + before do chef_runner.node.set['defaults']['webserver']['use_apache2_ppa'] = false end @@ -536,6 +644,15 @@ end context 'rhel' do + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'does not install the PPA apt repository for Apache2' do expect(chef_run_rhel).not_to add_apt_repository('apache2') end @@ -543,6 +660,24 @@ end context 'Postgresql + git + nginx + sidekiq' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + solo_node.set['lsb'] = node['lsb'] + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_runner_rhel) do + ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| + solo_node.set['deploy'] = node['deploy'] + end + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + it 'installs required packages for debian' do expect(chef_run).to install_package('nginx') expect(chef_run).to install_package('zlib1g-dev') @@ -587,7 +722,7 @@ end end - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['webserver']['adapter'] = 'apache2' @@ -597,7 +732,7 @@ end end - let(:chef_runner_rhel) do + cached(:chef_runner_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['webserver']['adapter'] = 'apache2' @@ -607,51 +742,90 @@ end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end + context 'debian' do - let(:chef_runner) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - deploy = node['deploy'] - deploy['dummy_project']['webserver']['adapter'] = 'apache2' - deploy['dummy_project']['webserver']['enable_status'] = false - deploy['dummy_project']['worker']['adapter'] = 'resque' - deploy['dummy_project']['source'] = {} - solo_node.set['deploy'] = deploy + context 'basic' do + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['webserver']['adapter'] = 'apache2' + deploy['dummy_project']['webserver']['enable_status'] = false + deploy['dummy_project']['worker']['adapter'] = 'resque' + deploy['dummy_project']['source'] = {} + solo_node.set['deploy'] = deploy + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) end - end - it 'installs required packages' do - expect(chef_run).to install_package('apache2') - expect(chef_run).to install_package('bzip2') - expect(chef_run).to install_package('git') - expect(chef_run).to install_package('gzip') - expect(chef_run).not_to install_package('libapache2-mod-passenger') - expect(chef_run).to install_package('libmysqlclient-dev') - expect(chef_run).to install_package('monit') - expect(chef_run).to install_package('p7zip') - expect(chef_run).to install_package('redis-server') - expect(chef_run).to install_package('tar') - expect(chef_run).to install_package('unzip') - expect(chef_run).to install_package('xz-utils') - end + it 'installs required packages' do + expect(chef_run).to install_package('apache2') + expect(chef_run).to install_package('bzip2') + expect(chef_run).to install_package('git') + expect(chef_run).to install_package('gzip') + expect(chef_run).not_to install_package('libapache2-mod-passenger') + expect(chef_run).to install_package('libmysqlclient-dev') + expect(chef_run).to install_package('monit') + expect(chef_run).to install_package('p7zip') + expect(chef_run).to install_package('redis-server') + expect(chef_run).to install_package('tar') + expect(chef_run).to install_package('unzip') + expect(chef_run).to install_package('xz-utils') + end - it 'defines service which starts apache2' do - expect(chef_run).to start_service('apache2') - end + it 'defines service which starts apache2' do + expect(chef_run).to start_service('apache2') + end - Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| - it "enables Apache2 module #{mod}" do - expect(chef_run).to run_execute("a2enmod #{mod}") + Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| + it "enables Apache2 module #{mod}" do + expect(chef_run).to run_execute("a2enmod #{mod}") + end end - end - Drivers::Webserver::Apache2::DISABLE_MODULES.each do |mod| - it "disables Apache2 module #{mod}" do - expect(chef_run).to run_execute("a2dismod #{mod}") + Drivers::Webserver::Apache2::DISABLE_MODULES.each do |mod| + it "disables Apache2 module #{mod}" do + expect(chef_run).to run_execute("a2dismod #{mod}") + end end end context 'when the modules to enable are already enabled' do let(:modules_to_enable_are_enabled) { true } + before do + stub_search(:aws_opsworks_app, '*:*') + .and_return([aws_opsworks_app(app_source: { type: 's3', url: 'http://example.com' })]) + stub_search(:aws_opsworks_rds_db_instance, '*:*').and_return([aws_opsworks_rds_db_instance(engine: 'mysql')]) + Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| + stub_command("a2enmod #{mod}").and_return(true) + stub_command("a2query -m #{mod}").and_return(modules_to_enable_are_enabled) + end + Drivers::Webserver::Apache2::DISABLE_MODULES.each do |mod| + stub_command("a2dismod #{mod}").and_return(true) + stub_command("a2query -m #{mod}").and_return(modules_to_disable_are_enabled) + end + end + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['webserver']['adapter'] = 'apache2' + deploy['dummy_project']['webserver']['enable_status'] = false + deploy['dummy_project']['worker']['adapter'] = 'resque' + deploy['dummy_project']['source'] = {} + solo_node.set['deploy'] = deploy + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| it "does not enable Apache2 module #{mod} again unnecessarily" do @@ -662,6 +836,32 @@ context 'when the modules to disable are already disabled' do let(:modules_to_disable_are_enabled) { false } + before do + stub_search(:aws_opsworks_app, '*:*') + .and_return([aws_opsworks_app(app_source: { type: 's3', url: 'http://example.com' })]) + stub_search(:aws_opsworks_rds_db_instance, '*:*').and_return([aws_opsworks_rds_db_instance(engine: 'mysql')]) + Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| + stub_command("a2enmod #{mod}").and_return(true) + stub_command("a2query -m #{mod}").and_return(modules_to_enable_are_enabled) + end + Drivers::Webserver::Apache2::DISABLE_MODULES.each do |mod| + stub_command("a2dismod #{mod}").and_return(true) + stub_command("a2query -m #{mod}").and_return(modules_to_disable_are_enabled) + end + end + cached(:chef_runner) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['webserver']['adapter'] = 'apache2' + deploy['dummy_project']['webserver']['enable_status'] = false + deploy['dummy_project']['worker']['adapter'] = 'resque' + deploy['dummy_project']['source'] = {} + solo_node.set['deploy'] = deploy + end + end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end Drivers::Webserver::Apache2::ENABLE_MODULES.each do |mod| it "does not disable Apache2 module #{mod} again unnecessarily" do @@ -671,7 +871,7 @@ end context 'when enable_status is set to true' do - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| app_name = aws_opsworks_app['shortname'] solo_node.set['deploy'][app_name]['webserver'] = { @@ -680,6 +880,9 @@ } end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'does not disable Apache2 module status' do expect(chef_run).not_to run_execute('a2dismod status') @@ -720,6 +923,9 @@ chef_runner.node.set['deploy']['dummy_project']['appserver']['adapter'] = 'passenger' chef_runner.node.set['defaults']['appserver']['passenger_version'] = '1.2.3' end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end it 'activates the passenger APT repo' do expect(chef_run).to add_apt_repository('passenger') @@ -734,6 +940,9 @@ before do chef_runner_rhel.node.set['deploy']['dummy_project']['appserver']['adapter'] = 'passenger' end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end it 'raises an exception' do expect { chef_run_rhel }.to raise_error(ArgumentError, 'passenger appserver only supported on Debian/Ubuntu') @@ -749,17 +958,23 @@ temp_node['dummy_project']['worker']['adapter'] = 'delayed_job' temp_node['dummy_project']['source'] = {} - let(:chef_runner) do + cached(:chef_runner) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['deploy'] = temp_node solo_node.set['lsb'] = node['lsb'] end end - let(:chef_runner_rhel) do + cached(:chef_runner_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2015.03') do |solo_node| solo_node.set['deploy'] = temp_node end end + cached(:chef_run) do + chef_runner.converge(described_recipe) + end + cached(:chef_run_rhel) do + chef_runner_rhel.converge(described_recipe) + end before do stub_search(:aws_opsworks_app, '*:*') diff --git a/spec/unit/recipes/shutdown_spec.rb b/spec/unit/recipes/shutdown_spec.rb index a6841937..7ad9edf2 100644 --- a/spec/unit/recipes/shutdown_spec.rb +++ b/spec/unit/recipes/shutdown_spec.rb @@ -7,7 +7,7 @@ require 'spec_helper' describe 'opsworks_ruby::shutdown' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| solo_node.set['deploy'] = node['deploy'] end.converge(described_recipe) diff --git a/spec/unit/recipes/undeploy_spec.rb b/spec/unit/recipes/undeploy_spec.rb index e0120d1f..9ab1019c 100644 --- a/spec/unit/recipes/undeploy_spec.rb +++ b/spec/unit/recipes/undeploy_spec.rb @@ -7,19 +7,20 @@ require 'spec_helper' describe 'opsworks_ruby::undeploy' do - let(:chef_run) do - ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| - deploy = node['deploy'] - deploy['dummy_project']['source'].delete('ssh_wrapper') - solo_node.set['deploy'] = deploy - end.converge(described_recipe) - end before do stub_search(:aws_opsworks_app, '*:*').and_return([aws_opsworks_app]) stub_search(:aws_opsworks_rds_db_instance, '*:*').and_return([aws_opsworks_rds_db_instance]) end context 'Postgresql + Git + Unicorn + Nginx + Sidekiq' do + cached(:chef_run) do + ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| + deploy = node['deploy'] + deploy['dummy_project']['source'].delete('ssh_wrapper') + solo_node.set['deploy'] = deploy + end.converge(described_recipe) + end + it 'performs a rollback' do undeploy = chef_run.deploy(aws_opsworks_app['shortname']) service = chef_run.service('nginx') @@ -38,7 +39,7 @@ end context 'Puma + Apache + resque' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'puma' @@ -47,7 +48,7 @@ solo_node.set['deploy'] = deploy end.converge(described_recipe) end - let(:chef_run_rhel) do + cached(:chef_run_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'puma' @@ -78,7 +79,7 @@ end context 'Thin + delayed_job' do - let(:chef_run) do + cached(:chef_run) do ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'thin' @@ -86,7 +87,7 @@ solo_node.set['deploy'] = deploy end.converge(described_recipe) end - let(:chef_run_rhel) do + cached(:chef_run_rhel) do ChefSpec::SoloRunner.new(platform: 'amazon', version: '2016.03') do |solo_node| deploy = node['deploy'] deploy['dummy_project']['appserver']['adapter'] = 'thin'