chef_backup 0.0.1.dev.4 → 0.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94cbd6726cb86fe838709bb6cd0102f18ff98a02
4
- data.tar.gz: 7a38dd28ef497ae4b1ec8a59adb22634e28f2fc4
3
+ metadata.gz: 3aaeca0a04fa4fe4ee8443b47d5f9295929d201d
4
+ data.tar.gz: 82f06bbc30bff3a57c235d98012f0a251498af9c
5
5
  SHA512:
6
- metadata.gz: 4f1c58f55e246331ab7cc8c9919f6e9dafaba9922d4c597e5546bd59701634e3766461d4e58f3efffcea09cf1267724e52d3f11b4b9fc6b37be68eecdc1664b4
7
- data.tar.gz: af600e295428765fb2e8bd0316039108a1133c5fd7a82ea8df83b1c518019c965a4239935cc9625010522b2bc82ff23aab588ab4afc9f0f24e06a0ebac846478
6
+ metadata.gz: 688f33e0046368ac2c35dcf7dce9ae9f474cf5e8d8628651c105af4c709769fe7728e5e4a8fd66d530f0e2ad82577039bd42874ffdb34b4a168b563045460b1f
7
+ data.tar.gz: 3c965dbc203fd45876c38d051cc2427ba67e9a8a97c38db7b947f85d2d4e277de620a06dd0fa9a7bf29f04eec327787006e17679e2b6140e84445f36e1e9dac0
@@ -28,6 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
29
  spec.add_development_dependency 'guard-rspec'
30
30
  spec.add_development_dependency 'pry-rescue'
31
- spec.add_development_dependency 'rubocop', '>= 0.32.1'
31
+ spec.add_development_dependency 'rubocop', '~> 0.37.2'
32
32
  spec.add_development_dependency 'simplecov'
33
33
  end
@@ -7,11 +7,16 @@ module ChefBackup
7
7
  class Config
8
8
  extend Forwardable
9
9
 
10
+ DEFAULT_BASE = 'private_chef'.freeze
10
11
  DEFAULT_CONFIG = {
11
12
  'backup' => {
12
13
  'always_dump_db' => true,
13
14
  'strategy' => 'none',
14
- 'export_dir' => '/var/opt/chef-backup'
15
+ 'export_dir' => '/var/opt/chef-backup',
16
+ 'project_name' => 'opscode',
17
+ 'ctl-command' => 'chef-server-ctl',
18
+ 'running_filepath' => '/etc/opscode/chef-server-running.json',
19
+ 'database_name' => 'opscode_chef'
15
20
  }
16
21
  }.freeze
17
22
 
@@ -45,13 +50,18 @@ module ChefBackup
45
50
  # @param config [Hash] a Hash of the private-chef-running.json
46
51
  #
47
52
  def initialize(config = {})
48
- config['private_chef'] ||= {}
49
- config['private_chef']['backup'] ||= {}
50
- config['private_chef']['backup'] =
51
- DEFAULT_CONFIG['backup'].merge(config['private_chef']['backup'])
53
+ config['config_base'] ||= DEFAULT_BASE
54
+ base = config['config_base']
55
+ config[base] ||= {}
56
+ config[base]['backup'] ||= {}
57
+ config[base]['backup'] = DEFAULT_CONFIG['backup'].merge(config[base]['backup'])
52
58
  @config = config
53
59
  end
54
60
 
61
+ def to_hash
62
+ @config
63
+ end
64
+
55
65
  def_delegators :@config, :[], :[]=
56
66
  end
57
67
  end
@@ -9,23 +9,62 @@ module ChefBackup
9
9
  module Helpers
10
10
  # rubocop:enable IndentationWidth
11
11
 
12
- SERVER_ADD_ONS = %w(
13
- opscode-manage
14
- opscode-reporting
15
- opscode-push-jobs-server
16
- opscode-analytics
17
- chef-ha
18
- chef-sync
19
- ).freeze
20
-
21
- def private_chef
22
- config['private_chef']
23
- end
12
+ SERVER_ADD_ONS = {
13
+ 'opscode-manage' => {
14
+ 'config_file' => '/etc/opscode-manage/manage.rb',
15
+ 'ctl_command' => 'opscode-manage-ctl'
16
+ },
17
+ 'opscode-reporting' => {
18
+ 'config_file' => '/etc/opscode-reporting/opscode-reporting.rb',
19
+ 'ctl_command' => 'opscode-reporting-ctl'
20
+ },
21
+ 'opscode-push-jobs-server' => {
22
+ 'config_file' => '/etc/opscode-push-jobs-server/opscode-push-jobs-server.rb',
23
+ 'ctl_command' => 'opscode-push-jobs-server-ctl'
24
+ },
25
+ 'opscode-analytics' => {
26
+ 'config_file' => '/etc/opscode-analytics/opscode-analytics.rb',
27
+ 'ctl_command' => 'opscode-analytics-ctl'
28
+ },
29
+ 'chef-ha' => {
30
+ 'config_file' => 'etc/opscode/chef-server.rb'
31
+ },
32
+ 'chef-sync' => {
33
+ 'config_file' => '/etc/chef-sync/chef-sync.rb',
34
+ 'ctl_command' => 'chef-sync-ctl'
35
+ },
36
+ 'chef-marketplace' => {
37
+ 'config_file' => '/etc/chef-marketplace/marketplace.rb',
38
+ 'ctl_command' => 'chef-marketplace-ctl'
39
+ }
40
+ }.freeze
41
+
42
+ DEFAULT_PG_OPTIONS = '-c statement_timeout=3600000'.freeze
24
43
 
25
44
  def config
26
45
  ChefBackup::Config
27
46
  end
28
47
 
48
+ def config_base
49
+ ChefBackup::Config['config_base']
50
+ end
51
+
52
+ def service_config
53
+ ChefBackup::Config[config_base]
54
+ end
55
+
56
+ def ctl_command
57
+ service_config['backup']['ctl-command']
58
+ end
59
+
60
+ def running_filepath
61
+ service_config['backup']['running_filepath']
62
+ end
63
+
64
+ def database_name
65
+ service_config['backup']['database_name']
66
+ end
67
+
29
68
  def log(message, level = :info)
30
69
  ChefBackup::Logger.logger.log(message, level)
31
70
  end
@@ -38,7 +77,7 @@ module Helpers
38
77
  # @return [TrueClass, FalseClass]
39
78
  #
40
79
  def ensure_file!(file, exception, message)
41
- File.exist?(file) ? true : fail(exception, message)
80
+ File.exist?(file) ? true : raise(exception, message)
42
81
  end
43
82
 
44
83
  def shell_out(*command)
@@ -54,8 +93,32 @@ module Helpers
54
93
  cmd
55
94
  end
56
95
 
96
+ def project_name
97
+ service_config['backup']['project_name']
98
+ end
99
+
100
+ def base_install_dir
101
+ "/opt/#{project_name}"
102
+ end
103
+
104
+ def base_config_dir
105
+ "/etc/#{project_name}"
106
+ end
107
+
108
+ def chpst
109
+ "#{base_install_dir}/embedded/bin/chpst"
110
+ end
111
+
112
+ def pgsql
113
+ "#{base_install_dir}/embedded/bin/psql"
114
+ end
115
+
116
+ def pg_options
117
+ config['pg_options'] || DEFAULT_PG_OPTIONS
118
+ end
119
+
57
120
  def all_services
58
- Dir['/opt/opscode/sv/*'].map { |f| File.basename(f) }.sort
121
+ Dir["#{base_install_dir}/sv/*"].map { |f| File.basename(f) }.sort
59
122
  end
60
123
 
61
124
  def enabled_services
@@ -67,16 +130,16 @@ module Helpers
67
130
  end
68
131
 
69
132
  def service_enabled?(service)
70
- File.symlink?("/opt/opscode/service/#{service}")
133
+ File.symlink?("#{base_install_dir}/service/#{service}")
71
134
  end
72
135
 
73
136
  def stop_service(service)
74
- res = shell_out("chef-server-ctl stop #{service}")
137
+ res = shell_out("#{ctl_command} stop #{service}")
75
138
  res
76
139
  end
77
140
 
78
141
  def start_service(service)
79
- res = shell_out("chef-server-ctl start #{service}")
142
+ res = shell_out("#{ctl_command} start #{service}")
80
143
  res
81
144
  end
82
145
 
@@ -92,32 +155,55 @@ module Helpers
92
155
  enabled_services.each { |sv| start_service(sv) }
93
156
  end
94
157
 
95
- def enabled_addons
96
- SERVER_ADD_ONS.select { |service| addon?(service) }
158
+ def restart_chef_server
159
+ shell_out("#{ctl_command} restart #{service}")
97
160
  end
98
161
 
99
- def addon?(service)
100
- File.directory?("/etc/#{service}")
162
+ def reconfigure_add_ons
163
+ enabled_addons.each do |_name, config|
164
+ shell_out("#{config['ctl_command']} reconfigure") if config.key?('ctl_command')
165
+ end
166
+ end
167
+
168
+ def restart_add_ons
169
+ enabled_addons.each do |_name, config|
170
+ shell_out("#{config['ctl_command']} restart") if config.key?('ctl_command')
171
+ end
172
+ end
173
+
174
+ def reconfigure_marketplace
175
+ log 'Setting up Chef Marketplace'
176
+ shell_out('chef-marketplace-ctl reconfigure')
177
+ end
178
+
179
+ def enabled_addons
180
+ SERVER_ADD_ONS.select do |_name, config|
181
+ begin
182
+ File.directory?(File.dirname(config['config_file']))
183
+ rescue
184
+ false
185
+ end
186
+ end
101
187
  end
102
188
 
103
189
  def strategy
104
- private_chef['backup']['strategy']
190
+ service_config['backup']['strategy']
105
191
  end
106
192
 
107
193
  def topology
108
- private_chef['topology']
194
+ service_config['topology']
109
195
  end
110
196
 
111
197
  def frontend?
112
- private_chef['role'] == 'frontend'
198
+ service_config['role'] == 'frontend'
113
199
  end
114
200
 
115
201
  def backend?
116
- private_chef['role'] =~ /backend|standalone/
202
+ service_config['role'] =~ /backend|standalone/
117
203
  end
118
204
 
119
205
  def online?
120
- private_chef['backup']['mode'] == 'online'
206
+ service_config['backup']['mode'] == 'online'
121
207
  end
122
208
 
123
209
  def ha?
@@ -132,10 +218,14 @@ module Helpers
132
218
  topology == 'standalone'
133
219
  end
134
220
 
221
+ def marketplace?
222
+ shell_out('which chef-marketplace-ctl').exitstatus == 0
223
+ end
224
+
135
225
  def tmp_dir
136
226
  @tmp_dir ||= begin
137
227
  dir = safe_key { config['tmp_dir'] } ||
138
- safe_key { private_chef['backup']['tmp_dir'] }
228
+ safe_key { service_config['backup']['tmp_dir'] }
139
229
  if dir
140
230
  FileUtils.mkdir_p(dir) unless File.directory?(dir)
141
231
  dir
@@ -17,7 +17,7 @@ module ChefBackup
17
17
  #
18
18
  def initialize(running_config)
19
19
  ChefBackup::Config.config = running_config
20
- ChefBackup::Logger.logger(private_chef['backup']['logfile'] || nil)
20
+ ChefBackup::Logger.logger(service_config['backup']['logfile'] || nil)
21
21
  end
22
22
 
23
23
  #
@@ -28,6 +28,13 @@ module ChefBackup
28
28
  @backup.backup
29
29
  end
30
30
 
31
+ #
32
+ # @return [ChefBackup::Config]
33
+ #
34
+ def config
35
+ ChefBackup::Config.config
36
+ end
37
+
31
38
  #
32
39
  # @return [TrueClass, FalseClass] Execute Chef Server restore
33
40
  #
@@ -40,7 +47,7 @@ module ChefBackup
40
47
  # @return [String] String name of the configured backup strategy
41
48
  #
42
49
  def backup_strategy
43
- config['private_chef']['backup']['strategy']
50
+ service_config['backup']['strategy']
44
51
  end
45
52
 
46
53
  #
@@ -62,7 +69,7 @@ module ChefBackup
62
69
  elsif ebs_snapshot?
63
70
  'ebs'
64
71
  else
65
- fail InvalidStrategy, "#{restore_param} is not a valid backup"
72
+ raise InvalidStrategy, "#{restore_param} is not a valid backup"
66
73
  end
67
74
  end
68
75
  end
@@ -27,8 +27,8 @@ class TarBackup
27
27
  def export_dir
28
28
  @export_dir ||= begin
29
29
  dir =
30
- if private_chef['backup']['export_dir']
31
- private_chef['backup']['export_dir']
30
+ if service_config['backup']['export_dir']
31
+ service_config['backup']['export_dir']
32
32
  else
33
33
  msg = ["backup['export_dir'] has not been set.",
34
34
  'defaulting to: /var/opt/chef-backups'].join(' ')
@@ -47,24 +47,38 @@ class TarBackup
47
47
  #
48
48
  def dump_db
49
49
  return true unless pg_dump?
50
- pg_user = private_chef['postgresql']['username']
50
+ if external_pg?
51
+ log('Cannot backup external postgresql', :warn)
52
+ return false
53
+ end
54
+ pg_user = service_config['postgresql']['username']
51
55
  sql_file = "#{tmp_dir}/chef_backup-#{backup_time}.sql"
52
- cmd = ['/opt/opscode/embedded/bin/chpst',
56
+ cmd = [chpst,
53
57
  "-u #{pg_user}",
54
- '/opt/opscode/embedded/bin/pg_dumpall',
58
+ pg_dumpall,
55
59
  "> #{sql_file}"
56
60
  ].join(' ')
57
61
  log "Dumping Postgresql database to #{sql_file}"
58
- shell_out!(cmd)
62
+ shell_out!(cmd, env: ["PGOPTIONS=#{pg_options}"])
59
63
  data_map.services['postgresql']['pg_dump_success'] = true
60
64
  data_map.services['postgresql']['username'] = pg_user
61
65
  true
62
66
  end
63
67
 
68
+ def chpst
69
+ "#{base_install_dir}/embedded/bin/chpst"
70
+ end
71
+
72
+ def pg_dumpall
73
+ "#{base_install_dir}/embedded/bin/pg_dumpall"
74
+ end
75
+
64
76
  def populate_data_map
65
- stateful_services.each do |service|
66
- next unless private_chef.key?(service)
67
- data_map.add_service(service, private_chef[service]['data_dir'])
77
+ unless config_only?
78
+ stateful_services.each do |service|
79
+ next unless service_config.key?(service)
80
+ data_map.add_service(service, service_config[service]['data_dir'])
81
+ end
68
82
  end
69
83
 
70
84
  config_directories.each do |config|
@@ -72,14 +86,14 @@ class TarBackup
72
86
  end
73
87
 
74
88
  # Don't forget the upgrades!
75
- if private_chef.key?('upgrades')
76
- data_map.add_service('upgrades', private_chef['upgrades']['dir'])
89
+ if service_config.key?('upgrades')
90
+ data_map.add_service('upgrades', service_config['upgrades']['dir'])
77
91
  end
78
92
 
79
- if ha?
80
- data_map.add_service('keepalived', private_chef['keepalived']['dir'])
81
- data_map.add_ha_info('provider', private_chef['ha']['provider'])
82
- data_map.add_ha_info('path', private_chef['ha']['path'])
93
+ if ha? && !config_only?
94
+ data_map.add_service('keepalived', service_config['keepalived']['dir'])
95
+ data_map.add_ha_info('provider', service_config['ha']['provider'])
96
+ data_map.add_ha_info('path', service_config['ha']['path'])
83
97
  end
84
98
  end
85
99
 
@@ -94,22 +108,25 @@ class TarBackup
94
108
  end
95
109
  end
96
110
 
111
+ DEFAULT_STATEFUL_SERVICES = %w(rabbitmq
112
+ opscode-solr4
113
+ elasticsearch
114
+ redis_lb
115
+ postgresql
116
+ bookshelf).freeze
117
+
97
118
  def stateful_services
98
- if private_chef.key?('drbd') && private_chef['drbd']['enable'] == true
119
+ if service_config.key?('drbd') && service_config['drbd']['enable'] == true
99
120
  ['drbd']
100
121
  else
101
- %w(
102
- rabbitmq
103
- opscode-solr4
104
- redis_lb
105
- postgresql
106
- bookshelf
107
- )
122
+ DEFAULT_STATEFUL_SERVICES.select do |service|
123
+ service_enabled?(service)
124
+ end
108
125
  end
109
126
  end
110
127
 
111
128
  def config_directories
112
- %w(opscode) + enabled_addons
129
+ [project_name] + enabled_addons.keys
113
130
  end
114
131
 
115
132
  # The data_map is a working record of all of the data that is backed up.
@@ -123,25 +140,27 @@ class TarBackup
123
140
 
124
141
  def not_implemented
125
142
  msg = "#{caller[0].split[1]} is not implemented for this strategy"
126
- fail NotImplementedError, msg
143
+ raise NotImplementedError, msg
127
144
  end
128
145
 
129
146
  def backup
130
- log 'Starting Chef Server backup'
147
+ log "Starting Chef Server backup #{config_only? ? '(config only)' : ''}"
131
148
  populate_data_map
132
- if backend?
149
+ stopped = false
150
+ if backend? && !config_only?
133
151
  if !online?
134
152
  ask_to_go_offline unless offline_permission_granted?
135
153
  stop_chef_server(except: [:keepalived, :postgresql])
136
154
  dump_db
137
155
  stop_service(:postgresql)
156
+ stopped = true
138
157
  else
139
158
  dump_db
140
159
  end
141
160
  end
142
161
  write_manifest
143
162
  create_tarball
144
- start_chef_server if backend? && !online?
163
+ start_chef_server if stopped
145
164
  export_tarball
146
165
  cleanup
147
166
  log 'Backup Complete!'
@@ -156,7 +175,7 @@ class TarBackup
156
175
  def create_tarball
157
176
  log 'Creating backup tarball'
158
177
  cmd = [
159
- "tar -czf #{tmp_dir}/chef-backup-#{backup_time}.tgz",
178
+ "tar -czf #{tmp_dir}/#{export_filename}",
160
179
  data_map.services.map { |_, v| v['data_dir'] }.compact.join(' '),
161
180
  data_map.configs.map { |_, v| v['data_dir'] }.compact.join(' '),
162
181
  Dir["#{tmp_dir}/*"].map { |f| File.basename(f) }.join(' ')
@@ -168,19 +187,40 @@ class TarBackup
168
187
 
169
188
  def export_tarball
170
189
  log "Exporting tarball to #{export_dir}"
171
- cmd = "rsync -chaz #{tmp_dir}/chef-backup-#{backup_time}.tgz #{export_dir}/"
190
+ cmd = "rsync -chaz #{tmp_dir}/#{export_filename} #{export_dir}/"
172
191
 
173
192
  res = shell_out(cmd)
174
193
  res
175
194
  end
176
195
 
196
+ def export_filename
197
+ postfix = if config_only?
198
+ '-config'
199
+ else
200
+ ''
201
+ end
202
+ "chef-backup#{postfix}-#{backup_time}.tgz"
203
+ end
204
+
205
+ def service_enabled?(service)
206
+ service_config[service] && service_config[service]['enable'] && !service_config[service]['external']
207
+ end
208
+
209
+ def external_pg?
210
+ service_config['postgresql']['external']
211
+ end
212
+
177
213
  def pg_dump?
178
214
  # defaults to true
179
- private_chef['backup']['always_dump_db']
215
+ service_config['backup']['always_dump_db']
180
216
  end
181
217
 
182
218
  def offline_permission_granted?
183
- private_chef['backup']['agree_to_go_offline']
219
+ service_config['backup']['agree_to_go_offline']
220
+ end
221
+
222
+ def config_only?
223
+ service_config['backup']['config_only']
184
224
  end
185
225
 
186
226
  def ask_to_go_offline
@@ -15,18 +15,19 @@ class TarRestore
15
15
  extend Forwardable
16
16
 
17
17
  attr_accessor :tarball_path
18
+ attr_writer :manifest
18
19
 
19
20
  def_delegators :@log, :log
20
21
 
21
22
  def initialize(path)
22
23
  @tarball_path = path
23
- @log = ChefBackup::Logger.logger(private_chef['backup']['logfile'] || nil)
24
+ @log = ChefBackup::Logger.logger(service_config['backup']['logfile'] || nil)
24
25
  end
25
26
 
26
27
  def restore
27
28
  log 'Restoring Chef Server from backup'
28
29
  cleanse_chef_server(config['agree_to_cleanse'])
29
- if manifest['topology'] == 'ha'
30
+ if ha?
30
31
  log 'Performing HA restore - please ensure that keepalived is not running on the standby host'
31
32
  fix_ha_plugins
32
33
  check_ha_volume
@@ -35,10 +36,13 @@ class TarRestore
35
36
  restore_configs
36
37
  restore_services unless frontend?
37
38
  touch_sentinel
39
+ reconfigure_marketplace if marketplace?
38
40
  reconfigure_server
39
41
  update_config
40
42
  import_db if restore_db_dump?
41
43
  start_chef_server
44
+ reconfigure_add_ons
45
+ restart_add_ons
42
46
  cleanup
43
47
  log 'Restoration Completed!'
44
48
  end
@@ -64,15 +68,15 @@ class TarRestore
64
68
  "chef_backup-#{manifest['backup_time']}.sql")
65
69
  ensure_file!(sql_file, InvalidDatabaseDump, "#{sql_file} not found")
66
70
 
67
- cmd = ['/opt/opscode/embedded/bin/chpst',
71
+ cmd = [chpst,
68
72
  "-u #{manifest['services']['postgresql']['username']}",
69
- '/opt/opscode/embedded/bin/psql',
73
+ pgsql,
70
74
  "-U #{manifest['services']['postgresql']['username']}",
71
- '-d opscode_chef',
75
+ "-d #{database_name}",
72
76
  "< #{sql_file}"
73
77
  ].join(' ')
74
78
  log 'Importing Database dump'
75
- shell_out!(cmd)
79
+ shell_out!(cmd, env: ["PGOPTIONS=#{pg_options}"])
76
80
  end
77
81
 
78
82
  def restore_services
@@ -123,7 +127,7 @@ class TarRestore
123
127
  ha_data_dir = manifest['ha']['path']
124
128
 
125
129
  unless ha_data_dir_mounted?(ha_data_dir)
126
- fail "Please mount the data directory #{ha_data_dir} and perform any DRBD configuration before continuing"
130
+ raise "Please mount the data directory #{ha_data_dir} and perform any DRBD configuration before continuing"
127
131
  end
128
132
  end
129
133
 
@@ -139,17 +143,17 @@ class TarRestore
139
143
 
140
144
  def reconfigure_server
141
145
  log 'Reconfiguring the Chef Server'
142
- shell_out('chef-server-ctl reconfigure')
146
+ shell_out("#{ctl_command} reconfigure")
143
147
  end
144
148
 
145
149
  def cleanse_chef_server(agree)
146
150
  log 'Cleaning up any old files'
147
- shell_out!("chef-server-ctl cleanse #{agree || ''}")
151
+ shell_out!("#{ctl_command} cleanse #{agree || ''}")
148
152
  end
149
153
 
150
154
  def running_config
151
155
  @running_config ||=
152
- JSON.parse(File.read('/etc/opscode/chef-server-running.json')) || {}
156
+ JSON.parse(File.read(running_filepath)) || {}
153
157
  end
154
158
 
155
159
  def update_config
@@ -1,4 +1,4 @@
1
1
  # ChefBackup module
2
2
  module ChefBackup
3
- VERSION = '0.0.1.dev.4'
3
+ VERSION = '0.0.1'.freeze
4
4
  end
@@ -17,11 +17,6 @@ def private_chef!(args = {})
17
17
  ChefBackup::Config.config = args
18
18
  end
19
19
 
20
- # Merge attributes into existing cli_args
21
- def cli_args(*args)
22
- Chef::Mixin::DeepMerge.deep_merge!(*args, ChefBackup::Config.config)
23
- end
24
-
25
20
  # Overwrite config with given CLI args
26
21
  def cli_args!(args)
27
22
  ChefBackup::Config.config = args
@@ -26,6 +26,15 @@ describe ChefBackup::Strategy::TarBackup do
26
26
  allow(subject).to receive(:dump_db).and_return(true)
27
27
  end
28
28
 
29
+ context 'when config_only is true' do
30
+ before do
31
+ private_chef('backup' => { 'config_only' => true })
32
+ end
33
+
34
+ it_behaves_like 'a tar based backup'
35
+ it_behaves_like 'a tar based frontend'
36
+ end
37
+
29
38
  context 'on a frontend' do
30
39
  before { private_chef('role' => 'frontend') }
31
40
 
@@ -98,13 +107,14 @@ describe ChefBackup::Strategy::TarBackup do
98
107
  ].join(' ')
99
108
  end
100
109
 
110
+ let(:pg_options) { ["PGOPTIONS=#{ChefBackup::Helpers::DEFAULT_PG_OPTIONS}"] }
101
111
  let(:tmp_dir) { '/tmp/notaswear' }
102
112
  let(:backup_time) { Time.now }
103
113
 
104
114
  before do
105
115
  allow(subject).to receive(:tmp_dir).and_return(tmp_dir)
106
116
  allow(subject).to receive(:backup_time).and_return(backup_time)
107
- allow(subject).to receive(:shell_out!).with(dump_cmd).and_return(true)
117
+ allow(subject).to receive(:shell_out!).with(dump_cmd, env: pg_options).and_return(true)
108
118
  private_chef('postgresql' => { 'username' => 'opscode-pgsql' })
109
119
  subject.data_map.add_service('postgresql', '/data/dir')
110
120
  end
@@ -116,7 +126,7 @@ describe ChefBackup::Strategy::TarBackup do
116
126
  end
117
127
 
118
128
  it 'dumps the db' do
119
- expect(subject).to receive(:shell_out!).with(dump_cmd)
129
+ expect(subject).to receive(:shell_out!).with(dump_cmd, env: pg_options)
120
130
  subject.dump_db
121
131
  end
122
132
 
@@ -181,12 +191,13 @@ describe ChefBackup::Strategy::TarBackup do
181
191
 
182
192
  describe '.write_manifest' do
183
193
  let(:manifest) do
184
- { 'some' => {
185
- 'nested' => {
186
- 'hash' => true
187
- },
188
- 'another' => true
189
- }
194
+ { 'some' =>
195
+ {
196
+ 'nested' => {
197
+ 'hash' => true
198
+ },
199
+ 'another' => true
200
+ }
190
201
  }
191
202
  end
192
203
 
@@ -269,6 +280,28 @@ describe ChefBackup::Strategy::TarBackup do
269
280
  end
270
281
  end
271
282
 
283
+ context 'when config_only is true' do
284
+ before do
285
+ private_chef('role' => 'standalone', 'backup' => { 'config_only' => true })
286
+ data_mock = double('DataMap')
287
+ allow(subject).to receive(:data_map).and_return(data_mock)
288
+ end
289
+
290
+ it 'populates the data map with config and upgrade directories only' do
291
+ configs.each do |config|
292
+ expect(subject.data_map)
293
+ .to receive(:add_config)
294
+ .with(config, "/etc/#{config}")
295
+ end
296
+
297
+ expect(subject.data_map)
298
+ .to receive(:add_service)
299
+ .with('upgrades', '/var/opt/opscode/upgrades')
300
+
301
+ subject.populate_data_map
302
+ end
303
+ end
304
+
272
305
  context 'on a frontend' do
273
306
  before { private_chef(config.merge('role' => 'frontend')) }
274
307
 
@@ -41,7 +41,7 @@ describe ChefBackup::Strategy::TarRestore do
41
41
  before do
42
42
  %i(shell_out shell_out! unpack_tarball stop_chef_server ensure_file!
43
43
  start_chef_server reconfigure_server cleanse_chef_server
44
- update_config import_db touch_sentinel
44
+ update_config import_db touch_sentinel restart_add_ons
45
45
  ).each do |method|
46
46
  allow(subject).to receive(method).and_return(true)
47
47
  end
@@ -60,6 +60,7 @@ describe ChefBackup::Strategy::TarRestore do
60
60
 
61
61
  allow(subject).to receive(:tarball_path).and_return(tarball_path)
62
62
  allow(subject).to receive(:manifest).and_return(manifest)
63
+ allow(subject).to receive(:marketplace?).and_return(false)
63
64
  end
64
65
 
65
66
  it_behaves_like 'a tar based restore'
@@ -121,11 +122,25 @@ describe ChefBackup::Strategy::TarRestore do
121
122
 
122
123
  it_behaves_like 'a tar based backend restore without db dump'
123
124
  end
125
+
126
+ context 'on a marketplace all-in-one' do
127
+ before do
128
+ allow(subject).to receive(:marketplace?).and_return(true)
129
+ allow(subject).to receive(:reconfigure_marketplace?).and_return(true)
130
+ end
131
+
132
+ it 'sets up chef-marketplace' do
133
+ expect(subject).to receive(:reconfigure_marketplace).once
134
+ subject.restore
135
+ end
136
+
137
+ it_behaves_like 'a tar based backend restore'
138
+ end
124
139
  end
125
140
  end
126
141
 
127
142
  describe '.manifest' do
128
- let(:json) { "{\"some\":\"json\"}" }
143
+ let(:json) { '{"some":"json"}' }
129
144
  let(:manifest_json) { File.join(restore_dir, 'manifest.json') }
130
145
 
131
146
  it 'parses the manifest from the restore dir' do
@@ -177,6 +192,8 @@ describe ChefBackup::Strategy::TarRestore do
177
192
  end
178
193
 
179
194
  describe '.import_db' do
195
+ let(:pg_options) { ["PGOPTIONS=#{ChefBackup::Helpers::DEFAULT_PG_OPTIONS}"] }
196
+
180
197
  before do
181
198
  allow(subject).to receive(:manifest).and_return(manifest)
182
199
  allow(subject).to receive(:shell_out!).and_return(true)
@@ -214,7 +231,7 @@ describe ChefBackup::Strategy::TarRestore do
214
231
  end
215
232
 
216
233
  it 'imports the database' do
217
- expect(subject).to receive(:shell_out!).with(import_cmd)
234
+ expect(subject).to receive(:shell_out!).with(import_cmd, env: pg_options)
218
235
  subject.import_db
219
236
  end
220
237
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef_backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.dev.4
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Cragun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-13 00:00:00.000000000 Z
11
+ date: 2016-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: di-ruby-lvm
@@ -140,16 +140,16 @@ dependencies:
140
140
  name: rubocop
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 0.32.1
145
+ version: 0.37.2
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.32.1
152
+ version: 0.37.2
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: simplecov
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -228,12 +228,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
228
228
  version: '0'
229
229
  required_rubygems_version: !ruby/object:Gem::Requirement
230
230
  requirements:
231
- - - ">"
231
+ - - ">="
232
232
  - !ruby/object:Gem::Version
233
- version: 1.3.1
233
+ version: '0'
234
234
  requirements: []
235
235
  rubyforge_project:
236
- rubygems_version: 2.2.3
236
+ rubygems_version: 2.5.1
237
237
  signing_key:
238
238
  specification_version: 4
239
239
  summary: A library to backup a Chef Server
@@ -251,4 +251,3 @@ test_files:
251
251
  - spec/unit/strategy/restore/shared_examples/restore.rb
252
252
  - spec/unit/strategy/restore/tar_spec.rb
253
253
  - spec/unit/strategy_spec.rb
254
- has_rdoc: