fhcap-cli 0.3.0

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 (142) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rakeTasks +7 -0
  4. data/.rspec +1 -0
  5. data/CHANGELOG.md +15 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +150 -0
  9. data/Rakefile +2 -0
  10. data/bin/fhcap +6 -0
  11. data/fhcap-cli.gemspec +44 -0
  12. data/lib/cookbooks/provision/libraries/provision.rb +140 -0
  13. data/lib/cookbooks/provision/metadata.rb +7 -0
  14. data/lib/cookbooks/provision/recipes/aws.rb +15 -0
  15. data/lib/cookbooks/provision/recipes/aws_cluster_create.rb +59 -0
  16. data/lib/cookbooks/provision/recipes/aws_cluster_create_elb.rb +61 -0
  17. data/lib/cookbooks/provision/recipes/aws_cluster_destroy.rb +52 -0
  18. data/lib/cookbooks/provision/recipes/cluster_create.rb +2 -0
  19. data/lib/cookbooks/provision/recipes/cluster_destroy.rb +2 -0
  20. data/lib/cookbooks/provision/recipes/cluster_destroy_instances.rb +11 -0
  21. data/lib/cookbooks/provision/recipes/cluster_provision.rb +4 -0
  22. data/lib/cookbooks/provision/recipes/cluster_provision_instances.rb +55 -0
  23. data/lib/cookbooks/provision/recipes/cluster_status.rb +24 -0
  24. data/lib/cookbooks/provision/recipes/common.rb +9 -0
  25. data/lib/cookbooks/provision/recipes/default.rb +5 -0
  26. data/lib/cookbooks/provision/recipes/openstack.rb +11 -0
  27. data/lib/cookbooks/provision/recipes/openstack_cluster_create.rb +11 -0
  28. data/lib/cookbooks/provision/recipes/openstack_cluster_destroy.rb +4 -0
  29. data/lib/cookbooks/provision/recipes/reset_rabbitmq.rb +49 -0
  30. data/lib/cookbooks/provision/recipes/restart_services.rb +24 -0
  31. data/lib/extensions/chef/provisioning.rb +21 -0
  32. data/lib/extensions/chef/provisioning/aws_driver/driver.rb +46 -0
  33. data/lib/extensions/chef/provisioning/chef_run_data.rb +18 -0
  34. data/lib/extensions/cheffish/merged_config.rb +9 -0
  35. data/lib/fhcap.rb +14 -0
  36. data/lib/fhcap/chef-dk/chef_runner.rb +94 -0
  37. data/lib/fhcap/cli.rb +75 -0
  38. data/lib/fhcap/cluster.rb +112 -0
  39. data/lib/fhcap/config.rb +104 -0
  40. data/lib/fhcap/cookbook.rb +75 -0
  41. data/lib/fhcap/dummy_node.rb +80 -0
  42. data/lib/fhcap/fhcap_helper.rb +9 -0
  43. data/lib/fhcap/kitchen.rb +235 -0
  44. data/lib/fhcap/knife.rb +74 -0
  45. data/lib/fhcap/knife_helper.rb +38 -0
  46. data/lib/fhcap/misc.rb +103 -0
  47. data/lib/fhcap/provider.rb +41 -0
  48. data/lib/fhcap/providers_helper.rb +60 -0
  49. data/lib/fhcap/repo.rb +52 -0
  50. data/lib/fhcap/repos_helper.rb +217 -0
  51. data/lib/fhcap/tasks/chef/chef_task_base.rb +82 -0
  52. data/lib/fhcap/tasks/chef/cookbook/list.rb +37 -0
  53. data/lib/fhcap/tasks/chef/cookbook/update_changelog.rb +63 -0
  54. data/lib/fhcap/tasks/chef/cookbook/update_metadata.rb +57 -0
  55. data/lib/fhcap/tasks/chef/cookbook/update_readme.rb +30 -0
  56. data/lib/fhcap/tasks/chef/cookbook/update_version.rb +90 -0
  57. data/lib/fhcap/tasks/chef/environments/create.rb +115 -0
  58. data/lib/fhcap/tasks/chef/environments/destroy.rb +37 -0
  59. data/lib/fhcap/tasks/chef/environments/promote_cookbooks.rb +47 -0
  60. data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task.rb +27 -0
  61. data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task_base.rb +38 -0
  62. data/lib/fhcap/tasks/chef/provisioning/create.rb +22 -0
  63. data/lib/fhcap/tasks/chef/provisioning/destroy.rb +21 -0
  64. data/lib/fhcap/tasks/chef/provisioning/provision.rb +19 -0
  65. data/lib/fhcap/tasks/chef/server/bootstrap.rb +165 -0
  66. data/lib/fhcap/tasks/chef/server/create_user.rb +97 -0
  67. data/lib/fhcap/tasks/chef/server/info.rb +82 -0
  68. data/lib/fhcap/tasks/chef/server/provision.rb +45 -0
  69. data/lib/fhcap/tasks/clean.rb +34 -0
  70. data/lib/fhcap/tasks/cluster/cluster_task_base.rb +57 -0
  71. data/lib/fhcap/tasks/cluster/create.rb +243 -0
  72. data/lib/fhcap/tasks/cluster/create_environment.rb +171 -0
  73. data/lib/fhcap/tasks/cluster/destroy.rb +30 -0
  74. data/lib/fhcap/tasks/cluster/destroy_environment.rb +28 -0
  75. data/lib/fhcap/tasks/cluster/info.rb +67 -0
  76. data/lib/fhcap/tasks/cluster/list.rb +40 -0
  77. data/lib/fhcap/tasks/cluster/provision.rb +46 -0
  78. data/lib/fhcap/tasks/cluster/status.rb +17 -0
  79. data/lib/fhcap/tasks/cluster/test.rb +15 -0
  80. data/lib/fhcap/tasks/knife/add.rb +111 -0
  81. data/lib/fhcap/tasks/knife/list.rb +22 -0
  82. data/lib/fhcap/tasks/knife/remove.rb +39 -0
  83. data/lib/fhcap/tasks/misc/create_dns_record.rb +100 -0
  84. data/lib/fhcap/tasks/misc/create_ssl_cert.rb +82 -0
  85. data/lib/fhcap/tasks/provider/add.rb +136 -0
  86. data/lib/fhcap/tasks/provider/list.rb +31 -0
  87. data/lib/fhcap/tasks/provider/remove.rb +28 -0
  88. data/lib/fhcap/tasks/repo/add.rb +57 -0
  89. data/lib/fhcap/tasks/repo/checkout.rb +144 -0
  90. data/lib/fhcap/tasks/repo/list.rb +22 -0
  91. data/lib/fhcap/tasks/repo/remove.rb +34 -0
  92. data/lib/fhcap/tasks/setup.rb +59 -0
  93. data/lib/fhcap/tasks/task_base.rb +89 -0
  94. data/lib/fhcap/thor_base.rb +121 -0
  95. data/lib/fhcap/version.rb +3 -0
  96. data/spec/fhcap/cli_spec.rb +6 -0
  97. data/spec/fhcap/tasks/cluster/create_spec.rb +46 -0
  98. data/spec/fhcap/tasks/knife/add_spec.rb +35 -0
  99. data/spec/fhcap/tasks/knife/remove_spec.rb +25 -0
  100. data/spec/fhcap/tasks/provider/add_spec.rb +61 -0
  101. data/spec/fhcap/tasks/provider/remove_spec.rb +25 -0
  102. data/spec/fhcap/tasks/repo/add_spec.rb +32 -0
  103. data/spec/fhcap/tasks/repo/remove_spec.rb +25 -0
  104. data/spec/fhcap/tasks/task_base_spec.rb +51 -0
  105. data/spec/fhcap/thor_base_spec.rb +9 -0
  106. data/spec/spec_helper.rb +23 -0
  107. data/spec/support/dummy_config.rb +7 -0
  108. data/spec/support/dummy_thor.rb +3 -0
  109. data/templates/chef/cookbook/changelog.md.erb +12 -0
  110. data/templates/chef/cookbook/metadata.erb +45 -0
  111. data/templates/chef/environment_core.json.erb +278 -0
  112. data/templates/chef/environment_empty.json.erb +10 -0
  113. data/templates/chef/environment_mbaas.json.erb +120 -0
  114. data/templates/chef/environment_single.json.erb +300 -0
  115. data/templates/cluster/aws/common.json.erb +43 -0
  116. data/templates/cluster/aws/core-3node.json.erb +106 -0
  117. data/templates/cluster/aws/core-small-9node.json.erb +333 -0
  118. data/templates/cluster/aws/mbaas-3node.json.erb +116 -0
  119. data/templates/cluster/aws/nginx-test.json.erb +93 -0
  120. data/templates/cluster/aws/single-blank.json.erb +41 -0
  121. data/templates/cluster/aws/single.json.erb +88 -0
  122. data/templates/cluster/core-3node.json.erb +8 -0
  123. data/templates/cluster/core-mbaas-6node.json.erb +13 -0
  124. data/templates/cluster/core-small-9node.json.erb +8 -0
  125. data/templates/cluster/mbaas-3node.json.erb +9 -0
  126. data/templates/cluster/nginx-test.json.erb +8 -0
  127. data/templates/cluster/openstack/common.json.erb +7 -0
  128. data/templates/cluster/openstack/core-3node.json.erb +14 -0
  129. data/templates/cluster/openstack/core-small-9node.json.erb +32 -0
  130. data/templates/cluster/openstack/mbaas-3node.json.erb +14 -0
  131. data/templates/cluster/openstack/nginx-test.json.erb +11 -0
  132. data/templates/cluster/openstack/single-blank.json.erb +10 -0
  133. data/templates/cluster/openstack/single.json.erb +10 -0
  134. data/templates/cluster/single-blank.json.erb +8 -0
  135. data/templates/cluster/single.json.erb +8 -0
  136. data/templates/init/knife.rb.erb +13 -0
  137. data/templates/kitchen/Cheffile.erb +11 -0
  138. data/templates/kitchen/kitchen.aws.yml.erb +35 -0
  139. data/templates/kitchen/kitchen.docker.yml.erb +24 -0
  140. data/templates/kitchen/kitchen.generate.yml.erb +2 -0
  141. data/templates/kitchen/kitchen.openstack.yml.erb +31 -0
  142. metadata +506 -0
@@ -0,0 +1,37 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Cookbook
7
+ class List < ChefTaskBase
8
+
9
+ def run
10
+ thor.say "Chef::Cookbook::List", :yellow
11
+ cookbooks = get_cookbooks(options, nil, repo_cookbook_paths('-cookbooks'))
12
+
13
+ table_contents = [table_header("Cookbook", "Version", "Artifact Version", "Artifact Build")]
14
+
15
+ cookbooks.each do |name|
16
+ cookbook = cookbook_loader.cookbooks_by_name[name]
17
+ meta = get_cookbook_meta(name)
18
+ artifact_attribute_filepath = cookbook.attribute_filenames.find { |e| /artifact.rb/ =~ e }
19
+ artifact_version = "N/A"
20
+ artifact_build = "N/A"
21
+ artifact_path = "N/A"
22
+ if artifact_attribute_filepath
23
+ node = ::Chef::Node.new
24
+ node.from_file(artifact_attribute_filepath)
25
+ artifact_version = node.default[name]['version']
26
+ artifact_build = node.default[name]['build']
27
+ end
28
+ table_contents << table_row(name, meta.version, artifact_version, artifact_build)
29
+ end
30
+ thor.print_table table_contents
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,63 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Cookbook
7
+ class UpdateChangelog < ChefTaskBase
8
+
9
+ attr_reader :name
10
+
11
+ def initialize(options)
12
+ super
13
+ @name = options[:cookbook]
14
+ end
15
+
16
+ def run
17
+ thor.say "Chef::Cookbook::UpdateChangelog cookbook = #{name}", :yellow
18
+ cookbook = cookbook_loader.cookbooks_by_name[name]
19
+ meta = get_cookbook_meta(name)
20
+
21
+ version = meta.version
22
+ changelog_file = cookbook.root_filenames.find { |e| /CHANGELOG.md/ =~ e }
23
+
24
+ if changelog_file
25
+ changelog = parse_changelog(changelog_file)
26
+
27
+ if changelog[version]
28
+ thor.say_status("error", "Already a Changelog entry for #{name} version #{version}", :red)
29
+ else
30
+ changelog[version] = options[:'changelog-entries'] || []
31
+ thor.template(File.join('templates', 'chef', 'cookbook', 'changelog.md.erb'), changelog_file, {:cookbook => name, :changelog => changelog})
32
+ end
33
+ else
34
+ thor.say_status("error", "No Changelog found for #{name}", :red)
35
+ end
36
+
37
+ end
38
+
39
+ private
40
+
41
+ def parse_changelog(file)
42
+ changelog = {}
43
+ lines = File.readlines(file)
44
+ current_version = nil
45
+ lines.each do |line|
46
+ if match = line.match(/^## (\d+.\d+.\d+):/)
47
+ current_version = version = match[1]
48
+ changelog[version] = []
49
+ elsif match = line.match(/^* (.+)$/)
50
+ entry = match[1]
51
+ if current_version
52
+ changelog[current_version] << entry
53
+ end
54
+ end
55
+ end
56
+ changelog
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,57 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+ require 'fhcap/dummy_node'
3
+
4
+ module Fhcap
5
+ module Tasks
6
+ module Chef
7
+ module Cookbook
8
+ class UpdateMetadata < ChefTaskBase
9
+
10
+ attr_reader :name
11
+
12
+ def initialize(options)
13
+ super
14
+ @name = options[:cookbook]
15
+ end
16
+
17
+ def run
18
+ thor.say "Chef::Cookbook::UpdateMetadata cookbook = #{name}", :yellow
19
+ cookbook = cookbook_loader.cookbooks_by_name[name]
20
+ generate_metadata(cookbook)
21
+ end
22
+
23
+ private
24
+
25
+ def generate_metadata(cookbook)
26
+
27
+ meta = get_cookbook_meta(name)
28
+
29
+ metadata_filepath = cookbook.metadata_filenames.first
30
+ attribute_filepaths = cookbook.attribute_filenames
31
+
32
+ attribute_filepaths.each() do |file|
33
+ node = Fhcap::DummyNode.new
34
+ node.from_file(file)
35
+ node_attrs = node.metadata_attributes
36
+
37
+ node_attrs.each() do |k, v|
38
+ if meta.attributes[k]
39
+ node_attrs[k] = meta.attributes[k].merge(v)
40
+ end
41
+ node_attrs[k]["description"] = "" if node_attrs[k]['description'].nil? || node_attrs[k]['description'].empty?
42
+ meta.attribute(k, node_attrs[k])
43
+ end
44
+ end
45
+ meta_hash = meta.to_hash().merge({cookbook: name})
46
+
47
+ template_filepath = File.join(Fhcap.source_root, 'templates', 'chef', 'cookbook', 'metadata.erb')
48
+ eruby = Erubis::Eruby.new(File.read(template_filepath))
49
+ result = eruby.result(meta_hash)
50
+ thor.create_file(metadata_filepath, result, {force: true})
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,30 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Cookbook
7
+ class UpdateReadme < ChefTaskBase
8
+
9
+ attr_reader :name
10
+
11
+ def initialize(options)
12
+ super
13
+ @name = options[:cookbook]
14
+ end
15
+
16
+ def run
17
+ thor.say "Chef::Cookbook::UpdateReadme cookbook = #{name}", :yellow
18
+ cookbook = cookbook_loader.cookbooks_by_name[name]
19
+ metadata_file = cookbook.metadata_filenames.first
20
+ readme_file = cookbook.root_filenames.find { |e| /README/ =~ e }
21
+ cmd = "knife cookbook readme from #{metadata_file} > #{readme_file}"
22
+ thor.run(cmd)
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,90 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Cookbook
7
+ class UpdateVersion < ChefTaskBase
8
+
9
+ attr_reader :name, :version, :level
10
+
11
+ def initialize(options)
12
+ super
13
+ @name = options[:cookbook]
14
+ @version = options[:version]
15
+ @level = ('manual' if @version) || ('patch' if options[:wip]) || options[:level] || 'minor'
16
+ end
17
+
18
+ def run
19
+ thor.say "Chef::Cookbook::UpdateVersion cookbook = #{name}", :yellow
20
+ cookbook = cookbook_loader.cookbooks_by_name[name]
21
+ metadata_file = cookbook.metadata_filenames.first
22
+
23
+ if is_dirty?(metadata_file)
24
+ thor.say_status("error", "#{metadata_file} has uncommitted changes. Please reset this file or commit any changes before continuing!", :red)
25
+ else
26
+ bump(cookbook, metadata_file)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ ### Modified version of https://github.com/jonlives/knife-spork/blob/master/lib/chef/knife/spork-bump.rb
33
+
34
+ TYPE_INDEX = {:major => 0, :minor => 1, :patch => 2, :manual => 3}.freeze
35
+
36
+ def bump(cookbook, metadata_file)
37
+ old_version = cookbook.version
38
+
39
+ if bump_type == 3
40
+ # manual bump
41
+ version_array = manual_bump_version.split('.')
42
+ else
43
+ # major, minor, or patch bump
44
+ version_array = old_version.split('.').collect { |i| i.to_i }
45
+ version_array[bump_type] += 1
46
+ ((bump_type+1)..2).each { |i| version_array[i] = 0 } # reset all lower version numbers to 0
47
+ end
48
+
49
+ new_version = version_array.join('.')
50
+
51
+ new_contents = File.read(metadata_file).gsub(/(version\s+['"])[0-9\.]+(['"])/, "\\1#{new_version}\\2")
52
+ File.open(metadata_file, 'w') { |f| f.write(new_contents) }
53
+
54
+ thor.say "Successfully bumped #{cookbook.name} to v#{new_version}!"
55
+ end
56
+
57
+ def bump_type
58
+ TYPE_INDEX[(level || 'patch').to_sym]
59
+ end
60
+
61
+ def manual_bump_version
62
+ validate_version!(version)
63
+ version
64
+ end
65
+
66
+ def valid_version?(version)
67
+ version_keys = version.split('.')
68
+ return false unless version_keys.size == 3 && version_keys.any? { |k|
69
+ begin
70
+ Float(k);
71
+ rescue false;
72
+ else
73
+ true;
74
+ end }
75
+ true
76
+ end
77
+
78
+ def validate_version!(version)
79
+ if version && !valid_version?(version)
80
+ thor.say_status("error", "#{version} is not a valid version!", :red)
81
+ end
82
+ end
83
+
84
+ ###
85
+
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,115 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+ require 'sshkey'
3
+
4
+ module Fhcap
5
+ module Tasks
6
+ module Chef
7
+ module Environments
8
+ class Create < ChefTaskBase
9
+
10
+ def initialize(options)
11
+ super
12
+ @name = options[:name]
13
+ @domain = options[:domain]
14
+ @type = options[:type]
15
+ @repo = options[:repo]
16
+ @passwords = {}
17
+ end
18
+
19
+ def run
20
+ thor.say "Chef::Environments::Create name = #{@name}, type = #{@type}, domain = #{@domain}", :yellow
21
+ env_config = {
22
+ name: @name,
23
+ domain: @domain,
24
+ skip: true
25
+ }
26
+ create_environment(env_config)
27
+ create_data_bag(env_config)
28
+ end
29
+
30
+ private
31
+
32
+ def create_environment(env_config)
33
+ environment_template = "environment_#{@type}.json.erb"
34
+ environment_file = File.join(repo_dir(@repo), 'environments', "#{@name}.json")
35
+ thor.template(File.join('templates', 'chef', environment_template), environment_file, env_config)
36
+ end
37
+
38
+ def create_data_bag(env_config)
39
+ environment_data_bag_file = File.join(repo_dir(@repo), 'data_bags', 'environments', "#{@name}.json")
40
+ env_data_bag_conf = generate_template_config(env_config)
41
+ current_config = File.exists?(environment_data_bag_file) ? JSON.parse(IO.read(environment_data_bag_file), {:symbolize_names => true}) : {}
42
+ env_data_bag_conf.merge!(current_config)
43
+ thor.create_file(environment_data_bag_file, JSON.pretty_generate(env_data_bag_conf))
44
+ passwords_file = File.join(repo_dir(@repo), repo_clusters_dir(@repo), "#{@name}_passwords.json")
45
+ thor.create_file(passwords_file, JSON.pretty_generate(@passwords), skip: true)
46
+ end
47
+
48
+ def random_password(name)
49
+ unless @passwords[name]
50
+ @passwords[name] = SecureRandom.urlsafe_base64(6)
51
+ end
52
+ @passwords[name]
53
+ end
54
+
55
+ def hashed_password(name)
56
+ `openssl passwd -1 #{random_password(name)}`.strip
57
+ end
58
+
59
+ def generate_template_config(env_config)
60
+ config = {
61
+ id: env_config[:name]
62
+ }
63
+
64
+ #users
65
+ users = %w{hadmin henryd}
66
+ config[:users] = {}
67
+
68
+ users.each do |user|
69
+ config[:users][user.to_sym] = {}
70
+ key = SSHKey.generate(:comment => "#{user}@feedhenry")
71
+ config[:users][user.to_sym][:ssh_public_key] = key.ssh_public_key
72
+ config[:users][user.to_sym][:ssh_private_key] = key.private_key
73
+ end
74
+
75
+ config[:users][:hadmin][:password] = hashed_password('users.hadmin')
76
+ config[:users][:hadmin][:ssh_keys] = []
77
+
78
+ #ssh keys
79
+ ssh_key_users = %w{gitolite gitlab_shell repoadmin nagios_user}
80
+ ssh_key_users.each do |user|
81
+ config[user.to_sym] = {}
82
+ key = SSHKey.generate(:comment => "#{user}@feedhenry")
83
+ config[user.to_sym][:ssh_public_key] = key.ssh_public_key
84
+ config[user.to_sym][:ssh_private_key] = key.private_key
85
+ end
86
+ config[:users][:hadmin][:ssh_keys] << config[:nagios_user][:ssh_public_key]
87
+
88
+ #root_user
89
+ config[:root_user] = {password: hashed_password('root_user')}
90
+
91
+ #henry_users
92
+ config[:henry_users] = []
93
+
94
+ config[:henry_users] << {name: 'team.ops', password: hashed_password('henry_users.teamops')}
95
+ config[:henry_users] << {name: 'team.eng', password: hashed_password('henry_users.teameng')}
96
+ config[:henry_users] << {name: 'team.support', password: hashed_password('henry_users.teamsupport')}
97
+ config[:henry_users] << {name: 'team.qe', password: hashed_password('henry_users.qe')}
98
+ config[:henry_users] << {name: 'team.ps', password: hashed_password('henry_users.ps')}
99
+ config[:henry_users].uniq! { |u| u[:name] }
100
+
101
+ config[:mongodb] = {}
102
+ config[:mongodb][:shared_key] = "bim4jSl3AL0Dna7gU/4YOOIZtDOl4HmTFXR8Jz8EHnm7qTSRxm3NrvDIyvQmz3FZVHdyi9BgSBVmm2Yti74aOIbHLsX3l+tN+gNnu265uSC3o9qIVDNxwOFLTZc3TNtxgBD7BGCkwKMI/T4LVADuDlmZEcUHddZcpYbzmwMT47af3VzoN91yiRLXM/cwsU2ZtWCgg8gAbE1tOZ0pOUPLvXuJvREz7cena6cP0OaA/yvJ9V2sWaTPj3dr3tApPdRW5a2fPrVW/Q9k9krvEd/6+cabSNaIsIK1P1E1qvxNE+WfY2M6TwVN69o/0IfE9TbJp+n1kQzrOudYiI0r793uXAMFfVEqrhFKhs/q9gkZFOcgx0f8LnxLTGeV4umJJ4vs0wtaJoRBQzsDhZ7c0+Itw7jNTNu3mmAYqcVE3k4hTRZGKKH9r+f1l3s4H2esLQ6VFkRJ++wMKu6Rku1FR4c8d4/g74C+GPWjrexUhgTJZWgvqGwA4NsgCfV3rkybHnhOvph3B+dKwJYc3QegeN5fk2ct4EIaRIKsArd+SNJbRkXSkmCunkiZwzcWEqbxXHbsqXRH/DT2/03aDvA9qUUH08/J1ILdJxIbjiOKG6pCT0cWgyn2DqLYh9XB7JyofJYDsUThZYKEFnnSnqgcHKbajKUuQMX82Znj50g2Dfry9SQK5E/zMKF2XE56+cvOowcqziel08Oyc/poH78t6izpKoVT98CjPuaj7CYB6qgUr4xFFToTDHDYI9kQ0cLLmIUcYYkCNXciFCcViC0EatUcaNduA25lIYO7Zy1t5BN3gLtt1fgMhvqWqM37EjcJuGcSdiOaShlFnb4cbHKFFmcJy05/NkA3GwZAWJ37sm27vxt1g08JXwqMdrAjnaPp31v03N10PgGSDa2PjZa2AG9Hg44ZwrfLU5ftaluClhZQYUtCmS0OHeuonULicQWHF3qxUYx5w668HP5QyvXyzlYGkw1WhY9i"
103
+
104
+ config[:admin_contacts] = []
105
+
106
+ nocAlerts = {email: 'noc.alerts@example.com', nagios: true, syslog_ng_watchdog: true, backup_watchdog: true, forward: true, crons: true}
107
+ config[:admin_contacts] << nocAlerts
108
+ config
109
+ end
110
+
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,37 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Environments
7
+ class Destroy < ChefTaskBase
8
+
9
+ attr_reader :name, :chef_server
10
+
11
+ def initialize(options)
12
+ super
13
+ @name = options[:name]
14
+ @repo = options[:repo]
15
+ @chef_server = options[:chef_server]
16
+ end
17
+
18
+ def run
19
+ thor.say "Chef::Environments::Destroy #{@name}", :yellow
20
+
21
+ if @chef_server
22
+ if thor.yes? "Remove all environments and config from the chef server (#{@chef_server})?"
23
+ run_knife_cmd("environment delete #{@name} -y", @chef_server)
24
+ run_knife_cmd("data bag delete environments #{@name} -y", @chef_server)
25
+ end
26
+ end
27
+
28
+ thor.remove_file find_data_bag_item('environments', @name)
29
+ thor.remove_file find_environment(@name)
30
+ thor.remove_file find_repo_item(repo_clusters_dir(@repo), "#{@name}_passwords.json").first
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ require 'fhcap/tasks/chef/chef_task_base'
2
+
3
+ module Fhcap
4
+ module Tasks
5
+ module Chef
6
+ module Environments
7
+ class PromoteCookbooks < ChefTaskBase
8
+
9
+ attr_reader :environments, :cookbooks
10
+
11
+ def initialize(options)
12
+ super
13
+ @environments = options[:environments] || []
14
+ @cookbooks = options[:cookbooks] || []
15
+ end
16
+
17
+ def run
18
+ cookbooks = get_cookbooks(options)
19
+ thor.say "Chef::Environments::PromoteCookbooks: environments = #{environments}", :yellow
20
+ if environments.empty?
21
+ exit_with_error("You must specify at least one environment during promote!")
22
+ else
23
+ repo_cookbook_versions = get_cookbook_versions(options) do |cookbook, version|
24
+ thor.say("Adding version constraint #{cookbook} = #{version}") if verbose
25
+ end
26
+
27
+ environments.each do |environment|
28
+ environment_filepath = find_environment(environment)
29
+ if environment_filepath
30
+ environment_data = JSON.parse(IO.read(environment_filepath))
31
+ env_cookbook_versions = environment_data['cookbook_versions'] || {}
32
+ cookbooks.each do |cookbook|
33
+ env_cookbook_versions[cookbook] = "= #{repo_cookbook_versions[cookbook]}"
34
+ end
35
+ thor.create_file(environment_filepath, JSON.pretty_generate(environment_data), :force => true)
36
+ else
37
+ thor.say "Unknown environment #{environment}", :red
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end