chef-metal 0.10.2 → 0.11.beta

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -5
  3. data/README.md +3 -3
  4. data/bin/metal +5 -9
  5. data/lib/chef/provider/machine.rb +81 -32
  6. data/lib/chef/provider/machine_batch.rb +67 -58
  7. data/lib/chef/provider/machine_execute.rb +7 -7
  8. data/lib/chef/provider/machine_file.rb +11 -11
  9. data/lib/chef/resource/machine.rb +11 -15
  10. data/lib/chef/resource/machine_batch.rb +1 -1
  11. data/lib/chef/resource/machine_execute.rb +3 -4
  12. data/lib/chef/resource/machine_file.rb +3 -4
  13. data/lib/chef_metal.rb +26 -28
  14. data/lib/chef_metal/action_handler.rb +9 -7
  15. data/lib/chef_metal/add_prefix_action_handler.rb +7 -5
  16. data/lib/chef_metal/chef_machine_spec.rb +64 -0
  17. data/lib/chef_metal/{provider_action_handler.rb → chef_provider_action_handler.rb} +27 -14
  18. data/lib/chef_metal/chef_run_data.rb +68 -7
  19. data/lib/chef_metal/convergence_strategy.rb +14 -3
  20. data/lib/chef_metal/convergence_strategy/install_cached.rb +24 -10
  21. data/lib/chef_metal/convergence_strategy/install_msi.rb +17 -10
  22. data/lib/chef_metal/convergence_strategy/install_sh.rb +20 -10
  23. data/lib/chef_metal/convergence_strategy/no_converge.rb +20 -13
  24. data/lib/chef_metal/convergence_strategy/precreate_chef_objects.rb +51 -47
  25. data/lib/chef_metal/{provider.rb → driver.rb} +103 -79
  26. data/lib/chef_metal/machine.rb +13 -5
  27. data/lib/chef_metal/machine/basic_machine.rb +11 -11
  28. data/lib/chef_metal/machine/unix_machine.rb +6 -6
  29. data/lib/chef_metal/machine/windows_machine.rb +3 -3
  30. data/lib/chef_metal/machine_spec.rb +22 -25
  31. data/lib/chef_metal/recipe_dsl.rb +34 -9
  32. data/lib/chef_metal/transport.rb +7 -2
  33. data/lib/chef_metal/transport/ssh.rb +42 -9
  34. data/lib/chef_metal/transport/winrm.rb +8 -5
  35. data/lib/chef_metal/version.rb +1 -1
  36. data/spec/integration/machine.rb +29 -0
  37. metadata +21 -9
  38. data/lib/chef_metal/aws_credentials.rb +0 -58
  39. data/lib/chef_metal/openstack_credentials.rb +0 -44
  40. data/lib/chef_metal/provisioner.rb +0 -121
@@ -1,58 +0,0 @@
1
- module ChefMetal
2
- # Reads in a credentials file in Amazon's download format and presents the credentials to you
3
- class AWSCredentials
4
- def initialize
5
- @credentials = {}
6
- end
7
-
8
- def default
9
- @credentials['default'] || @credentials.first[1]
10
- end
11
-
12
- def keys
13
- @credentials.keys
14
- end
15
-
16
- def [](name)
17
- @credentials[name]
18
- end
19
-
20
- def load_ini(credentials_ini_file)
21
- require 'inifile'
22
- inifile = IniFile.load(File.expand_path(credentials_ini_file))
23
- inifile.each_section do |section|
24
- if section =~ /^\s*profile\s+(.+)$/ || section =~ /^\s*(default)\s*/
25
- profile = $1.strip
26
- @credentials[profile] = {
27
- :access_key_id => inifile[section]['aws_access_key_id'],
28
- :secret_access_key => inifile[section]['aws_secret_access_key'],
29
- :region => inifile[section]['region']
30
- }
31
- end
32
- end
33
- end
34
-
35
- def load_csv(credentials_csv_file)
36
- require 'csv'
37
- CSV.new(File.open(credentials_csv_file), :headers => :first_row).each do |row|
38
- @credentials[row['User Name']] = {
39
- :user_name => row['User Name'],
40
- :access_key_id => row['Access Key Id'],
41
- :secret_access_key => row['Secret Access Key']
42
- }
43
- end
44
- end
45
-
46
- def load_default
47
- load_ini('~/.aws/config')
48
- end
49
-
50
- def self.method_missing(name, *args, &block)
51
- singleton.send(name, *args, &block)
52
- end
53
-
54
- def self.singleton
55
- @aws_credentials ||= AWSCredentials.new
56
- end
57
- end
58
- end
@@ -1,44 +0,0 @@
1
- module ChefMetal
2
- # Reads in a credentials file
3
- class OpenstackCredentials
4
- def initialize
5
- @credentials = {}
6
- end
7
-
8
- def default
9
- @credentials['default'] || @credentials.first[1]
10
- end
11
-
12
- def keys
13
- @credentials.keys
14
- end
15
-
16
- def [](name)
17
- @credentials[name]
18
- end
19
-
20
- def load_yaml(credentials_yaml_file)
21
- creds_file = YAML.load_file(File.expand_path(credentials_yaml_file))
22
- creds_file.each do |section, creds|
23
- @credentials[section] = {
24
- :openstack_username => creds_file[section]['openstack_username'],
25
- :openstack_api_key => creds_file[section]['openstack_api_key'],
26
- :openstack_tenant => creds_file[section]['openstack_tenant'],
27
- :openstack_auth_url => creds_file[section]['openstack_auth_url']
28
- }
29
- end
30
- end
31
-
32
- def load_default
33
- load_yaml('~/.fog')
34
- end
35
-
36
- def self.method_missing(name, *args, &block)
37
- singleton.send(name, *args, &block)
38
- end
39
-
40
- def self.singleton
41
- @openstack_credentials ||= OpenstackCredentials.new
42
- end
43
- end
44
- end
@@ -1,121 +0,0 @@
1
- require 'chef_metal/add_prefix_action_handler'
2
-
3
- module ChefMetal
4
- class Provisioner
5
- # Inflate a provisioner from node information; we don't want to force the
6
- # driver to figure out what the provisioner really needs, since it varies
7
- # from provisioner to provisioner.
8
- #
9
- # ## Parameters
10
- # node - node to inflate the provisioner for
11
- #
12
- # returns a should return a Privisoner from the information provided
13
- def self.inflate(node)
14
- raise "#{self.class} does not override self.inflate"
15
- end
16
-
17
- # Acquire a machine, generally by provisioning it. Returns a Machine
18
- # object pointing at the machine, allowing useful actions like setup,
19
- # converge, execute, file and directory. The Machine object will have a
20
- # "node" property which must be saved to the server (if it is any
21
- # different from the original node object).
22
- #
23
- # ## Parameters
24
- # action_handler - the action_handler object that is calling this method; this
25
- # is generally a provider, but could be anything that can support the
26
- # interface (i.e., in the case of the test kitchen metal driver for
27
- # acquiring and destroying VMs).
28
- # node - node object (deserialized json) representing this machine. If
29
- # the node has a provisioner_options hash in it, these will be used
30
- # instead of options provided by the provisioner. TODO compare and
31
- # fail if different?
32
- # node will have node['normal']['provisioner_options'] in it with any
33
- # options. It is a hash with at least these options:
34
- #
35
- # -- provisioner_url: <provisioner url>
36
- #
37
- # node['normal']['provisioner_output'] will be populated with
38
- # information about the created machine. For vagrant, it is a hash
39
- # with at least these options:
40
- #
41
- # -- provisioner_url: <provisioner url>
42
- #
43
- def acquire_machine(action_handler, node)
44
- raise "#{self.class} does not override acquire_machine"
45
- end
46
-
47
- # Connect to a machine without acquiring it. This method will NOT make any
48
- # changes to anything.
49
- #
50
- # ## Parameters
51
- # node - node object (deserialized json) representing this machine. The
52
- # node may have normal attributes "provisioner_options" and
53
- # "provisioner_output" in it, representing the input and output of
54
- # any prior "acquire_machine" process (if any).
55
- #
56
- def connect_to_machine(node)
57
- raise "#{self.class} does not override connect_to_machine"
58
- end
59
-
60
- # Delete the given machine (idempotent). Should destroy the machine,
61
- # returning things to the state before acquire_machine was called.
62
- def delete_machine(action_handler, node)
63
- raise "#{self.class} does not override delete_machine"
64
- end
65
-
66
- # Stop the given machine.
67
- def stop_machine(action_handler, node)
68
- raise "#{self.class} does not override stop_machine"
69
- end
70
-
71
- # Provider notification that happens at the point a resource is declared
72
- # (after all properties have been set on it)
73
- def resource_created(machine)
74
- end
75
-
76
- #
77
- # Batch methods
78
- #
79
-
80
- # Acquire machines in batch, in parallel if possible.
81
- def acquire_machines(action_handler, nodes_json, parallelizer)
82
- parallelizer.parallelize(nodes_json) do |node_json|
83
- machine = acquire_machine(add_prefix(node_json, action_handler), node_json)
84
- yield node_json, machine if block_given?
85
- machine
86
- end.to_a
87
- end
88
-
89
- # Stop machines in batch, in parallel if possible.
90
- def stop_machines(action_handler, nodes_json, parallelizer)
91
- parallelizer.parallelize(nodes_json) do |node_json|
92
- stop_machine(add_prefix(node_json, action_handler), node_json)
93
- yield node_json if block_given?
94
- end.to_a
95
- end
96
-
97
- # Delete machines in batch, in parallel if possible.
98
- def delete_machines(action_handler, nodes_json, parallelizer)
99
- parallelizer.parallelize(nodes_json) do |node_json|
100
- delete_machine(add_prefix(node_json, action_handler), node_json)
101
- yield node_json if block_given?
102
- end.to_a
103
- end
104
-
105
- protected
106
-
107
- def save_node(provider, node, chef_server)
108
- # Save the node and create the client. TODO strip automatic attributes first so we don't race with "current state"
109
- ChefMetal.inline_resource(provider) do
110
- chef_node node['name'] do
111
- chef_server chef_server
112
- raw_json node
113
- end
114
- end
115
- end
116
-
117
- def add_prefix(node_json, action_handler)
118
- AddPrefixActionHandler.new(action_handler, "[#{node_json['name']}] ")
119
- end
120
- end
121
- end