whisk_deploy 0.6.26
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.
- data/CHANGELOG +292 -0
- data/MIT-LICENSE +20 -0
- data/README.integration_specs +24 -0
- data/README.markdown +832 -0
- data/Rakefile +105 -0
- data/VERSION +1 -0
- data/WHY.txt +45 -0
- data/bin/wd +61 -0
- data/bin/wd_role +42 -0
- data/examples/deploy-configs.yml +13 -0
- data/examples/deploy-local.yml +4 -0
- data/examples/deploy-multiple-remotes.yml +26 -0
- data/examples/deploy-staging.yml +8 -0
- data/examples/deploy.rake +11 -0
- data/examples/deploy.yml +16 -0
- data/init.rb +1 -0
- data/install.rb +5 -0
- data/lib/whiskey_disk.rb +327 -0
- data/lib/whiskey_disk/config.rb +127 -0
- data/lib/whiskey_disk/config/abstract_filter.rb +19 -0
- data/lib/whiskey_disk/config/filter.rb +48 -0
- data/lib/whiskey_disk/config/filters/add_environment_name_filter.rb +11 -0
- data/lib/whiskey_disk/config/filters/add_project_name_filter.rb +11 -0
- data/lib/whiskey_disk/config/filters/check_for_duplicate_domains_filter.rb +21 -0
- data/lib/whiskey_disk/config/filters/convert_role_strings_to_list_filter.rb +20 -0
- data/lib/whiskey_disk/config/filters/default_config_target_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/default_domain_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/drop_empty_domain_roles_filter.rb +32 -0
- data/lib/whiskey_disk/config/filters/environment_scope_filter.rb +20 -0
- data/lib/whiskey_disk/config/filters/hashify_domain_entries_filter.rb +29 -0
- data/lib/whiskey_disk/config/filters/localize_domains_filter.rb +24 -0
- data/lib/whiskey_disk/config/filters/modules/scope_helper.rb +11 -0
- data/lib/whiskey_disk/config/filters/normalize_ssh_options_filter.rb +29 -0
- data/lib/whiskey_disk/config/filters/project_scope_filter.rb +34 -0
- data/lib/whiskey_disk/config/filters/select_project_and_environment_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/stringify_hash_keys_filter.rb +25 -0
- data/lib/whiskey_disk/helpers.rb +50 -0
- data/lib/whiskey_disk/rake.rb +47 -0
- data/scenarios/git_repositories/config.git/HEAD +1 -0
- data/scenarios/git_repositories/config.git/config +5 -0
- data/scenarios/git_repositories/config.git/description +1 -0
- data/scenarios/git_repositories/config.git/git-daemon-export-ok +0 -0
- data/scenarios/git_repositories/config.git/hooks/applypatch-msg.sample +15 -0
- data/scenarios/git_repositories/config.git/hooks/commit-msg.sample +24 -0
- data/scenarios/git_repositories/config.git/hooks/post-commit.sample +8 -0
- data/scenarios/git_repositories/config.git/hooks/post-receive.sample +15 -0
- data/scenarios/git_repositories/config.git/hooks/post-update.sample +8 -0
- data/scenarios/git_repositories/config.git/hooks/pre-applypatch.sample +14 -0
- data/scenarios/git_repositories/config.git/hooks/pre-commit.sample +46 -0
- data/scenarios/git_repositories/config.git/hooks/pre-rebase.sample +169 -0
- data/scenarios/git_repositories/config.git/hooks/prepare-commit-msg.sample +36 -0
- data/scenarios/git_repositories/config.git/hooks/update.sample +128 -0
- data/scenarios/git_repositories/config.git/info/exclude +6 -0
- data/scenarios/git_repositories/config.git/objects/0d/b14dd6ddc54017c0a11960dcda82ed802cde69 +0 -0
- data/scenarios/git_repositories/config.git/objects/0e/e781f5ce80d64db32a74a7aae7b5248dafe112 +3 -0
- data/scenarios/git_repositories/config.git/objects/17/6bf54cf17d1d1c24556dc059c4144a5df230e8 +0 -0
- data/scenarios/git_repositories/config.git/objects/20/e9ff3feaa8ede30f707e5f1b4356e3c02bb7ec +0 -0
- data/scenarios/git_repositories/config.git/objects/45/117b1c775f0de415478dbf08ed9d667ab17d13 +0 -0
- data/scenarios/git_repositories/config.git/objects/51/3954c9aca090e6ce40359f0e9fde30ea78eb8c +0 -0
- data/scenarios/git_repositories/config.git/objects/66/947a7a11a6f5d3d561fe95de284ced3010819a +0 -0
- data/scenarios/git_repositories/config.git/objects/6b/bc79311bfac47d3ed724aa82a4814e0dda4c67 +0 -0
- data/scenarios/git_repositories/config.git/objects/71/eb5df52676e8e6efba471050b46978173af110 +1 -0
- data/scenarios/git_repositories/config.git/objects/84/17d2fe3e8fcc0825249c517b29b0f9ea8b8b31 +2 -0
- data/scenarios/git_repositories/config.git/objects/8b/384fcfcf7c0dee7c3c1d5636bee9e645d9cf38 +0 -0
- data/scenarios/git_repositories/config.git/objects/bb/59da633ba74296b0c2f9ff70784ac155ddb599 +0 -0
- data/scenarios/git_repositories/config.git/objects/cc/b86b26189afbf45d8eb9165812ab86dbdfca63 +0 -0
- data/scenarios/git_repositories/config.git/objects/d1/0bcd51fec41f854001e4d61f99d9e282a695d3 +0 -0
- data/scenarios/git_repositories/config.git/objects/d8/a8b0f5b1fd66844efb141d9544965ea0065f2d +0 -0
- data/scenarios/git_repositories/config.git/objects/e6/b02c66ad632e6b8535c4630cb8fe07732a72fc +0 -0
- data/scenarios/git_repositories/config.git/objects/e8/b8bfeeba735c0a1a873082554cb4d7256ac125 +0 -0
- data/scenarios/git_repositories/config.git/objects/f9/0181466a1a60b793ca9cc9abd584c18d4e3887 +0 -0
- data/scenarios/git_repositories/config.git/objects/f9/49d5d8a4f12c91471e34d4e277239c35ebd10d +0 -0
- data/scenarios/git_repositories/config.git/refs/heads/master +1 -0
- data/scenarios/git_repositories/project.git/HEAD +1 -0
- data/scenarios/git_repositories/project.git/config +5 -0
- data/scenarios/git_repositories/project.git/description +1 -0
- data/scenarios/git_repositories/project.git/git-daemon-export-ok +0 -0
- data/scenarios/git_repositories/project.git/hooks/applypatch-msg.sample +15 -0
- data/scenarios/git_repositories/project.git/hooks/commit-msg.sample +24 -0
- data/scenarios/git_repositories/project.git/hooks/post-commit.sample +8 -0
- data/scenarios/git_repositories/project.git/hooks/post-receive.sample +15 -0
- data/scenarios/git_repositories/project.git/hooks/post-update.sample +8 -0
- data/scenarios/git_repositories/project.git/hooks/pre-applypatch.sample +14 -0
- data/scenarios/git_repositories/project.git/hooks/pre-commit.sample +46 -0
- data/scenarios/git_repositories/project.git/hooks/pre-rebase.sample +169 -0
- data/scenarios/git_repositories/project.git/hooks/prepare-commit-msg.sample +36 -0
- data/scenarios/git_repositories/project.git/hooks/update.sample +128 -0
- data/scenarios/git_repositories/project.git/info/exclude +6 -0
- data/scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172 +0 -0
- data/scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757 +1 -0
- data/scenarios/git_repositories/project.git/objects/06/13fe277280cbcdb2856e1eefc70bdaff011b20 +0 -0
- data/scenarios/git_repositories/project.git/objects/06/7aca89b86265eee211387434c3e50f37ccf009 +0 -0
- data/scenarios/git_repositories/project.git/objects/09/445dacc4822722612d60833c9948219ecdd8f5 +0 -0
- data/scenarios/git_repositories/project.git/objects/11/c4ec64326de35462f4e79d0f4229bf8e26e0c5 +0 -0
- data/scenarios/git_repositories/project.git/objects/20/1c7641c2e42b0b904e5c1f793489d8b858e4da +2 -0
- data/scenarios/git_repositories/project.git/objects/23/979639da60d2d31e9744468df1c1221b101e64 +0 -0
- data/scenarios/git_repositories/project.git/objects/27/a3fff2c4c45ab5513a405f694c0a042cb5d417 +1 -0
- data/scenarios/git_repositories/project.git/objects/2c/0c33cfba8e1af15df88522c0db2b10a6a94138 +2 -0
- data/scenarios/git_repositories/project.git/objects/38/b574660305ecb5fec6b2daa7ee1e0dbf1b6003 +0 -0
- data/scenarios/git_repositories/project.git/objects/4a/57abb5e4e426cfc9101b3af22ac83ccbd8e2ad +0 -0
- data/scenarios/git_repositories/project.git/objects/4c/77ebdd985e57afe7988480720c5dc77ec525c9 +0 -0
- data/scenarios/git_repositories/project.git/objects/51/c94da6f1b8aa9d2346088d3d362475b60c7f32 +0 -0
- data/scenarios/git_repositories/project.git/objects/5b/a96acf9cc9b87babe37c032676f53bf1ba9ae7 +2 -0
- data/scenarios/git_repositories/project.git/objects/5d/f555601d60f1c2a84d2364af0ad640612c3ba5 +0 -0
- data/scenarios/git_repositories/project.git/objects/71/03b5ac94940d596c2160a5cfcd55ca4ccac41f +0 -0
- data/scenarios/git_repositories/project.git/objects/73/3fc331098b03523f414f3509b9ae6e637c6866 +0 -0
- data/scenarios/git_repositories/project.git/objects/80/26076649ceccbe96a6292f2432652f08483035 +0 -0
- data/scenarios/git_repositories/project.git/objects/86/d1ef0976be4567de562224e1b51fbf9820c53a +1 -0
- data/scenarios/git_repositories/project.git/objects/87/a9d8b09b3401d21b23d90253332d6b28b47db2 +0 -0
- data/scenarios/git_repositories/project.git/objects/8b/030ba688255c917d189ae3f87d7c5ccd226bc2 +0 -0
- data/scenarios/git_repositories/project.git/objects/95/c9d5ad9b1c90e4c805516783105fc2037dedeb +2 -0
- data/scenarios/git_repositories/project.git/objects/95/d82d043af35a80eabfd56c0d705abfa3488787 +2 -0
- data/scenarios/git_repositories/project.git/objects/96/0bf34bb0b46d0aeb0be87f688f4ef06a4b35e1 +0 -0
- data/scenarios/git_repositories/project.git/objects/a3/860106dc1d148c7831cd45ae38829b4ed47702 +2 -0
- data/scenarios/git_repositories/project.git/objects/a8/506d6439b71784a72ac72d284b2ad53088f573 +0 -0
- data/scenarios/git_repositories/project.git/objects/ad/22ea6c7563777936ecfbe50d8e2cf8120fd525 +0 -0
- data/scenarios/git_repositories/project.git/objects/ae/3900de54aff557c61c81146d00f9d38e55a265 +1 -0
- data/scenarios/git_repositories/project.git/objects/bf/5e3740d52b80abb0378b3f85f93a53b1294521 +1 -0
- data/scenarios/git_repositories/project.git/objects/bf/b59811cdbc069418dee14b171e6e7e979784b7 +0 -0
- data/scenarios/git_repositories/project.git/objects/cc/5ac0afb24e727d5de344cc26a425f4fb7fd17d +3 -0
- data/scenarios/git_repositories/project.git/objects/d1/091aa2dd76885108461110c639e6b33a297fce +0 -0
- data/scenarios/git_repositories/project.git/objects/d8/913f6650eb2b7bf2a633732d8452008ca23dcb +0 -0
- data/scenarios/git_repositories/project.git/objects/db/d1b9667f1b26b13331ac0c321dced8be1aeab0 +3 -0
- data/scenarios/git_repositories/project.git/objects/e4/3b9107e9b1908ce415025e64eb83a493d329b7 +0 -0
- data/scenarios/git_repositories/project.git/objects/ef/2a88894d5421920b9dfe67a9a4d8043830e62e +0 -0
- data/scenarios/git_repositories/project.git/objects/f4/0123a1ff20c65d8dc15a38a83222647908e6f7 +0 -0
- data/scenarios/git_repositories/project.git/objects/f5/0af315b75ca0b12c720dec6d916b76b968c319 +0 -0
- data/scenarios/git_repositories/project.git/objects/f6/0215709b7b23f3738e9cbaf634b1c86bbd376a +0 -0
- data/scenarios/git_repositories/project.git/refs/heads/bad_rakefile +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/hook_with_changed +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/master +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/no_rake_hooks +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/post_rake_tasks +1 -0
- data/scenarios/invalid/deploy.yml +1 -0
- data/scenarios/local/deploy.yml.erb +17 -0
- data/scenarios/remote/deploy.yml +119 -0
- data/scenarios/setup/vagrant/.gitignore +3 -0
- data/scenarios/setup/vagrant/Vagrantfile +10 -0
- data/scenarios/setup/vagrant/manifests/integration.pp +32 -0
- data/scenarios/setup/vagrant/pids/.gitignore +1 -0
- data/spec/.bacon +0 -0
- data/spec/init_spec.rb +9 -0
- data/spec/install_spec.rb +43 -0
- data/spec/integration/branch_switching_spec.rb +41 -0
- data/spec/integration/deployment_failures_spec.rb +106 -0
- data/spec/integration/helper_spec.rb +90 -0
- data/spec/integration/invalid_configuration_spec.rb +39 -0
- data/spec/integration/local_deployments_spec.rb +230 -0
- data/spec/integration/post_rake_tasks_spec.rb +226 -0
- data/spec/integration/post_scripts_spec.rb +246 -0
- data/spec/integration/remote_deployments_spec.rb +166 -0
- data/spec/integration/staleness_checks_spec.rb +72 -0
- data/spec/spec_helper.rb +117 -0
- data/spec/wd_command_spec.rb +986 -0
- data/spec/wd_role_command_spec.rb +49 -0
- data/spec/whiskey_disk/config/filter_spec.rb +77 -0
- data/spec/whiskey_disk/config/filters/add_environment_name_filter_spec.rb +20 -0
- data/spec/whiskey_disk/config/filters/add_project_name_filter_spec.rb +19 -0
- data/spec/whiskey_disk/config/filters/check_for_duplicate_domains_filter_spec.rb +29 -0
- data/spec/whiskey_disk/config/filters/convert_role_strings_to_list_filter_spec.rb +48 -0
- data/spec/whiskey_disk/config/filters/default_config_target_filter_spec.rb +19 -0
- data/spec/whiskey_disk/config/filters/default_domain_filter_spec.rb +18 -0
- data/spec/whiskey_disk/config/filters/drop_empty_domain_roles_filter_spec.rb +60 -0
- data/spec/whiskey_disk/config/filters/environment_scope_filter_spec.rb +32 -0
- data/spec/whiskey_disk/config/filters/hashify_domain_entries_filter_spec.rb +41 -0
- data/spec/whiskey_disk/config/filters/localize_domains_filter_spec.rb +30 -0
- data/spec/whiskey_disk/config/filters/normalize_ssh_options_filter_spec.rb +56 -0
- data/spec/whiskey_disk/config/filters/project_scope_filter_spec.rb +75 -0
- data/spec/whiskey_disk/config/filters/select_project_and_environment_filter_spec.rb +30 -0
- data/spec/whiskey_disk/config/filters/stringify_hash_keys_filter_spec.rb +40 -0
- data/spec/whiskey_disk/config_spec.rb +754 -0
- data/spec/whiskey_disk/helpers_spec.rb +443 -0
- data/spec/whiskey_disk/rake_spec.rb +261 -0
- data/spec/whiskey_disk_spec.rb +1224 -0
- data/tasks/deploy.rake +2 -0
- data/whisk_deploy.gemspec +215 -0
- metadata +241 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'uri'
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'whiskey_disk/config/filter'
|
|
5
|
+
|
|
6
|
+
class WhiskeyDisk
|
|
7
|
+
class Config
|
|
8
|
+
def fetch
|
|
9
|
+
raise "Cannot determine current environment -- try rake ... to=staging, for example." unless environment_name
|
|
10
|
+
filter_data(load_data)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def debug?
|
|
14
|
+
env_flag_is_true?('debug')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def domain_limit
|
|
18
|
+
env_key_or_false?('only')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def check_staleness?
|
|
22
|
+
env_flag_is_true?('check')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def configuration_file
|
|
26
|
+
return path if valid_path?(path)
|
|
27
|
+
|
|
28
|
+
files = []
|
|
29
|
+
|
|
30
|
+
files += [
|
|
31
|
+
File.join(base_path, 'deploy', specified_project_name, "#{environment_name}.yml"), # /deploy/foo/staging.yml
|
|
32
|
+
File.join(base_path, 'deploy', "#{specified_project_name}.yml") # /deploy/foo.yml
|
|
33
|
+
] if specified_project_name
|
|
34
|
+
|
|
35
|
+
files += [
|
|
36
|
+
File.join(base_path, 'deploy', "#{environment_name}.yml"), # /deploy/staging.yml
|
|
37
|
+
File.join(base_path, "#{environment_name}.yml"), # /staging.yml
|
|
38
|
+
File.join(base_path, 'deploy.yml') # /deploy.yml
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
files.each { |file| return file if File.exists?(file) }
|
|
42
|
+
|
|
43
|
+
raise "Could not locate configuration file in path [#{base_path}]"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def environment_name
|
|
47
|
+
return false unless env_has_key?('to')
|
|
48
|
+
return ENV['to'] unless ENV['to'] =~ /:/
|
|
49
|
+
ENV['to'].split(/:/)[1]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def specified_project_name
|
|
53
|
+
return false unless env_has_key?('to')
|
|
54
|
+
return false unless ENV['to'] =~ /:/
|
|
55
|
+
ENV['to'].split(/:/).first
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def contains_rakefile?(path)
|
|
59
|
+
File.exists?(File.expand_path(File.join(path, 'Rakefile')))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def find_rakefile_from_current_path
|
|
63
|
+
original_path = Dir.pwd
|
|
64
|
+
while (!contains_rakefile?(Dir.pwd))
|
|
65
|
+
return File.join(original_path, 'config') if Dir.pwd == '/'
|
|
66
|
+
Dir.chdir('..')
|
|
67
|
+
end
|
|
68
|
+
File.join(Dir.pwd, 'config')
|
|
69
|
+
ensure
|
|
70
|
+
Dir.chdir(original_path)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def base_path
|
|
74
|
+
path || find_rakefile_from_current_path
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def valid_path?(path)
|
|
78
|
+
return false unless path
|
|
79
|
+
uri = URI.parse(path)
|
|
80
|
+
return path if uri.scheme
|
|
81
|
+
return path if File.file?(path)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def project_name
|
|
85
|
+
specified_project_name || 'unnamed_project'
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# called only by #load_data
|
|
89
|
+
def configuration_data
|
|
90
|
+
open(configuration_file) {|f| f.read }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# called only by #fetch
|
|
94
|
+
def load_data
|
|
95
|
+
YAML.load(configuration_data)
|
|
96
|
+
rescue Exception => e
|
|
97
|
+
raise %Q{Error reading configuration file [#{configuration_file}]: "#{e}"}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def filter
|
|
101
|
+
@filter ||= WhiskeyDisk::Config::Filter.new(self)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# called only by #fetch
|
|
105
|
+
def filter_data(data)
|
|
106
|
+
filter.filter_data(data)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def path
|
|
112
|
+
env_key_or_false?('path')
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def env_has_key?(key)
|
|
116
|
+
ENV[key] && ENV[key] != ''
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def env_flag_is_true?(key)
|
|
120
|
+
!!(env_has_key?(key) && ENV[key] =~ /^(?:t(?:rue)?|y(?:es)?|1)$/)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def env_key_or_false?(key)
|
|
124
|
+
env_has_key?(key) ? ENV[key] : false
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class WhiskeyDisk
|
|
2
|
+
class Config
|
|
3
|
+
class AbstractFilter
|
|
4
|
+
attr_reader :config
|
|
5
|
+
|
|
6
|
+
def initialize(config)
|
|
7
|
+
@config = config
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def project_name
|
|
11
|
+
config.project_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def environment_name
|
|
15
|
+
config.environment_name
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'whiskey_disk/config/filters/stringify_hash_keys_filter'
|
|
2
|
+
require 'whiskey_disk/config/filters/environment_scope_filter'
|
|
3
|
+
require 'whiskey_disk/config/filters/project_scope_filter'
|
|
4
|
+
require 'whiskey_disk/config/filters/select_project_and_environment_filter'
|
|
5
|
+
require 'whiskey_disk/config/filters/add_environment_name_filter'
|
|
6
|
+
require 'whiskey_disk/config/filters/add_project_name_filter'
|
|
7
|
+
require 'whiskey_disk/config/filters/default_config_target_filter'
|
|
8
|
+
require 'whiskey_disk/config/filters/default_domain_filter'
|
|
9
|
+
require 'whiskey_disk/config/filters/hashify_domain_entries_filter'
|
|
10
|
+
require 'whiskey_disk/config/filters/localize_domains_filter'
|
|
11
|
+
require 'whiskey_disk/config/filters/check_for_duplicate_domains_filter'
|
|
12
|
+
require 'whiskey_disk/config/filters/convert_role_strings_to_list_filter'
|
|
13
|
+
require 'whiskey_disk/config/filters/drop_empty_domain_roles_filter'
|
|
14
|
+
require 'whiskey_disk/config/filters/normalize_ssh_options_filter'
|
|
15
|
+
|
|
16
|
+
class WhiskeyDisk
|
|
17
|
+
class Config
|
|
18
|
+
class Filter
|
|
19
|
+
attr_reader :config, :filters
|
|
20
|
+
|
|
21
|
+
def initialize(config)
|
|
22
|
+
@config = config
|
|
23
|
+
@filters = [
|
|
24
|
+
StringifyHashKeysFilter,
|
|
25
|
+
EnvironmentScopeFilter,
|
|
26
|
+
ProjectScopeFilter,
|
|
27
|
+
SelectProjectAndEnvironmentFilter,
|
|
28
|
+
AddEnvironmentNameFilter,
|
|
29
|
+
AddProjectNameFilter,
|
|
30
|
+
DefaultConfigTargetFilter,
|
|
31
|
+
DefaultDomainFilter,
|
|
32
|
+
HashifyDomainEntriesFilter,
|
|
33
|
+
LocalizeDomainsFilter,
|
|
34
|
+
CheckForDuplicateDomainsFilter,
|
|
35
|
+
ConvertRoleStringsToListFilter,
|
|
36
|
+
DropEmptyDomainRolesFilter,
|
|
37
|
+
NormalizeSshOptionsFilter
|
|
38
|
+
]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def filter_data(data)
|
|
42
|
+
filters.inject(data.clone) do |result, filter|
|
|
43
|
+
result = filter.new(config).filter(result)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class CheckForDuplicateDomainsFilter < AbstractFilter
|
|
6
|
+
def check_domains(domain_list)
|
|
7
|
+
seen = {}
|
|
8
|
+
domain_list.each do |domain|
|
|
9
|
+
raise "duplicate domain [#{domain['name']}] in configuration file for project [#{environment_name}], target [#{environment_name}]" if seen[domain['name']]
|
|
10
|
+
seen[domain['name']] = true
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def filter(data)
|
|
15
|
+
check_domains(data['domain'])
|
|
16
|
+
data
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class ConvertRoleStringsToListFilter < AbstractFilter
|
|
6
|
+
def convert_roles_for_domain(domain)
|
|
7
|
+
return domain unless domain['roles']
|
|
8
|
+
domain.merge('roles' => [ domain['roles'] ].flatten)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def convert_all_roles(domains_list)
|
|
12
|
+
domains_list.collect {|domain| convert_roles_for_domain(domain) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def filter(data)
|
|
16
|
+
data.merge('domain' => convert_all_roles(data['domain']))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class DefaultConfigTargetFilter < AbstractFilter
|
|
6
|
+
def filter(data)
|
|
7
|
+
return data if data['config_target']
|
|
8
|
+
data.merge( { 'config_target' => environment_name })
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class DefaultDomainFilter < AbstractFilter
|
|
6
|
+
def filter(data)
|
|
7
|
+
data.has_key?('domain') ? data : data.merge('domain' => [ { 'name' => 'local' } ] )
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class DropEmptyDomainRolesFilter < AbstractFilter
|
|
6
|
+
def has_empty_role?(domain)
|
|
7
|
+
return true unless domain.has_key?('roles')
|
|
8
|
+
return true if domain['roles'].nil?
|
|
9
|
+
|
|
10
|
+
roles = domain['roles'].uniq.compact
|
|
11
|
+
return true if roles == [ '' ]
|
|
12
|
+
return true if roles == []
|
|
13
|
+
|
|
14
|
+
false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def drop_empty_roles_for_domain(domain)
|
|
18
|
+
return domain unless has_empty_role?(domain)
|
|
19
|
+
domain.reject {|key, value| key == 'roles' }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def drop_empty_domain_roles(domains_list)
|
|
23
|
+
domains_list.collect { |domain| drop_empty_roles_for_domain(domain) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def filter(data)
|
|
27
|
+
data.merge('domain' => drop_empty_domain_roles(data['domain']))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
require 'whiskey_disk/config/filters/modules/scope_helper'
|
|
3
|
+
|
|
4
|
+
class WhiskeyDisk
|
|
5
|
+
class Config
|
|
6
|
+
class EnvironmentScopeFilter < AbstractFilter
|
|
7
|
+
include ScopeHelper
|
|
8
|
+
|
|
9
|
+
# is this data hash a bottom-level data hash without an environment name?
|
|
10
|
+
def needs_environment_scoping?(data)
|
|
11
|
+
repository_depth(data) == 0
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def filter(data)
|
|
15
|
+
return data unless needs_environment_scoping?(data)
|
|
16
|
+
{ environment_name => data }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class HashifyDomainEntriesFilter < AbstractFilter
|
|
6
|
+
def needs_hashing?(domain)
|
|
7
|
+
! domain.respond_to?(:keys)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def hashify_domain(domain)
|
|
11
|
+
needs_hashing?(domain) ? { 'name' => domain } : domain
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def new_domain
|
|
15
|
+
{ 'name' => '' }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def hashify_domains(domain_list)
|
|
19
|
+
return new_domain unless domain_list
|
|
20
|
+
[ domain_list ].flatten.collect {|domain| hashify_domain(domain) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def filter(data)
|
|
24
|
+
data.merge('domain' => hashify_domains(data['domain']))
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class LocalizeDomainsFilter < AbstractFilter
|
|
6
|
+
def is_local?(name)
|
|
7
|
+
name.nil? or name == ''
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def localize(name)
|
|
11
|
+
is_local?(name) ? 'local' : name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def localize_domains(domain_list)
|
|
15
|
+
domain_list.collect {|domain| domain.merge('name' => localize(domain['name'])) }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def filter(data)
|
|
19
|
+
data.merge('domain' => localize_domains(data['domain']))
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class WhiskeyDisk
|
|
2
|
+
class Config
|
|
3
|
+
module ScopeHelper
|
|
4
|
+
def repository_depth(data, depth = 0)
|
|
5
|
+
raise 'no repository found' unless data.respond_to?(:has_key?)
|
|
6
|
+
return depth if data.has_key?('repository')
|
|
7
|
+
repository_depth(data.values.first, depth + 1)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'whiskey_disk/config/abstract_filter'
|
|
2
|
+
|
|
3
|
+
class WhiskeyDisk
|
|
4
|
+
class Config
|
|
5
|
+
class NormalizeSshOptionsFilter < AbstractFilter
|
|
6
|
+
def drop_empties(options_list)
|
|
7
|
+
options_list.select {|option| option and option != '' }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def drop_empty_ssh_options_for_domain(domain)
|
|
11
|
+
result = drop_empties([ domain['ssh_options'] ].flatten)
|
|
12
|
+
if result and result != []
|
|
13
|
+
domain.merge('ssh_options' => result)
|
|
14
|
+
else
|
|
15
|
+
domain.reject {|k,v| k == 'ssh_options' }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def normalize_ssh_options(domains_list)
|
|
20
|
+
domains_list.collect { |domain| drop_empty_ssh_options_for_domain(domain) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def filter(data)
|
|
24
|
+
data.merge('domain' => normalize_ssh_options(data['domain']))
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|