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,59 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::aws"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+
7
+ key_pair_name = key_pair_name_for(org_name)
8
+ aws_key_pair key_pair_name
9
+
10
+ #aws_key_pair 'my-aws-key' do
11
+ # private_key_path "~boiardi/.ssh/my-aws-key.pem"
12
+ # public_key_path "~boiardi/.ssh/my-aws-key.pub"
13
+ # allow_overwrite false # Set to true if you want to regenerate this each chef run
14
+ #end
15
+
16
+ #Create VPC
17
+ vpc_name = vpc_name_for(org_name)
18
+
19
+ aws_vpc vpc_name do
20
+ cidr_block cluster_config[:vpc][:cidr]
21
+ internet_gateway true
22
+ main_routes '0.0.0.0/0' => :internet_gateway
23
+ end
24
+
25
+ # Create Security Groups
26
+ cluster_config[:security_groups].each do |sg_name, sg_config|
27
+ aws_security_group security_group_name_for(org_name, sg_name) do
28
+ vpc vpc_name
29
+ inbound_rules inbound_rules_for(org_name, sg_config[:authorize_ingress])
30
+ end
31
+ end
32
+
33
+ # Create Route Tables
34
+ cluster_config[:environments].each do |env, env_config|
35
+
36
+ env_route_table = route_table_name_for(org_name, env)
37
+ aws_route_table env_route_table do
38
+ vpc vpc_name
39
+ routes '0.0.0.0/0' => :internet_gateway
40
+ end
41
+
42
+ env_config[:subnets].each do |subnet_suffix, subnet_config|
43
+
44
+ subnet_name = subnet_name_for(org_name, env, subnet_suffix)
45
+ aws_subnet subnet_name do
46
+ vpc vpc_name
47
+ cidr_block subnet_config[:cidr]
48
+ availability_zone subnet_config[:availability_zone]
49
+ route_table env_route_table
50
+ map_public_ip_on_launch true
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ include_recipe "provision::cluster_provision_instances"
58
+
59
+ include_recipe "provision::aws_cluster_create_elb"
@@ -0,0 +1,61 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::aws"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+
7
+ # Create Load Balancers
8
+ cluster_config[:environments].each do |env, env_config|
9
+
10
+ env_config[:load_balancers].each do |lb_name, lb_config|
11
+
12
+ lb_config[:security_groups] = lb_config[:security_groups].collect do |security_group|
13
+ security_group_name_for(org_name, security_group)
14
+ end
15
+
16
+ lb_config[:subnets] = lb_config[:subnets].collect do |subnet_name|
17
+ subnet_name_for(org_name, env, subnet_name)
18
+ end
19
+
20
+ lb_certs = {}
21
+ lb_config[:listeners].each_with_index do |listener, index|
22
+ if listener[:server_certificate]
23
+ certificate_file = File.join(node[:local_repo_path], 'clusters', 'ssl_certs', "#{listener[:server_certificate]}-certificate.pem")
24
+ private_key_file = File.join(node[:local_repo_path], 'clusters', 'ssl_certs', "#{listener[:server_certificate]}-private-key.pem")
25
+
26
+ if File.exists?(certificate_file) && File.exists?(private_key_file)
27
+ certificate_body = File.open(certificate_file, "rb").read
28
+ private_key = File.open(private_key_file, "rb").read
29
+
30
+ cert_name = listener[:server_certificate]
31
+ lb_certs[index] = aws_server_certificate cert_name do
32
+ certificate_body certificate_body
33
+ private_key private_key
34
+ end
35
+ else
36
+ Chef::Log.warn("Could not find #{listener[:server_certificate]} locally to upload. Is this certificate already registered? ELB create will fail if it does not exist!!")
37
+ end
38
+ end
39
+ end
40
+
41
+ lb_machines = env_config[:instances].select do |instance_name, instance_config|
42
+ instance_config[:load_balancers] && instance_config[:load_balancers].include?(lb_name.to_s)
43
+ end.collect do |instance_name, instance_config|
44
+ instance_name_for(org_name, env, instance_name)
45
+ end
46
+
47
+ lb_name = load_balancer_name_for(org_name, env, lb_name)
48
+ load_balancer lb_name do
49
+ machines lb_machines
50
+ load_balancer_options(
51
+ lazy do
52
+ lb_certs.each do |index, cert|
53
+ lb_config[:listeners][index][:server_certificate] = cert.aws_object.arn
54
+ end
55
+ lb_config
56
+ end
57
+ )
58
+ end
59
+
60
+ end if env_config[:load_balancers]
61
+ end
@@ -0,0 +1,52 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::aws"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+
6
+ org_name = cluster_config[:id]
7
+
8
+ node_names = node_names_for(cluster_config)
9
+
10
+ machine_batch do
11
+ machines node_names
12
+ action :destroy
13
+ end
14
+
15
+ # Clear all rules from Security Groups
16
+ cluster_config[:security_groups].each do |sg_name, sg_config|
17
+ aws_security_group security_group_name_for(org_name, sg_name) do
18
+ inbound_rules []
19
+ end
20
+ end
21
+
22
+ vpc_name = vpc_name_for(org_name)
23
+ aws_vpc vpc_name do
24
+ action :purge
25
+ end
26
+
27
+ cluster_config[:environments].each do |env, env_config|
28
+
29
+ aws_route_table route_table_name_for(org_name, env) do
30
+ action :destroy
31
+ end
32
+
33
+ env_config[:subnets].each do |subnet_suffix, subnet_config|
34
+ aws_subnet subnet_name_for(org_name, env, subnet_suffix) do
35
+ action :destroy
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ cluster_config[:environments].each do |env, env_config|
42
+ env_config[:load_balancers].each do |lb_name, lb_config|
43
+ lb_name = load_balancer_name_for(org_name, env, lb_name)
44
+ load_balancer lb_name do
45
+ action :destroy
46
+ end
47
+ end if env_config[:load_balancers]
48
+ end
49
+
50
+ aws_key_pair key_pair_name_for(org_name) do
51
+ action :destroy
52
+ end
@@ -0,0 +1,2 @@
1
+
2
+ include_recipe "provision::#{node['driver']}_cluster_create"
@@ -0,0 +1,2 @@
1
+
2
+ include_recipe "provision::#{node['driver']}_cluster_destroy"
@@ -0,0 +1,11 @@
1
+ include_recipe "provision::common"
2
+ include_recipe "provision::#{node['driver']}"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+ node_names = node_names_for(cluster_config)
7
+
8
+ machine_batch do
9
+ machines node_names
10
+ action :destroy
11
+ end
@@ -0,0 +1,4 @@
1
+
2
+ include_recipe 'provision::common'
3
+ include_recipe "provision::#{node['driver']}"
4
+ include_recipe "provision::cluster_provision_instances"
@@ -0,0 +1,55 @@
1
+ cluster_config = cluster_config_for(node)
2
+ org_name = cluster_config[:id]
3
+
4
+ # Create/Provision Instances
5
+ default_instance_options = cluster_config[:default_instance_options]
6
+ cluster_config[:environments].each do |env, env_config|
7
+ chef_environment = fh_name_for(org_name, env)
8
+
9
+ instances = {}
10
+ env_config[:instances].each do |instance_name, instance_config|
11
+ instances[instance_name_for(org_name, env, instance_name)] = {}
12
+ instances[instance_name_for(org_name, env, instance_name)][:instance_config] = instance_config
13
+ instances[instance_name_for(org_name, env, instance_name)][:machine_options] = machine_options_for(cluster_config[:driver], org_name, env, default_instance_options.merge(instance_config[cluster_config[:driver].to_sym] || {}))
14
+ end
15
+
16
+ current_nodes = search(:node, "chef_environment:#{chef_environment}").map { |n| n.name }
17
+ required_nodes = instances.keys
18
+ missing_nodes = required_nodes - current_nodes
19
+
20
+ with_chef_environment chef_environment do
21
+
22
+ machine_batch do
23
+ missing_nodes.each do |instance_name|
24
+ machine_options = instances[instance_name][:machine_options]
25
+ machine instance_name do
26
+ chef_environment chef_environment
27
+ run_list ["recipe[feedhenry_common::hostname]"]
28
+ machine_options(machine_options)
29
+ end
30
+ end
31
+ not_if { missing_nodes.empty? }
32
+ end
33
+
34
+ if required_nodes.length > 1
35
+ converge_times = missing_nodes.empty? ? 1 : 3
36
+ else
37
+ converge_times = 1
38
+ end
39
+
40
+ converge_times.times do
41
+ machine_batch do
42
+ required_nodes.each do |instance_name|
43
+ machine_options = instances[instance_name][:machine_options]
44
+ instance_config = instances[instance_name][:instance_config]
45
+ machine instance_name do
46
+ chef_environment chef_environment
47
+ run_list instance_config[:run_list]
48
+ machine_options(machine_options)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::#{node['driver']}"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+
7
+ cluster_config[:environments].each do |env, env_config|
8
+ chef_environment = fh_name_for(org_name, env)
9
+
10
+ nodes = search(:node, "chef_environment:#{chef_environment}")
11
+
12
+ with_chef_environment chef_environment do
13
+
14
+ nodes.each do |n|
15
+ machine_execute 'sudo fhctl status' do
16
+ live_stream true
17
+ machine n.name
18
+ only_if {n.recipes.include? 'feedhenry_common::fhctl'}
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,9 @@
1
+
2
+ raise "Missing cluster id" unless node['id']
3
+ raise "Missing driver" unless node['driver']
4
+ raise "Missing chef server config" unless node['chef_server_config']
5
+
6
+ with_chef_server node['chef_server_config']['chef_server_url'],
7
+ :client_name => node['chef_server_config']['node_name'],
8
+ :signing_key_filename => node['chef_server_config']['client_key'],
9
+ :ssl_verify_mode => :verify_none
@@ -0,0 +1,5 @@
1
+ #
2
+ # Cookbook Name:: provision
3
+ # Recipe:: default
4
+ #
5
+ # Copyright (c) 2015 The Authors, All Rights Reserved.
@@ -0,0 +1,11 @@
1
+ raise "Missing openstack credentials" unless node['provider_credentials']['os-username'] && node['provider_credentials']['os-password']
2
+
3
+ require 'chef/provisioning/fog_driver/driver'
4
+
5
+ os_auth_url = File.join(node['provider_credentials']['os-auth-url'], 'tokens')
6
+ with_driver "fog:OpenStack:#{os_auth_url}", :compute_options => {
7
+ :openstack_username => node['provider_credentials']['os-username'],
8
+ :openstack_api_key => node['provider_credentials']['os-password'],
9
+ :openstack_auth_url => os_auth_url,
10
+ :openstack_tenant => node['provider_credentials']['os-tenant-name']
11
+ }
@@ -0,0 +1,11 @@
1
+
2
+ include_recipe 'provision::common'
3
+ include_recipe "provision::openstack"
4
+
5
+ cluster_config = cluster_config_for(node)
6
+ org_name = cluster_config[:id]
7
+
8
+ key_pair_name = key_pair_name_for(org_name)
9
+ fog_key_pair key_pair_name
10
+
11
+ include_recipe "provision::cluster_provision_instances"
@@ -0,0 +1,4 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::openstack"
3
+
4
+ include_recipe "provision::cluster_destroy_instances"
@@ -0,0 +1,49 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::#{node['driver']}"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+
7
+ default_instance_options = cluster_config[:default_instance_options]
8
+ cluster_config[:environments].each do |env, env_config|
9
+ chef_environment = fh_name_for(org_name, env)
10
+
11
+ instances = {}
12
+ env_config[:instances].each do |instance_name, instance_config|
13
+ instances[instance_name_for(org_name, env, instance_name)] = {}
14
+ instances[instance_name_for(org_name, env, instance_name)][:instance_config] = instance_config
15
+ instances[instance_name_for(org_name, env, instance_name)][:machine_options] = machine_options_for(cluster_config[:driver], org_name, env, default_instance_options.merge(instance_config[cluster_config[:driver].to_sym] || {}))
16
+ end
17
+
18
+ rabbit_nodes = search(:node, "chef_environment:#{chef_environment} AND roles:rabbitmq_server").map { |n| n.name }
19
+
20
+ with_chef_environment chef_environment do
21
+
22
+ rabbit_nodes.each do |instance_name|
23
+ machine_execute 'sudo rabbitmqctl stop_app' do
24
+ machine instance_name
25
+ end
26
+
27
+ machine_execute 'sudo rabbitmqctl reset' do
28
+ machine instance_name
29
+ end
30
+
31
+ machine_execute 'sudo rabbitmqctl start_app' do
32
+ machine instance_name
33
+ end
34
+ end
35
+
36
+ machine_batch do
37
+ rabbit_nodes.each do |instance_name|
38
+ machine_options = instances[instance_name][:machine_options]
39
+ instance_config = instances[instance_name][:instance_config]
40
+ machine instance_name do
41
+ chef_environment chef_environment
42
+ run_list instance_config[:run_list]
43
+ machine_options(machine_options)
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ include_recipe 'provision::common'
2
+ include_recipe "provision::#{node['driver']}"
3
+
4
+ cluster_config = cluster_config_for(node)
5
+ org_name = cluster_config[:id]
6
+
7
+ cluster_config[:environments].each do |env, env_config|
8
+ chef_environment = fh_name_for(org_name, env)
9
+
10
+ nodes = search(:node, "chef_environment:#{chef_environment}")
11
+
12
+ with_chef_environment chef_environment do
13
+
14
+ nodes.each do |n|
15
+ machine_execute 'sudo fhctl restart' do
16
+ live_stream true
17
+ machine n.name
18
+ only_if {n.recipes.include? 'feedhenry_common::fhctl'}
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,21 @@
1
+ class Chef
2
+ module Provisioning
3
+
4
+ def self.connect_to_machine(machine_spec, config = Cheffish.profiled_config, driver=nil)
5
+
6
+ chef_server = Cheffish.default_chef_server(config)
7
+ if machine_spec.is_a?(String)
8
+ machine_spec = chef_managed_entry_store(chef_server).get(:machine, machine_spec)
9
+ end
10
+ driver = driver_for_url(machine_spec.driver_url, config) unless driver
11
+ if driver
12
+ machine_options = {:convergence_options => {:chef_server => chef_server}}
13
+ machine_options = Cheffish::MergedConfig.new(config[:machine_options], machine_options) if config[:machine_options]
14
+ driver.connect_to_machine(machine_spec, machine_options)
15
+ else
16
+ nil
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ class Chef
2
+ module Provisioning
3
+ module AWSDriver
4
+ class Driver < Chef::Provisioning::Driver
5
+
6
+ def initialize(driver_url, config)
7
+ super
8
+
9
+ _, profile_name, region = driver_url.split(':')
10
+ profile_name = nil if profile_name && profile_name.empty?
11
+ region = nil if region && region.empty?
12
+
13
+ credentials = profile_name ? aws_credentials[profile_name] : aws_credentials.default
14
+ @aws_config = AWS.config(
15
+ access_key_id: credentials[:aws_access_key_id],
16
+ secret_access_key: credentials[:aws_secret_access_key],
17
+ region: region || credentials[:region],
18
+ proxy_uri: credentials[:proxy_uri] || nil,
19
+ session_token: credentials[:aws_session_token] || nil,
20
+ logger: Chef::Log.logger
21
+ )
22
+
23
+ # TODO document how users could add something to the Aws.config themselves if they want to
24
+ # Right now we are supporting both V1 and V2, so we create 2 config sets
25
+ credentials2 = ::Aws::Credentials.new(
26
+ credentials[:aws_access_key_id],
27
+ credentials[:aws_secret_access_key],
28
+ ENV["AWS_SESSION_TOKEN"]
29
+ )
30
+
31
+ Chef::Config.chef_provisioning ||= {}
32
+ ::Aws.config.update(
33
+ credentials: credentials2,
34
+ region: region || ENV["AWS_DEFAULT_REGION"] || credentials[:region],
35
+ # TODO when we get rid of V1 replace the credentials class with something that knows how
36
+ # to read ~/.aws/config
37
+ :http_proxy => credentials[:proxy_uri] || nil,
38
+ logger: Chef::Log.logger,
39
+ retry_limit: Chef::Config.chef_provisioning[:aws_retry_limit] || 5
40
+ )
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end