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.
Files changed (177) hide show
  1. data/CHANGELOG +292 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.integration_specs +24 -0
  4. data/README.markdown +832 -0
  5. data/Rakefile +105 -0
  6. data/VERSION +1 -0
  7. data/WHY.txt +45 -0
  8. data/bin/wd +61 -0
  9. data/bin/wd_role +42 -0
  10. data/examples/deploy-configs.yml +13 -0
  11. data/examples/deploy-local.yml +4 -0
  12. data/examples/deploy-multiple-remotes.yml +26 -0
  13. data/examples/deploy-staging.yml +8 -0
  14. data/examples/deploy.rake +11 -0
  15. data/examples/deploy.yml +16 -0
  16. data/init.rb +1 -0
  17. data/install.rb +5 -0
  18. data/lib/whiskey_disk.rb +327 -0
  19. data/lib/whiskey_disk/config.rb +127 -0
  20. data/lib/whiskey_disk/config/abstract_filter.rb +19 -0
  21. data/lib/whiskey_disk/config/filter.rb +48 -0
  22. data/lib/whiskey_disk/config/filters/add_environment_name_filter.rb +11 -0
  23. data/lib/whiskey_disk/config/filters/add_project_name_filter.rb +11 -0
  24. data/lib/whiskey_disk/config/filters/check_for_duplicate_domains_filter.rb +21 -0
  25. data/lib/whiskey_disk/config/filters/convert_role_strings_to_list_filter.rb +20 -0
  26. data/lib/whiskey_disk/config/filters/default_config_target_filter.rb +12 -0
  27. data/lib/whiskey_disk/config/filters/default_domain_filter.rb +12 -0
  28. data/lib/whiskey_disk/config/filters/drop_empty_domain_roles_filter.rb +32 -0
  29. data/lib/whiskey_disk/config/filters/environment_scope_filter.rb +20 -0
  30. data/lib/whiskey_disk/config/filters/hashify_domain_entries_filter.rb +29 -0
  31. data/lib/whiskey_disk/config/filters/localize_domains_filter.rb +24 -0
  32. data/lib/whiskey_disk/config/filters/modules/scope_helper.rb +11 -0
  33. data/lib/whiskey_disk/config/filters/normalize_ssh_options_filter.rb +29 -0
  34. data/lib/whiskey_disk/config/filters/project_scope_filter.rb +34 -0
  35. data/lib/whiskey_disk/config/filters/select_project_and_environment_filter.rb +12 -0
  36. data/lib/whiskey_disk/config/filters/stringify_hash_keys_filter.rb +25 -0
  37. data/lib/whiskey_disk/helpers.rb +50 -0
  38. data/lib/whiskey_disk/rake.rb +47 -0
  39. data/scenarios/git_repositories/config.git/HEAD +1 -0
  40. data/scenarios/git_repositories/config.git/config +5 -0
  41. data/scenarios/git_repositories/config.git/description +1 -0
  42. data/scenarios/git_repositories/config.git/git-daemon-export-ok +0 -0
  43. data/scenarios/git_repositories/config.git/hooks/applypatch-msg.sample +15 -0
  44. data/scenarios/git_repositories/config.git/hooks/commit-msg.sample +24 -0
  45. data/scenarios/git_repositories/config.git/hooks/post-commit.sample +8 -0
  46. data/scenarios/git_repositories/config.git/hooks/post-receive.sample +15 -0
  47. data/scenarios/git_repositories/config.git/hooks/post-update.sample +8 -0
  48. data/scenarios/git_repositories/config.git/hooks/pre-applypatch.sample +14 -0
  49. data/scenarios/git_repositories/config.git/hooks/pre-commit.sample +46 -0
  50. data/scenarios/git_repositories/config.git/hooks/pre-rebase.sample +169 -0
  51. data/scenarios/git_repositories/config.git/hooks/prepare-commit-msg.sample +36 -0
  52. data/scenarios/git_repositories/config.git/hooks/update.sample +128 -0
  53. data/scenarios/git_repositories/config.git/info/exclude +6 -0
  54. data/scenarios/git_repositories/config.git/objects/0d/b14dd6ddc54017c0a11960dcda82ed802cde69 +0 -0
  55. data/scenarios/git_repositories/config.git/objects/0e/e781f5ce80d64db32a74a7aae7b5248dafe112 +3 -0
  56. data/scenarios/git_repositories/config.git/objects/17/6bf54cf17d1d1c24556dc059c4144a5df230e8 +0 -0
  57. data/scenarios/git_repositories/config.git/objects/20/e9ff3feaa8ede30f707e5f1b4356e3c02bb7ec +0 -0
  58. data/scenarios/git_repositories/config.git/objects/45/117b1c775f0de415478dbf08ed9d667ab17d13 +0 -0
  59. data/scenarios/git_repositories/config.git/objects/51/3954c9aca090e6ce40359f0e9fde30ea78eb8c +0 -0
  60. data/scenarios/git_repositories/config.git/objects/66/947a7a11a6f5d3d561fe95de284ced3010819a +0 -0
  61. data/scenarios/git_repositories/config.git/objects/6b/bc79311bfac47d3ed724aa82a4814e0dda4c67 +0 -0
  62. data/scenarios/git_repositories/config.git/objects/71/eb5df52676e8e6efba471050b46978173af110 +1 -0
  63. data/scenarios/git_repositories/config.git/objects/84/17d2fe3e8fcc0825249c517b29b0f9ea8b8b31 +2 -0
  64. data/scenarios/git_repositories/config.git/objects/8b/384fcfcf7c0dee7c3c1d5636bee9e645d9cf38 +0 -0
  65. data/scenarios/git_repositories/config.git/objects/bb/59da633ba74296b0c2f9ff70784ac155ddb599 +0 -0
  66. data/scenarios/git_repositories/config.git/objects/cc/b86b26189afbf45d8eb9165812ab86dbdfca63 +0 -0
  67. data/scenarios/git_repositories/config.git/objects/d1/0bcd51fec41f854001e4d61f99d9e282a695d3 +0 -0
  68. data/scenarios/git_repositories/config.git/objects/d8/a8b0f5b1fd66844efb141d9544965ea0065f2d +0 -0
  69. data/scenarios/git_repositories/config.git/objects/e6/b02c66ad632e6b8535c4630cb8fe07732a72fc +0 -0
  70. data/scenarios/git_repositories/config.git/objects/e8/b8bfeeba735c0a1a873082554cb4d7256ac125 +0 -0
  71. data/scenarios/git_repositories/config.git/objects/f9/0181466a1a60b793ca9cc9abd584c18d4e3887 +0 -0
  72. data/scenarios/git_repositories/config.git/objects/f9/49d5d8a4f12c91471e34d4e277239c35ebd10d +0 -0
  73. data/scenarios/git_repositories/config.git/refs/heads/master +1 -0
  74. data/scenarios/git_repositories/project.git/HEAD +1 -0
  75. data/scenarios/git_repositories/project.git/config +5 -0
  76. data/scenarios/git_repositories/project.git/description +1 -0
  77. data/scenarios/git_repositories/project.git/git-daemon-export-ok +0 -0
  78. data/scenarios/git_repositories/project.git/hooks/applypatch-msg.sample +15 -0
  79. data/scenarios/git_repositories/project.git/hooks/commit-msg.sample +24 -0
  80. data/scenarios/git_repositories/project.git/hooks/post-commit.sample +8 -0
  81. data/scenarios/git_repositories/project.git/hooks/post-receive.sample +15 -0
  82. data/scenarios/git_repositories/project.git/hooks/post-update.sample +8 -0
  83. data/scenarios/git_repositories/project.git/hooks/pre-applypatch.sample +14 -0
  84. data/scenarios/git_repositories/project.git/hooks/pre-commit.sample +46 -0
  85. data/scenarios/git_repositories/project.git/hooks/pre-rebase.sample +169 -0
  86. data/scenarios/git_repositories/project.git/hooks/prepare-commit-msg.sample +36 -0
  87. data/scenarios/git_repositories/project.git/hooks/update.sample +128 -0
  88. data/scenarios/git_repositories/project.git/info/exclude +6 -0
  89. data/scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172 +0 -0
  90. data/scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757 +1 -0
  91. data/scenarios/git_repositories/project.git/objects/06/13fe277280cbcdb2856e1eefc70bdaff011b20 +0 -0
  92. data/scenarios/git_repositories/project.git/objects/06/7aca89b86265eee211387434c3e50f37ccf009 +0 -0
  93. data/scenarios/git_repositories/project.git/objects/09/445dacc4822722612d60833c9948219ecdd8f5 +0 -0
  94. data/scenarios/git_repositories/project.git/objects/11/c4ec64326de35462f4e79d0f4229bf8e26e0c5 +0 -0
  95. data/scenarios/git_repositories/project.git/objects/20/1c7641c2e42b0b904e5c1f793489d8b858e4da +2 -0
  96. data/scenarios/git_repositories/project.git/objects/23/979639da60d2d31e9744468df1c1221b101e64 +0 -0
  97. data/scenarios/git_repositories/project.git/objects/27/a3fff2c4c45ab5513a405f694c0a042cb5d417 +1 -0
  98. data/scenarios/git_repositories/project.git/objects/2c/0c33cfba8e1af15df88522c0db2b10a6a94138 +2 -0
  99. data/scenarios/git_repositories/project.git/objects/38/b574660305ecb5fec6b2daa7ee1e0dbf1b6003 +0 -0
  100. data/scenarios/git_repositories/project.git/objects/4a/57abb5e4e426cfc9101b3af22ac83ccbd8e2ad +0 -0
  101. data/scenarios/git_repositories/project.git/objects/4c/77ebdd985e57afe7988480720c5dc77ec525c9 +0 -0
  102. data/scenarios/git_repositories/project.git/objects/51/c94da6f1b8aa9d2346088d3d362475b60c7f32 +0 -0
  103. data/scenarios/git_repositories/project.git/objects/5b/a96acf9cc9b87babe37c032676f53bf1ba9ae7 +2 -0
  104. data/scenarios/git_repositories/project.git/objects/5d/f555601d60f1c2a84d2364af0ad640612c3ba5 +0 -0
  105. data/scenarios/git_repositories/project.git/objects/71/03b5ac94940d596c2160a5cfcd55ca4ccac41f +0 -0
  106. data/scenarios/git_repositories/project.git/objects/73/3fc331098b03523f414f3509b9ae6e637c6866 +0 -0
  107. data/scenarios/git_repositories/project.git/objects/80/26076649ceccbe96a6292f2432652f08483035 +0 -0
  108. data/scenarios/git_repositories/project.git/objects/86/d1ef0976be4567de562224e1b51fbf9820c53a +1 -0
  109. data/scenarios/git_repositories/project.git/objects/87/a9d8b09b3401d21b23d90253332d6b28b47db2 +0 -0
  110. data/scenarios/git_repositories/project.git/objects/8b/030ba688255c917d189ae3f87d7c5ccd226bc2 +0 -0
  111. data/scenarios/git_repositories/project.git/objects/95/c9d5ad9b1c90e4c805516783105fc2037dedeb +2 -0
  112. data/scenarios/git_repositories/project.git/objects/95/d82d043af35a80eabfd56c0d705abfa3488787 +2 -0
  113. data/scenarios/git_repositories/project.git/objects/96/0bf34bb0b46d0aeb0be87f688f4ef06a4b35e1 +0 -0
  114. data/scenarios/git_repositories/project.git/objects/a3/860106dc1d148c7831cd45ae38829b4ed47702 +2 -0
  115. data/scenarios/git_repositories/project.git/objects/a8/506d6439b71784a72ac72d284b2ad53088f573 +0 -0
  116. data/scenarios/git_repositories/project.git/objects/ad/22ea6c7563777936ecfbe50d8e2cf8120fd525 +0 -0
  117. data/scenarios/git_repositories/project.git/objects/ae/3900de54aff557c61c81146d00f9d38e55a265 +1 -0
  118. data/scenarios/git_repositories/project.git/objects/bf/5e3740d52b80abb0378b3f85f93a53b1294521 +1 -0
  119. data/scenarios/git_repositories/project.git/objects/bf/b59811cdbc069418dee14b171e6e7e979784b7 +0 -0
  120. data/scenarios/git_repositories/project.git/objects/cc/5ac0afb24e727d5de344cc26a425f4fb7fd17d +3 -0
  121. data/scenarios/git_repositories/project.git/objects/d1/091aa2dd76885108461110c639e6b33a297fce +0 -0
  122. data/scenarios/git_repositories/project.git/objects/d8/913f6650eb2b7bf2a633732d8452008ca23dcb +0 -0
  123. data/scenarios/git_repositories/project.git/objects/db/d1b9667f1b26b13331ac0c321dced8be1aeab0 +3 -0
  124. data/scenarios/git_repositories/project.git/objects/e4/3b9107e9b1908ce415025e64eb83a493d329b7 +0 -0
  125. data/scenarios/git_repositories/project.git/objects/ef/2a88894d5421920b9dfe67a9a4d8043830e62e +0 -0
  126. data/scenarios/git_repositories/project.git/objects/f4/0123a1ff20c65d8dc15a38a83222647908e6f7 +0 -0
  127. data/scenarios/git_repositories/project.git/objects/f5/0af315b75ca0b12c720dec6d916b76b968c319 +0 -0
  128. data/scenarios/git_repositories/project.git/objects/f6/0215709b7b23f3738e9cbaf634b1c86bbd376a +0 -0
  129. data/scenarios/git_repositories/project.git/refs/heads/bad_rakefile +1 -0
  130. data/scenarios/git_repositories/project.git/refs/heads/hook_with_changed +1 -0
  131. data/scenarios/git_repositories/project.git/refs/heads/master +1 -0
  132. data/scenarios/git_repositories/project.git/refs/heads/no_rake_hooks +1 -0
  133. data/scenarios/git_repositories/project.git/refs/heads/post_rake_tasks +1 -0
  134. data/scenarios/invalid/deploy.yml +1 -0
  135. data/scenarios/local/deploy.yml.erb +17 -0
  136. data/scenarios/remote/deploy.yml +119 -0
  137. data/scenarios/setup/vagrant/.gitignore +3 -0
  138. data/scenarios/setup/vagrant/Vagrantfile +10 -0
  139. data/scenarios/setup/vagrant/manifests/integration.pp +32 -0
  140. data/scenarios/setup/vagrant/pids/.gitignore +1 -0
  141. data/spec/.bacon +0 -0
  142. data/spec/init_spec.rb +9 -0
  143. data/spec/install_spec.rb +43 -0
  144. data/spec/integration/branch_switching_spec.rb +41 -0
  145. data/spec/integration/deployment_failures_spec.rb +106 -0
  146. data/spec/integration/helper_spec.rb +90 -0
  147. data/spec/integration/invalid_configuration_spec.rb +39 -0
  148. data/spec/integration/local_deployments_spec.rb +230 -0
  149. data/spec/integration/post_rake_tasks_spec.rb +226 -0
  150. data/spec/integration/post_scripts_spec.rb +246 -0
  151. data/spec/integration/remote_deployments_spec.rb +166 -0
  152. data/spec/integration/staleness_checks_spec.rb +72 -0
  153. data/spec/spec_helper.rb +117 -0
  154. data/spec/wd_command_spec.rb +986 -0
  155. data/spec/wd_role_command_spec.rb +49 -0
  156. data/spec/whiskey_disk/config/filter_spec.rb +77 -0
  157. data/spec/whiskey_disk/config/filters/add_environment_name_filter_spec.rb +20 -0
  158. data/spec/whiskey_disk/config/filters/add_project_name_filter_spec.rb +19 -0
  159. data/spec/whiskey_disk/config/filters/check_for_duplicate_domains_filter_spec.rb +29 -0
  160. data/spec/whiskey_disk/config/filters/convert_role_strings_to_list_filter_spec.rb +48 -0
  161. data/spec/whiskey_disk/config/filters/default_config_target_filter_spec.rb +19 -0
  162. data/spec/whiskey_disk/config/filters/default_domain_filter_spec.rb +18 -0
  163. data/spec/whiskey_disk/config/filters/drop_empty_domain_roles_filter_spec.rb +60 -0
  164. data/spec/whiskey_disk/config/filters/environment_scope_filter_spec.rb +32 -0
  165. data/spec/whiskey_disk/config/filters/hashify_domain_entries_filter_spec.rb +41 -0
  166. data/spec/whiskey_disk/config/filters/localize_domains_filter_spec.rb +30 -0
  167. data/spec/whiskey_disk/config/filters/normalize_ssh_options_filter_spec.rb +56 -0
  168. data/spec/whiskey_disk/config/filters/project_scope_filter_spec.rb +75 -0
  169. data/spec/whiskey_disk/config/filters/select_project_and_environment_filter_spec.rb +30 -0
  170. data/spec/whiskey_disk/config/filters/stringify_hash_keys_filter_spec.rb +40 -0
  171. data/spec/whiskey_disk/config_spec.rb +754 -0
  172. data/spec/whiskey_disk/helpers_spec.rb +443 -0
  173. data/spec/whiskey_disk/rake_spec.rb +261 -0
  174. data/spec/whiskey_disk_spec.rb +1224 -0
  175. data/tasks/deploy.rake +2 -0
  176. data/whisk_deploy.gemspec +215 -0
  177. 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,11 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class AddEnvironmentNameFilter < AbstractFilter
6
+ def filter(data)
7
+ data.merge( { 'environment' => environment_name } )
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class AddProjectNameFilter < AbstractFilter
6
+ def filter(data)
7
+ data.merge( { 'project' => project_name } )
8
+ end
9
+ end
10
+ end
11
+ 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
+