corl 0.5.0 → 0.5.1

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/VERSION +1 -1
  4. data/bootstrap/os/ubuntu/06_puppet.sh +1 -1
  5. data/corl.gemspec +171 -3
  6. data/lib/CORL/builder/identity.rb +6 -3
  7. data/lib/CORL/builder/package.rb +3 -3
  8. data/lib/CORL/configuration/file.rb +21 -7
  9. data/lib/CORL/machine/vagrant.rb +3 -3
  10. data/lib/CORL/node/vagrant.rb +2 -5
  11. data/lib/CORL/provisioner/puppetnode.rb +8 -8
  12. data/lib/core/facade.rb +7 -3
  13. data/lib/core/mixin/action/keypair.rb +3 -3
  14. data/lib/core/mixin/action/registration.rb +31 -0
  15. data/lib/core/mixin/lookup.rb +50 -6
  16. data/lib/core/mixin/machine/ssh.rb +4 -4
  17. data/lib/core/plugin/cloud_action.rb +8 -1
  18. data/lib/core/plugin/configuration.rb +6 -7
  19. data/lib/core/plugin/fog_node.rb +7 -0
  20. data/lib/core/plugin/network.rb +31 -0
  21. data/lib/core/plugin/node.rb +182 -117
  22. data/lib/core/vagrant/provisioner/provisioner.rb +1 -1
  23. data/lib/nucleon/action/cloud/config.rb +259 -0
  24. data/lib/nucleon/action/cloud/images.rb +1 -1
  25. data/lib/nucleon/action/cloud/inspect.rb +11 -2
  26. data/lib/nucleon/action/cloud/machines.rb +1 -1
  27. data/lib/nucleon/action/cloud/regions.rb +1 -1
  28. data/lib/nucleon/action/cloud/settings.rb +185 -0
  29. data/lib/nucleon/action/node/IP.rb +1 -1
  30. data/lib/nucleon/action/node/bootstrap.rb +1 -1
  31. data/lib/nucleon/action/node/cache.rb +133 -0
  32. data/lib/nucleon/action/node/fact.rb +119 -0
  33. data/lib/nucleon/action/node/facts.rb +16 -16
  34. data/lib/nucleon/action/node/group.rb +115 -0
  35. data/lib/nucleon/action/node/groups.rb +33 -0
  36. data/lib/nucleon/action/node/identity.rb +75 -0
  37. data/lib/nucleon/action/node/lookup.rb +20 -7
  38. data/lib/nucleon/action/node/seed.rb +6 -6
  39. data/lib/nucleon/action/node/status.rb +76 -0
  40. data/lib/nucleon/action/plugin/create.rb +169 -0
  41. data/lib/nucleon/action/plugin/list.rb +69 -0
  42. data/lib/nucleon/action/plugin/template/nucleon.action.erb +56 -0
  43. data/lib/nucleon/action/plugins.rb +14 -0
  44. data/locales/en.yml +3 -0
  45. data/rdoc/site/0.5.0/CORL/Build.html +757 -0
  46. data/rdoc/site/0.5.0/CORL/Builder/Identity.html +569 -0
  47. data/rdoc/site/0.5.0/CORL/Builder/Package.html +576 -0
  48. data/rdoc/site/0.5.0/CORL/Builder.html +360 -0
  49. data/rdoc/site/0.5.0/CORL/Configuration/File.html +1148 -0
  50. data/rdoc/site/0.5.0/CORL/Configuration.html +359 -0
  51. data/rdoc/site/0.5.0/CORL/Errors.html +359 -0
  52. data/rdoc/site/0.5.0/CORL/Facade.html +899 -0
  53. data/rdoc/site/0.5.0/CORL/Machine/AWS.html +753 -0
  54. data/rdoc/site/0.5.0/CORL/Machine/Fog.html +1289 -0
  55. data/rdoc/site/0.5.0/CORL/Machine/Physical.html +1059 -0
  56. data/rdoc/site/0.5.0/CORL/Machine/Rackspace.html +534 -0
  57. data/rdoc/site/0.5.0/CORL/Machine/Vagrant.html +1320 -0
  58. data/rdoc/site/0.5.0/CORL/Machine.html +363 -0
  59. data/rdoc/site/0.5.0/CORL/Mixin/Action/Keypair.html +592 -0
  60. data/rdoc/site/0.5.0/CORL/Mixin/Action.html +359 -0
  61. data/rdoc/site/0.5.0/CORL/Mixin/Builder/Global.html +604 -0
  62. data/rdoc/site/0.5.0/CORL/Mixin/Builder/Instance.html +696 -0
  63. data/rdoc/site/0.5.0/CORL/Mixin/Builder.html +359 -0
  64. data/rdoc/site/0.5.0/CORL/Mixin/Lookup.html +1139 -0
  65. data/rdoc/site/0.5.0/CORL/Mixin/Machine/SSH.html +675 -0
  66. data/rdoc/site/0.5.0/CORL/Mixin/Machine.html +359 -0
  67. data/rdoc/site/0.5.0/CORL/Mixin/Macro/NetworkSettings.html +484 -0
  68. data/rdoc/site/0.5.0/CORL/Mixin/Macro.html +359 -0
  69. data/rdoc/site/0.5.0/CORL/Mixin.html +363 -0
  70. data/rdoc/site/0.5.0/CORL/Network/CORL.html +411 -0
  71. data/rdoc/site/0.5.0/CORL/Network.html +359 -0
  72. data/rdoc/site/0.5.0/CORL/Node/AWS.html +736 -0
  73. data/rdoc/site/0.5.0/CORL/Node/Fog.html +1212 -0
  74. data/rdoc/site/0.5.0/CORL/Node/Local.html +444 -0
  75. data/rdoc/site/0.5.0/CORL/Node/Rackspace.html +729 -0
  76. data/rdoc/site/0.5.0/CORL/Node/Vagrant.html +1476 -0
  77. data/rdoc/site/0.5.0/CORL/Node.html +363 -0
  78. data/rdoc/site/0.5.0/CORL/Plugin/Builder.html +500 -0
  79. data/rdoc/site/0.5.0/CORL/Plugin/Configuration.html +1271 -0
  80. data/rdoc/site/0.5.0/CORL/Plugin/Machine.html +1299 -0
  81. data/rdoc/site/0.5.0/CORL/Plugin/Network.html +1580 -0
  82. data/rdoc/site/0.5.0/CORL/Plugin/Node.html +4041 -0
  83. data/rdoc/site/0.5.0/CORL/Plugin/Provisioner.html +1115 -0
  84. data/rdoc/site/0.5.0/CORL/Plugin.html +649 -0
  85. data/rdoc/site/0.5.0/CORL/Provisioner/Puppetnode.html +1177 -0
  86. data/rdoc/site/0.5.0/CORL/Provisioner.html +359 -0
  87. data/rdoc/site/0.5.0/CORL/Util/Puppet/Resource.html +1058 -0
  88. data/rdoc/site/0.5.0/CORL/Util/Puppet/ResourceGroup.html +940 -0
  89. data/rdoc/site/0.5.0/CORL/Util/Puppet.html +1107 -0
  90. data/rdoc/site/0.5.0/CORL/Util.html +361 -0
  91. data/rdoc/site/0.5.0/CORL/Vagrant/Config.html +943 -0
  92. data/rdoc/site/0.5.0/CORL/Vagrant.html +438 -0
  93. data/rdoc/site/0.5.0/CORL.html +471 -0
  94. data/rdoc/site/0.5.0/Fog/Compute/AWS/Server.html +443 -0
  95. data/rdoc/site/0.5.0/Fog/Compute/AWS.html +365 -0
  96. data/rdoc/site/0.5.0/Fog/Compute/RackspaceV2/Server.html +428 -0
  97. data/rdoc/site/0.5.0/Fog/Compute/RackspaceV2.html +365 -0
  98. data/rdoc/site/0.5.0/Fog/Compute.html +360 -0
  99. data/rdoc/site/0.5.0/Fog.html +360 -0
  100. data/rdoc/site/0.5.0/Hiera/Backend.html +442 -0
  101. data/rdoc/site/0.5.0/Hiera/Corl_logger.html +469 -0
  102. data/rdoc/site/0.5.0/Hiera.html +366 -0
  103. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Create.html +538 -0
  104. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Hiera.html +566 -0
  105. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Images.html +572 -0
  106. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Inspect.html +524 -0
  107. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Machines.html +567 -0
  108. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Regions.html +567 -0
  109. data/rdoc/site/0.5.0/Nucleon/Action/Cloud/Vagrantfile.html +515 -0
  110. data/rdoc/site/0.5.0/Nucleon/Action/Cloud.html +365 -0
  111. data/rdoc/site/0.5.0/Nucleon/Action/Node/Authorize.html +543 -0
  112. data/rdoc/site/0.5.0/Nucleon/Action/Node/Bootstrap.html +604 -0
  113. data/rdoc/site/0.5.0/Nucleon/Action/Node/Build.html +526 -0
  114. data/rdoc/site/0.5.0/Nucleon/Action/Node/Destroy.html +573 -0
  115. data/rdoc/site/0.5.0/Nucleon/Action/Node/Exec.html +530 -0
  116. data/rdoc/site/0.5.0/Nucleon/Action/Node/Facts.html +456 -0
  117. data/rdoc/site/0.5.0/Nucleon/Action/Node/IP.html +453 -0
  118. data/rdoc/site/0.5.0/Nucleon/Action/Node/Image.html +573 -0
  119. data/rdoc/site/0.5.0/Nucleon/Action/Node/Keypair.html +572 -0
  120. data/rdoc/site/0.5.0/Nucleon/Action/Node/Lookup.html +532 -0
  121. data/rdoc/site/0.5.0/Nucleon/Action/Node/Provision.html +553 -0
  122. data/rdoc/site/0.5.0/Nucleon/Action/Node/Reboot.html +573 -0
  123. data/rdoc/site/0.5.0/Nucleon/Action/Node/Revoke.html +541 -0
  124. data/rdoc/site/0.5.0/Nucleon/Action/Node/SSH.html +583 -0
  125. data/rdoc/site/0.5.0/Nucleon/Action/Node/Seed.html +602 -0
  126. data/rdoc/site/0.5.0/Nucleon/Action/Node/Spawn.html +675 -0
  127. data/rdoc/site/0.5.0/Nucleon/Action/Node/Start.html +573 -0
  128. data/rdoc/site/0.5.0/Nucleon/Action/Node/Stop.html +573 -0
  129. data/rdoc/site/0.5.0/Nucleon/Action/Node.html +376 -0
  130. data/rdoc/site/0.5.0/Nucleon/Action.html +383 -0
  131. data/rdoc/site/0.5.0/Nucleon/Config.html +377 -0
  132. data/rdoc/site/0.5.0/Nucleon/Event/Puppet.html +693 -0
  133. data/rdoc/site/0.5.0/Nucleon/Event.html +359 -0
  134. data/rdoc/site/0.5.0/Nucleon/Plugin/Base.html +365 -0
  135. data/rdoc/site/0.5.0/Nucleon/Plugin/CloudAction.html +838 -0
  136. data/rdoc/site/0.5.0/Nucleon/Plugin.html +360 -0
  137. data/rdoc/site/0.5.0/Nucleon/Template/Environment.html +548 -0
  138. data/rdoc/site/0.5.0/Nucleon/Template.html +359 -0
  139. data/rdoc/site/0.5.0/Nucleon.html +387 -0
  140. data/rdoc/site/0.5.0/Object.html +378 -0
  141. data/rdoc/site/0.5.0/Puppet/DataBinding/Corl.html +365 -0
  142. data/rdoc/site/0.5.0/Puppet/DataBinding.html +358 -0
  143. data/rdoc/site/0.5.0/Puppet/Indirector/Corl.html +477 -0
  144. data/rdoc/site/0.5.0/Puppet/Indirector.html +358 -0
  145. data/rdoc/site/0.5.0/Puppet/Parser/Functions.html +500 -0
  146. data/rdoc/site/0.5.0/Puppet/Parser.html +358 -0
  147. data/rdoc/site/0.5.0/Puppet.html +358 -0
  148. data/rdoc/site/0.5.0/README_rdoc.html +360 -0
  149. data/rdoc/site/0.5.0/Vagrant/Config/Loader.html +419 -0
  150. data/rdoc/site/0.5.0/Vagrant/Config.html +359 -0
  151. data/rdoc/site/0.5.0/Vagrant/Vagrantfile.html +412 -0
  152. data/rdoc/site/0.5.0/Vagrant.html +366 -0
  153. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Action/DeleteCache.html +422 -0
  154. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Action/InitKeys.html +428 -0
  155. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Action/LinkNetwork.html +426 -0
  156. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Action.html +361 -0
  157. data/rdoc/site/0.5.0/VagrantPlugins/CORL/BaseAction.html +511 -0
  158. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Command/Launcher.html +553 -0
  159. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Command.html +359 -0
  160. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Config/CORL.html +752 -0
  161. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Config.html +359 -0
  162. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Plugin.html +365 -0
  163. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Provisioner/CORL.html +556 -0
  164. data/rdoc/site/0.5.0/VagrantPlugins/CORL/Provisioner.html +359 -0
  165. data/rdoc/site/0.5.0/VagrantPlugins/CORL.html +366 -0
  166. data/rdoc/site/0.5.0/VagrantPlugins.html +366 -0
  167. data/rdoc/site/0.5.0/created.rid +103 -0
  168. data/rdoc/site/0.5.0/images/add.png +0 -0
  169. data/rdoc/site/0.5.0/images/brick.png +0 -0
  170. data/rdoc/site/0.5.0/images/brick_link.png +0 -0
  171. data/rdoc/site/0.5.0/images/bug.png +0 -0
  172. data/rdoc/site/0.5.0/images/bullet_black.png +0 -0
  173. data/rdoc/site/0.5.0/images/bullet_toggle_minus.png +0 -0
  174. data/rdoc/site/0.5.0/images/bullet_toggle_plus.png +0 -0
  175. data/rdoc/site/0.5.0/images/date.png +0 -0
  176. data/rdoc/site/0.5.0/images/delete.png +0 -0
  177. data/rdoc/site/0.5.0/images/find.png +0 -0
  178. data/rdoc/site/0.5.0/images/loadingAnimation.gif +0 -0
  179. data/rdoc/site/0.5.0/images/macFFBgHack.png +0 -0
  180. data/rdoc/site/0.5.0/images/package.png +0 -0
  181. data/rdoc/site/0.5.0/images/page_green.png +0 -0
  182. data/rdoc/site/0.5.0/images/page_white_text.png +0 -0
  183. data/rdoc/site/0.5.0/images/page_white_width.png +0 -0
  184. data/rdoc/site/0.5.0/images/plugin.png +0 -0
  185. data/rdoc/site/0.5.0/images/ruby.png +0 -0
  186. data/rdoc/site/0.5.0/images/tag_blue.png +0 -0
  187. data/rdoc/site/0.5.0/images/tag_green.png +0 -0
  188. data/rdoc/site/0.5.0/images/transparent.png +0 -0
  189. data/rdoc/site/0.5.0/images/wrench.png +0 -0
  190. data/rdoc/site/0.5.0/images/wrench_orange.png +0 -0
  191. data/rdoc/site/0.5.0/images/zoom.png +0 -0
  192. data/rdoc/site/0.5.0/index.html +359 -0
  193. data/rdoc/site/0.5.0/js/darkfish.js +155 -0
  194. data/rdoc/site/0.5.0/js/jquery.js +18 -0
  195. data/rdoc/site/0.5.0/js/navigation.js +142 -0
  196. data/rdoc/site/0.5.0/js/search.js +94 -0
  197. data/rdoc/site/0.5.0/js/search_index.js +1 -0
  198. data/rdoc/site/0.5.0/js/searcher.js +228 -0
  199. data/rdoc/site/0.5.0/rdoc.css +543 -0
  200. data/rdoc/site/0.5.0/table_of_contents.html +1797 -0
  201. metadata +171 -3
  202. data/lib/nucleon/action/cloud/hiera.rb +0 -61
@@ -0,0 +1,259 @@
1
+
2
+ module Nucleon
3
+ module Action
4
+ module Cloud
5
+ class Config < CORL.plugin_class(:nucleon, :cloud_action)
6
+
7
+ include Mixin::Action::Registration
8
+
9
+ #-----------------------------------------------------------------------------
10
+ # Info
11
+
12
+ def self.describe
13
+ super(:cloud, :config, 949)
14
+ end
15
+
16
+ #-----------------------------------------------------------------------------
17
+ # Settings
18
+
19
+ def configure
20
+ super do
21
+ codes :configuration_parse_failed,
22
+ :configuration_save_failed,
23
+ :configuration_delete_failed
24
+
25
+ register_str :name, nil
26
+ register_array :value
27
+
28
+ register_bool :delete
29
+ register_bool :append
30
+
31
+ register_translator :input_format
32
+ register_translator :load_format, :json
33
+ register_translator :format, :json
34
+ end
35
+ end
36
+
37
+ #---
38
+
39
+ def ignore
40
+ [ :nodes ]
41
+ end
42
+
43
+ def arguments
44
+ [ :name, :value ]
45
+ end
46
+
47
+ #-----------------------------------------------------------------------------
48
+ # Operations
49
+
50
+ def execute
51
+ super do |node, network|
52
+ ensure_network(network) do
53
+ config_info = parse_config_reference(network, settings[:name])
54
+
55
+ unless config_info
56
+ myself.status = code.configuration_parse_failed
57
+ end
58
+
59
+ if config_info[:property].nil?
60
+ render_config_properties(network, config_info)
61
+
62
+ elsif settings.delete(:delete, false)
63
+ delete_config_property(network, config_info, sanitize_remote(network, settings[:net_remote]))
64
+
65
+ elsif ! settings[:value].empty?
66
+ set_config_property(network, config_info, settings[:value], sanitize_remote(network, settings[:net_remote]))
67
+ else
68
+ render_config_property(network, config_info)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ #-----------------------------------------------------------------------------
75
+ # Sub operations
76
+
77
+ def render_config_properties(network, config_info)
78
+ if file_labels = config_info[:files]
79
+ info("Sub configurations available:", { :i18n => false })
80
+ file_labels.each do |label|
81
+ info("-> #{yellow(label)}", { :i18n => false })
82
+ end
83
+ else
84
+ format = settings[:format]
85
+ myself.result = config_info[:config].export
86
+ render result, :format => format
87
+ end
88
+ end
89
+
90
+ #---
91
+
92
+ def render_config_property(network, config_info)
93
+ format = settings[:format]
94
+ myself.result = config_info[:value]
95
+ render result, :format => format
96
+ end
97
+
98
+ #---
99
+
100
+ def delete_config_property(network, config_info, remote = nil)
101
+ name = parse_property_name(config_info[:property])
102
+ remote_text = remote_message(remote)
103
+ config_file = config_info[:file].sub(network.directory + File::SEPARATOR, '')
104
+
105
+ config_info[:config].delete(config_info[:property])
106
+
107
+ if File.exists?(config_info[:file])
108
+ if Util::Disk.write(config_info[:file], config_info[:translator].generate(config_info[:config].export))
109
+ if network.save({ :files => config_file, :remote => remote, :message => "Deleting configuration #{name} from #{config_file}", :allow_empty => true })
110
+ success("Configuration `#{blue(name)}` deleted (#{yellow(remote_text)})", { :i18n => false })
111
+ else
112
+ error("Configuration `#{blue(name)}` deletion could not be saved", { :i18n => false })
113
+ myself.status = code.configuration_save_failed
114
+ end
115
+ else
116
+ error("Configuration file `#{blue(config_file)}` could not be saved", { :i18n => false })
117
+ myself.status = code.configuration_save_failed
118
+ end
119
+ else
120
+ info("Configuration file `#{blue(config_file)} does not exist so configuration can not be deleted", { :i18n => false })
121
+ end
122
+ end
123
+
124
+ #---
125
+
126
+ def set_config_property(network, config_info, values, remote = nil)
127
+ name = parse_property_name(config_info[:property])
128
+ remote_text = remote_message(remote)
129
+
130
+ config_file = config_info[:file].sub(network.directory + File::SEPARATOR, '')
131
+ input_format = settings[:input_format]
132
+
133
+ values.each_with_index do |value, index|
134
+ values[index] = render(value, {
135
+ :format => input_format,
136
+ :silent => true
137
+ }) if input_format
138
+ values[index] = Util::Data.value(values[index])
139
+ end
140
+
141
+ if settings[:append]
142
+ if prev_value = config_info[:value]
143
+ prev_value = array(prev_value)
144
+
145
+ values.each do |value|
146
+ prev_value.push(value)
147
+ end
148
+ values = prev_value
149
+ end
150
+ else
151
+ if values.size == 1
152
+ values = values[0]
153
+ end
154
+ end
155
+
156
+ myself.result = values
157
+ config_info[:config].set(config_info[:property], result)
158
+
159
+ FileUtils.mkdir_p(File.dirname(config_info[:file]))
160
+
161
+ if Util::Disk.write(config_info[:file], config_info[:translator].generate(config_info[:config].export))
162
+ if network.save({ :files => config_file, :remote => remote, :message => "Updating configuration #{name} in #{config_file}", :allow_empty => true })
163
+ success("Configuration `#{blue(name)}` update (#{yellow(remote_text)})", { :i18n => false })
164
+ else
165
+ error("Configuration `#{blue(name)}` update could not be saved", { :i18n => false })
166
+ myself.status = code.configuration_save_failed
167
+ end
168
+ else
169
+ error("Configuration file `#{blue(config_file)}` could not be saved", { :i18n => false })
170
+ myself.status = code.configuration_save_failed
171
+ end
172
+ end
173
+
174
+ #-----------------------------------------------------------------------------
175
+ # Utilities
176
+
177
+ def parse_config_reference(network, name)
178
+ info = {}
179
+ data = {}
180
+
181
+ translators = CORL.loaded_plugins(:nucleon, :translator).keys
182
+
183
+ # common@php::apache::memory_limit
184
+ # identity/test@users::user[admin][shell]
185
+ # servers/development/dev.loc@facts[server_environment]
186
+
187
+ config_elements = name.split('@')
188
+
189
+ property = config_elements.size > 1 ? config_elements.pop : nil
190
+ config_elements = config_elements[0].split('/')
191
+ config_file_name = config_elements.pop
192
+ config_path = File.join(network.config_directory, *config_elements)
193
+
194
+ if config_file_name
195
+ config_dir = File.join(config_path, config_file_name)
196
+ config_file = File.join(config_path, "#{config_file_name}." + settings[:load_format].to_s)
197
+ config_files = nil
198
+ property = property.gsub(/\]$/, '').split(/\]?\[/) if property
199
+
200
+ unless translator = CORL.translator({}, settings[:load_format])
201
+ error("Translator for #{settings[:format]} could not be loaded", { :i18n => false })
202
+ return nil
203
+ end
204
+
205
+ if File.exists?(config_file)
206
+ unless data = Util::Disk.read(config_file)
207
+ error("Failed to read file: #{config_file}", { :i18n => false })
208
+ return nil
209
+ end
210
+ config = CORL::Config.new(translator.parse(data))
211
+ elsif File.directory?(config_dir)
212
+ config_files = Dir.glob("#{config_dir}/**/*").select do |file|
213
+ is_config = false
214
+
215
+ translators.each do |translator_name|
216
+ is_config = true if file.match(/\.#{translator_name}/)
217
+ end
218
+ is_config
219
+ end
220
+ config_files.each_with_index do |file, index|
221
+ config_files[index] = file.sub(/#{network.config_directory + File::SEPARATOR}/, '')
222
+ config_files[index] = config_files[index].sub(/\.([a-z0-9]+)$/, ' [ ' + blue('\1') + ' ]')
223
+ end
224
+ end
225
+
226
+ config = CORL::Config.new unless config
227
+ info = {
228
+ :translator => translator,
229
+ :file => config_file,
230
+ :files => config_files,
231
+ :property => property,
232
+ :config => config,
233
+ :value => property ? Util::Data.value(config.get(property)) : nil
234
+ }
235
+ end
236
+ info
237
+ end
238
+
239
+ #---
240
+
241
+ def parse_property_name(property)
242
+ property = property.clone
243
+
244
+ if property.size > 1
245
+ property.shift.to_s + '[' + property.join('][') + ']'
246
+ else
247
+ property.shift.to_s
248
+ end
249
+ end
250
+
251
+ #---
252
+
253
+ def remote_message(remote)
254
+ remote ? "#{remote}" : "LOCAL ONLY"
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
@@ -47,7 +47,7 @@ class Images < CORL.plugin_class(:nucleon, :cloud_action)
47
47
  if node = network.test_node(settings[:node_provider], { :region => settings[:region] })
48
48
  if images = node.images(settings[:search], settings)
49
49
  images.each do |image|
50
- render(node.render_image(image), { :prefix => false })
50
+ info(node.render_image(image), { :prefix => false, :i18n => false })
51
51
  end
52
52
 
53
53
  myself.result = images
@@ -4,6 +4,8 @@ module Action
4
4
  module Cloud
5
5
  class Inspect < CORL.plugin_class(:nucleon, :cloud_action)
6
6
 
7
+ include Mixin::Action::Registration
8
+
7
9
  #-----------------------------------------------------------------------------
8
10
  # Info
9
11
 
@@ -16,7 +18,10 @@ class Inspect < CORL.plugin_class(:nucleon, :cloud_action)
16
18
 
17
19
  def configure
18
20
  super do
19
- register :elements, :array, []
21
+ codes :configuration_parse_failed
22
+
23
+ register_array :elements
24
+ register_translator :format, :json
20
25
  end
21
26
  end
22
27
 
@@ -37,7 +42,11 @@ class Inspect < CORL.plugin_class(:nucleon, :cloud_action)
37
42
  else
38
43
  data = network.config.get(settings[:elements])
39
44
  end
40
- ui.info("\n\n" + CORL.render_object(data) + "\n\n")
45
+ if network.config.status == code.success
46
+ render data, :format => settings[:format]
47
+ else
48
+ myself.status = code.configuration_parse_failed
49
+ end
41
50
  end
42
51
  end
43
52
  end
@@ -42,7 +42,7 @@ class Machines < CORL.plugin_class(:nucleon, :cloud_action)
42
42
  if node = network.test_node(settings[:node_provider])
43
43
  if machine_types = node.machine_types
44
44
  machine_types.each do |machine_type|
45
- render(node.render_machine_type(machine_type), { :prefix => false })
45
+ info(node.render_machine_type(machine_type), { :prefix => false, :i18n => false })
46
46
  end
47
47
 
48
48
  myself.result = machine_types
@@ -42,7 +42,7 @@ class Regions < CORL.plugin_class(:nucleon, :cloud_action)
42
42
  if node = network.test_node(settings[:node_provider])
43
43
  if regions = node.regions
44
44
  regions.each do |region|
45
- render(sprintf("> %s", region), { :prefix => false })
45
+ info(sprintf("> %s", region), { :prefix => false, :i18n => false })
46
46
  end
47
47
 
48
48
  myself.result = regions
@@ -0,0 +1,185 @@
1
+
2
+ module Nucleon
3
+ module Action
4
+ module Cloud
5
+ class Settings < CORL.plugin_class(:nucleon, :cloud_action)
6
+
7
+ include Mixin::Action::Registration
8
+
9
+ #-----------------------------------------------------------------------------
10
+ # Info
11
+
12
+ def self.describe
13
+ super(:cloud, :settings, 951)
14
+ end
15
+
16
+ #-----------------------------------------------------------------------------
17
+ # Settings
18
+
19
+ def configure
20
+ super do
21
+ codes :settings_save_failed,
22
+ :settings_delete_failed
23
+
24
+ register_str :group
25
+ register_str :name
26
+ register_array :value
27
+
28
+ register_bool :delete
29
+ register_bool :append
30
+ register_bool :groups
31
+
32
+ register_translator :input_format
33
+ register_translator :format, :json
34
+ end
35
+ end
36
+
37
+ #---
38
+
39
+ def ignore
40
+ [ :nodes ]
41
+ end
42
+
43
+ def arguments
44
+ [ :group, :name, :value ]
45
+ end
46
+
47
+ #-----------------------------------------------------------------------------
48
+ # Operations
49
+
50
+ def execute
51
+ super do |node, network|
52
+ ensure_network(network) do
53
+ if settings[:groups]
54
+ render_groups(network)
55
+
56
+ elsif settings[:group].empty?
57
+ render_settings(network)
58
+
59
+ elsif settings[:name].empty?
60
+ render_settings(network, settings[:group])
61
+
62
+ else
63
+ name = settings[:name].gsub(/\]$/, '').split(/\]?\[/)
64
+
65
+ if settings.get(:delete, false)
66
+ delete_settings(network, name, sanitize_remote(network, settings[:net_remote]))
67
+
68
+ elsif ! settings[:value].empty?
69
+ set_settings(network, name, settings[:value], sanitize_remote(network, settings[:net_remote]))
70
+
71
+ else
72
+ render_settings(network, [ settings[:group], name ])
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ #-----------------------------------------------------------------------------
80
+ # Sub operations
81
+
82
+ def render_groups(network)
83
+ groups = network.config.get(:settings).keys
84
+
85
+ info("Currently defined groups:", { :i18n => false })
86
+ groups.each do |group|
87
+ info("-> #{green(group)}", { :i18n => false })
88
+ end
89
+ end
90
+
91
+ #---
92
+
93
+ def render_settings(network, elements = [])
94
+ format = settings[:format]
95
+
96
+ if elements.size > 0
97
+ myself.result = network.config.get([ :settings, elements ])
98
+ else
99
+ myself.result = network.config.get(:settings)
100
+ end
101
+ render result, :format => format
102
+ end
103
+
104
+ #---
105
+
106
+ def delete_settings(network, property, remote = nil)
107
+ group = settings[:group]
108
+ name = parse_property_name(property)
109
+ remote_text = remote_message(remote)
110
+
111
+ network.config.delete([ :settings, group, property ])
112
+
113
+ if network.save({ :remote => remote, :message => "Deleting #{group} setting #{name}", :allow_empty => true })
114
+ success("Group #{blue(group)} setting `#{blue(name)}` deleted (#{yellow(remote_text)})", { :i18n => false })
115
+ else
116
+ error("Group #{blue(group)} setting `#{blue(name)}` deletion could not be saved", { :i18n => false })
117
+ myself.status = code.settings_delete_failed
118
+ end
119
+ end
120
+
121
+ #---
122
+
123
+ def set_settings(network, property, values, remote = nil)
124
+ group = settings[:group]
125
+ name = parse_property_name(property)
126
+ remote_text = remote_message(remote)
127
+
128
+ input_format = settings[:input_format]
129
+
130
+ values.each_with_index do |value, index|
131
+ values[index] = render(value, {
132
+ :format => input_format,
133
+ :silent => true
134
+ }) if input_format
135
+ values[index] = Util::Data.value(values[index])
136
+ end
137
+
138
+ if settings[:append]
139
+ if prev_value = network.config.get([ :settings, group, property ])
140
+ prev_value = array(prev_value)
141
+
142
+ values.each do |value|
143
+ prev_value.push(value)
144
+ end
145
+ values = prev_value
146
+ end
147
+ else
148
+ if values.size == 1
149
+ values = values[0]
150
+ end
151
+ end
152
+
153
+ myself.result = values
154
+ network.config.set([ :settings, group, property ], result)
155
+
156
+ if network.save({ :remote => remote, :message => "Updating #{group} setting #{name}", :allow_empty => true })
157
+ success("Group #{blue(group)} setting `#{blue(name)}` updated (#{yellow(remote_text)})", { :i18n => false })
158
+ else
159
+ error("Group #{blue(group)} setting `#{blue(name)}` update could not be saved", { :i18n => false })
160
+ myself.status = code.settings_save_failed
161
+ end
162
+ end
163
+
164
+ #-----------------------------------------------------------------------------
165
+ # Utilities
166
+
167
+ def parse_property_name(property)
168
+ property = property.clone
169
+
170
+ if property.size > 1
171
+ property.shift.to_s + '[' + property.join('][') + ']'
172
+ else
173
+ property.shift.to_s
174
+ end
175
+ end
176
+
177
+ #---
178
+
179
+ def remote_message(remote)
180
+ remote ? "#{remote}" : "LOCAL ONLY"
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -20,7 +20,7 @@ class IP < CORL.plugin_class(:nucleon, :cloud_action)
20
20
  def execute
21
21
  super do |node, network|
22
22
  ensure_node(node) do
23
- ui.info(CORL.public_ip)
23
+ render(CORL.public_ip)
24
24
  end
25
25
  end
26
26
  end
@@ -80,7 +80,7 @@ class Bootstrap < CORL.plugin_class(:nucleon, :cloud_action)
80
80
  render_options = { :id => node.id, :hostname => node.hostname }
81
81
 
82
82
  info('corl.actions.bootstrap.start', render_options)
83
- success = node.bootstrap(network.home, extended_config(:bootstrap, settings))
83
+ success = node.bootstrap(network.home, extended_config(:bootstrap, settings.clone))
84
84
  if success
85
85
  info('corl.actions.bootstrap.success', render_options)
86
86
  else
@@ -0,0 +1,133 @@
1
+
2
+ module Nucleon
3
+ module Action
4
+ module Node
5
+ class Cache < CORL.plugin_class(:nucleon, :cloud_action)
6
+
7
+ include Mixin::Action::Registration
8
+
9
+ #-----------------------------------------------------------------------------
10
+ # Info
11
+
12
+ def self.describe
13
+ super(:node, :cache, 600)
14
+ end
15
+
16
+ #-----------------------------------------------------------------------------
17
+ # Settings
18
+
19
+ def configure
20
+ super do
21
+ codes :cache_save_failed
22
+
23
+ register_str :name
24
+ register_str :value
25
+
26
+ register_bool :delete
27
+ register_bool :clear
28
+
29
+ register_translator :input_format
30
+ register_translator :format, :json
31
+ end
32
+ end
33
+
34
+ #---
35
+
36
+ def arguments
37
+ [ :name, :value ]
38
+ end
39
+
40
+ #-----------------------------------------------------------------------------
41
+ # Operations
42
+
43
+ def execute
44
+ super do |node, network|
45
+ ensure_node(node) do
46
+ if settings.delete(:clear, false)
47
+ clear_node_cache(node)
48
+ elsif ! settings[:name] || settings[:name].empty?
49
+ render_node_cache(node)
50
+ else
51
+ settings[:name] = settings[:name].split('.')
52
+ settings[:value] = nil if settings[:value].is_a?(String) && settings[:value].empty?
53
+
54
+ if settings.delete(:delete, false)
55
+ delete_node_cache(node, settings[:name])
56
+ elsif ! settings[:value].nil?
57
+ set_node_cache(node, settings[:name], settings[:value])
58
+ else
59
+ render_node_cache_property(node, settings[:name])
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ #-----------------------------------------------------------------------------
67
+ # Sub operations
68
+
69
+ def render_node_cache(node)
70
+ format = settings[:format]
71
+ myself.result = node.cache_setting([], {}, :hash)
72
+ render result, :format => format
73
+ end
74
+
75
+ #---
76
+
77
+ def render_node_cache_property(node, name)
78
+ format = settings[:format]
79
+ myself.result = node.cache_setting(name)
80
+ render result, :format => format
81
+ end
82
+
83
+ #---
84
+
85
+ def delete_node_cache(node, name)
86
+ node.delete_cache_setting(name)
87
+
88
+ if node.cache.status == code.success
89
+ success("Cached property #{name.join('.')} deleted", { :i18n => false })
90
+ else
91
+ error("Cached property #{name.join('.')} deletion could not be saved", { :i18n => false })
92
+ myself.status = code.cache_save_failed
93
+ end
94
+ end
95
+
96
+ #---
97
+
98
+ def set_node_cache(node, name, value)
99
+ input_format = settings[:input_format]
100
+
101
+ value = Util::Data.value(render(value, {
102
+ :format => input_format,
103
+ :silent => true
104
+ })) if input_format
105
+
106
+ myself.result = value
107
+
108
+ node.set_cache_setting(name, value)
109
+
110
+ if node.cache.status == code.success
111
+ success("Cached property #{name.join('.')} saved", { :i18n => false })
112
+ else
113
+ error("Cached property #{name.join('.')} could not be saved", { :i18n => false })
114
+ myself.status = code.cache_save_failed
115
+ end
116
+ end
117
+
118
+ #---
119
+
120
+ def clear_node_cache(node)
121
+ node.clear_cache
122
+
123
+ if node.cache.status == code.success
124
+ success("Cached properties cleared", { :i18n => false })
125
+ else
126
+ error("Cached properties could not be cleared", { :i18n => false })
127
+ myself.status = code.cache_save_failed
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end