corl 0.4.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 (132) hide show
  1. data/.document +5 -0
  2. data/.gitmodules +4 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +123 -0
  5. data/LICENSE.txt +674 -0
  6. data/README.rdoc +27 -0
  7. data/Rakefile +78 -0
  8. data/VERSION +1 -0
  9. data/bin/corl +55 -0
  10. data/corl.gemspec +228 -0
  11. data/lib/corl/action/add.rb +69 -0
  12. data/lib/corl/action/bootstrap.rb +83 -0
  13. data/lib/corl/action/clone.rb +40 -0
  14. data/lib/corl/action/create.rb +55 -0
  15. data/lib/corl/action/exec.rb +41 -0
  16. data/lib/corl/action/extract.rb +49 -0
  17. data/lib/corl/action/image.rb +30 -0
  18. data/lib/corl/action/images.rb +55 -0
  19. data/lib/corl/action/lookup.rb +35 -0
  20. data/lib/corl/action/machines.rb +51 -0
  21. data/lib/corl/action/provision.rb +37 -0
  22. data/lib/corl/action/remove.rb +51 -0
  23. data/lib/corl/action/save.rb +53 -0
  24. data/lib/corl/action/seed.rb +115 -0
  25. data/lib/corl/action/spawn.rb +75 -0
  26. data/lib/corl/action/start.rb +37 -0
  27. data/lib/corl/action/stop.rb +30 -0
  28. data/lib/corl/action/update.rb +37 -0
  29. data/lib/corl/command/shell.rb +164 -0
  30. data/lib/corl/configuration/file.rb +386 -0
  31. data/lib/corl/event/puppet.rb +90 -0
  32. data/lib/corl/event/regex.rb +52 -0
  33. data/lib/corl/extension/puppetloader.rb +24 -0
  34. data/lib/corl/machine/fog.rb +310 -0
  35. data/lib/corl/machine/physical.rb +161 -0
  36. data/lib/corl/network/default.rb +26 -0
  37. data/lib/corl/node/aws.rb +90 -0
  38. data/lib/corl/node/fog.rb +198 -0
  39. data/lib/corl/node/google.rb +115 -0
  40. data/lib/corl/node/local.rb +26 -0
  41. data/lib/corl/node/rackspace.rb +89 -0
  42. data/lib/corl/project/git.rb +465 -0
  43. data/lib/corl/project/github.rb +108 -0
  44. data/lib/corl/provisioner/puppetnode/resource.rb +245 -0
  45. data/lib/corl/provisioner/puppetnode/resource_group.rb +205 -0
  46. data/lib/corl/provisioner/puppetnode.rb +407 -0
  47. data/lib/corl/template/environment.rb +73 -0
  48. data/lib/corl/template/json.rb +16 -0
  49. data/lib/corl/template/wrapper.rb +16 -0
  50. data/lib/corl/template/yaml.rb +16 -0
  51. data/lib/corl/translator/json.rb +27 -0
  52. data/lib/corl/translator/yaml.rb +27 -0
  53. data/lib/corl.rb +173 -0
  54. data/lib/corl_core/codes.rb +107 -0
  55. data/lib/corl_core/config/collection.rb +57 -0
  56. data/lib/corl_core/config/options.rb +70 -0
  57. data/lib/corl_core/config.rb +337 -0
  58. data/lib/corl_core/core.rb +59 -0
  59. data/lib/corl_core/corl.rb +254 -0
  60. data/lib/corl_core/errors.rb +84 -0
  61. data/lib/corl_core/facade.rb +126 -0
  62. data/lib/corl_core/gems.rb +72 -0
  63. data/lib/corl_core/manager.rb +425 -0
  64. data/lib/corl_core/mixin/action/commit.rb +58 -0
  65. data/lib/corl_core/mixin/action/keypair.rb +105 -0
  66. data/lib/corl_core/mixin/action/node.rb +129 -0
  67. data/lib/corl_core/mixin/action/project.rb +53 -0
  68. data/lib/corl_core/mixin/action/push.rb +52 -0
  69. data/lib/corl_core/mixin/config/collection.rb +53 -0
  70. data/lib/corl_core/mixin/config/ops.rb +53 -0
  71. data/lib/corl_core/mixin/config/options.rb +39 -0
  72. data/lib/corl_core/mixin/lookup.rb +196 -0
  73. data/lib/corl_core/mixin/macro/object_interface.rb +361 -0
  74. data/lib/corl_core/mixin/macro/plugin_interface.rb +380 -0
  75. data/lib/corl_core/mixin/settings.rb +46 -0
  76. data/lib/corl_core/mixin/sub_config.rb +148 -0
  77. data/lib/corl_core/mod/hash.rb +29 -0
  78. data/lib/corl_core/mod/hiera_backend.rb +63 -0
  79. data/lib/corl_core/plugin/action.rb +381 -0
  80. data/lib/corl_core/plugin/base.rb +374 -0
  81. data/lib/corl_core/plugin/command.rb +98 -0
  82. data/lib/corl_core/plugin/configuration.rb +177 -0
  83. data/lib/corl_core/plugin/event.rb +53 -0
  84. data/lib/corl_core/plugin/extension.rb +12 -0
  85. data/lib/corl_core/plugin/machine.rb +266 -0
  86. data/lib/corl_core/plugin/network.rb +359 -0
  87. data/lib/corl_core/plugin/node.rb +904 -0
  88. data/lib/corl_core/plugin/project.rb +927 -0
  89. data/lib/corl_core/plugin/provisioner.rb +51 -0
  90. data/lib/corl_core/plugin/template.rb +80 -0
  91. data/lib/corl_core/plugin/translator.rb +38 -0
  92. data/lib/corl_core/util/cli.rb +352 -0
  93. data/lib/corl_core/util/data.rb +404 -0
  94. data/lib/corl_core/util/disk.rb +114 -0
  95. data/lib/corl_core/util/git.rb +47 -0
  96. data/lib/corl_core/util/interface.rb +319 -0
  97. data/lib/corl_core/util/liquid.rb +17 -0
  98. data/lib/corl_core/util/package.rb +93 -0
  99. data/lib/corl_core/util/shell.rb +239 -0
  100. data/lib/corl_core/util/ssh.rb +286 -0
  101. data/lib/facter/corl_config_ready.rb +13 -0
  102. data/lib/facter/corl_exists.rb +15 -0
  103. data/lib/facter/corl_network.rb +17 -0
  104. data/lib/hiera/corl_logger.rb +18 -0
  105. data/lib/puppet/indirector/corl.rb +27 -0
  106. data/lib/puppet/indirector/data_binding/corl.rb +6 -0
  107. data/lib/puppet/parser/functions/config_initialized.rb +26 -0
  108. data/lib/puppet/parser/functions/corl_include.rb +44 -0
  109. data/lib/puppet/parser/functions/corl_resources.rb +58 -0
  110. data/lib/puppet/parser/functions/deep_merge.rb +21 -0
  111. data/lib/puppet/parser/functions/ensure.rb +29 -0
  112. data/lib/puppet/parser/functions/file_exists.rb +19 -0
  113. data/lib/puppet/parser/functions/global_array.rb +35 -0
  114. data/lib/puppet/parser/functions/global_hash.rb +35 -0
  115. data/lib/puppet/parser/functions/global_options.rb +23 -0
  116. data/lib/puppet/parser/functions/global_param.rb +43 -0
  117. data/lib/puppet/parser/functions/interpolate.rb +26 -0
  118. data/lib/puppet/parser/functions/is_false.rb +21 -0
  119. data/lib/puppet/parser/functions/is_true.rb +21 -0
  120. data/lib/puppet/parser/functions/module_array.rb +38 -0
  121. data/lib/puppet/parser/functions/module_hash.rb +38 -0
  122. data/lib/puppet/parser/functions/module_options.rb +23 -0
  123. data/lib/puppet/parser/functions/module_param.rb +48 -0
  124. data/lib/puppet/parser/functions/name.rb +21 -0
  125. data/lib/puppet/parser/functions/render.rb +33 -0
  126. data/lib/puppet/parser/functions/value.rb +21 -0
  127. data/locales/en.yml +232 -0
  128. data/spec/corl_core/interface_spec.rb +489 -0
  129. data/spec/corl_mock_input.rb +29 -0
  130. data/spec/corl_test_kernel.rb +22 -0
  131. data/spec/spec_helper.rb +15 -0
  132. metadata +406 -0
@@ -0,0 +1,198 @@
1
+
2
+ module CORL
3
+ module Node
4
+ class Fog < Plugin::Node
5
+
6
+ #-----------------------------------------------------------------------------
7
+ # Node plugin interface
8
+
9
+ def normalize
10
+ super
11
+ myself.region = region
12
+
13
+ yield if block_given?
14
+ myself.machine = create_machine(:machine, :fog, machine_config)
15
+ end
16
+
17
+ #-----------------------------------------------------------------------------
18
+ # Checks
19
+
20
+ #-----------------------------------------------------------------------------
21
+ # Property accessors / modifiers
22
+
23
+ def api_user=api_user
24
+ myself[:api_user] = api_user
25
+ end
26
+
27
+ def api_user
28
+ myself[:api_user]
29
+ end
30
+
31
+ #---
32
+
33
+ def api_key=api_key
34
+ myself[:api_key] = api_key
35
+ end
36
+
37
+ def api_key
38
+ myself[:api_key]
39
+ end
40
+
41
+ #---
42
+
43
+ def auth_url=auth_url
44
+ myself[:auth_url] = auth_url
45
+ end
46
+
47
+ def auth_url
48
+ myself[:auth_url]
49
+ end
50
+
51
+ #---
52
+
53
+ def connection_options=options
54
+ myself[:connection_options] = options
55
+ end
56
+
57
+ def connection_options
58
+ myself[:connection_options]
59
+ end
60
+
61
+ #---
62
+
63
+ def regions
64
+ []
65
+ end
66
+
67
+ def region=region
68
+ myself[:region] = region
69
+ end
70
+
71
+ def region
72
+ if region = myself[:region]
73
+ region
74
+ else
75
+ first_region = regions.first
76
+ myself.region = first_region
77
+ first_region
78
+ end
79
+ end
80
+
81
+ #-----------------------------------------------------------------------------
82
+ # Settings groups
83
+
84
+ def machine_config
85
+ super do |config|
86
+ config[:connection_options] = connection_options if connection_options
87
+ yield(config) if block_given?
88
+ end
89
+ end
90
+
91
+ #---
92
+
93
+ def exec_options(name, options = {})
94
+ extended_config(name, options).export
95
+ end
96
+
97
+ #-----------------------------------------------------------------------------
98
+ # Node operations
99
+
100
+ def create(options = {})
101
+ super do |op, config|
102
+ if op == :config
103
+ config.import(exec_options(:create))
104
+ end
105
+ yield(op, config) if block_given?
106
+ end
107
+ end
108
+
109
+ #---
110
+
111
+ def download(remote_path, local_path, options = {})
112
+ super do |op, config|
113
+ if op == :config
114
+ config.import(exec_options(:download))
115
+ end
116
+ yield(op, config) if block_given?
117
+ end
118
+ end
119
+
120
+ #---
121
+
122
+ def upload(local_path, remote_path, options = {})
123
+ super do |op, config|
124
+ if op == :config
125
+ config.import(exec_options(:upload))
126
+ end
127
+ yield(op, config) if block_given?
128
+ end
129
+ end
130
+
131
+ #---
132
+
133
+ def exec(options = {})
134
+ super do |op, config|
135
+ if op == :config
136
+ config.import(exec_options(:exec))
137
+ end
138
+ yield(op, config) if block_given?
139
+ end
140
+ end
141
+
142
+ #---
143
+
144
+ def start(options = {})
145
+ super do |op, config|
146
+ if op == :config
147
+ config.import(exec_options(:start))
148
+ end
149
+ yield(op, config) if block_given?
150
+ end
151
+ end
152
+
153
+ #---
154
+
155
+ def reload(options = {})
156
+ super do |op, config|
157
+ if op == :config
158
+ config.import(exec_options(:reload))
159
+ end
160
+ yield(op, config) if block_given?
161
+ end
162
+ end
163
+
164
+ #---
165
+
166
+ def create_image(options = {})
167
+ super do |op, config|
168
+ if op == :config
169
+ config.import(exec_options(:image))
170
+ end
171
+ yield(op, config) if block_given?
172
+ end
173
+ end
174
+
175
+ #---
176
+
177
+ def stop(options = {})
178
+ super do |op, config|
179
+ if op == :config
180
+ config.import(exec_options(:stop))
181
+ end
182
+ yield(op, config) if block_given?
183
+ end
184
+ end
185
+
186
+ #---
187
+
188
+ def destroy(options = {})
189
+ super do |op, config|
190
+ if op == :config
191
+ config.import(exec_options(:destroy))
192
+ end
193
+ yield(op, config) if block_given?
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,115 @@
1
+
2
+ corl_require(File.dirname(__FILE__), :fog)
3
+
4
+ #---
5
+
6
+ module CORL
7
+ module Node
8
+ class Google < Node::Fog
9
+
10
+ #-----------------------------------------------------------------------------
11
+ # Node plugin interface
12
+
13
+ #-----------------------------------------------------------------------------
14
+ # Checks
15
+
16
+ def usable_image?(image)
17
+ image.status == 'READY' && ! image.description.match(/DEPRECATED/i)
18
+ end
19
+
20
+ #-----------------------------------------------------------------------------
21
+ # Property accessors / modifiers
22
+
23
+ def project_name=project_name
24
+ myself[:project_name] = project_name
25
+ end
26
+
27
+ def project_name
28
+ myself[:project_name]
29
+ end
30
+
31
+ #---
32
+
33
+ def regions
34
+ [
35
+ 'us-central1-a',
36
+ 'us-central1-b',
37
+ 'europe-west1-a',
38
+ 'europe-west1-b'
39
+ ]
40
+ end
41
+
42
+ #-----------------------------------------------------------------------------
43
+ # Settings groups
44
+
45
+ def machine_config
46
+ super do |config|
47
+ config.import({
48
+ :provider => 'google'
49
+ })
50
+
51
+ config[:google_project] = project_name if project_name
52
+ config[:google_client_email] = api_user if api_user
53
+ config[:google_key_location] = api_key if api_key
54
+ end
55
+ end
56
+
57
+ #-----------------------------------------------------------------------------
58
+ # Node operations
59
+
60
+ def create(options = {})
61
+ super do |op, config|
62
+ if op == :config
63
+ config[:private_key_path] = private_key if private_key
64
+ config[:public_key_path] = public_key if public_key
65
+
66
+ config.defaults({
67
+ :name => hostname,
68
+ :machine_type => machine_type,
69
+ :image_name => image
70
+ })
71
+ end
72
+ end
73
+ end
74
+
75
+ #-----------------------------------------------------------------------------
76
+ # Utilities
77
+
78
+ def machine_type_id(machine_type)
79
+ machine_type.name
80
+ end
81
+
82
+ #---
83
+
84
+ def render_machine_type(machine_type)
85
+ sprintf("[ %20s ][ VCPUS: %2i ] %-55s ( RAM: %6iMB | DISK: %3iGB ) ( MAX DISKS: %2i | MAX STORAGE: %6iGB )",
86
+ machine_type_id(machine_type),
87
+ machine_type.guest_cpus,
88
+ machine_type.description,
89
+ machine_type.memory_mb,
90
+ machine_type.image_space_gb,
91
+ machine_type.maximum_persistent_disks,
92
+ machine_type.maximum_persistent_disks_size
93
+ )
94
+ end
95
+
96
+ #---
97
+
98
+ def image_id(image)
99
+ image.name
100
+ end
101
+
102
+ #---
103
+
104
+ def render_image(image)
105
+ sprintf("[ %40s ][ %10s ] %s - %s", image_id(image), image.status, image.description, image.project)
106
+ end
107
+
108
+ #---
109
+
110
+ def image_search_text(image)
111
+ sprintf("%s %s %s %s", image.name, image.description, image.status, image.project)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module CORL
3
+ module Node
4
+ class Local < Plugin::Node
5
+
6
+ #-----------------------------------------------------------------------------
7
+ # Node plugin interface
8
+
9
+ def normalize
10
+ super
11
+ myself.machine = create_machine(:machine, :physical, machine_config)
12
+ end
13
+
14
+ #-----------------------------------------------------------------------------
15
+ # Checks
16
+
17
+ def local?
18
+ true
19
+ end
20
+
21
+ #-----------------------------------------------------------------------------
22
+ # Property accessors / modifiers
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,89 @@
1
+
2
+ corl_require(File.dirname(__FILE__), :fog)
3
+
4
+ #---
5
+
6
+ module CORL
7
+ module Node
8
+ class Rackspace < Node::Fog
9
+
10
+ #-----------------------------------------------------------------------------
11
+ # Node plugin interface
12
+
13
+ #-----------------------------------------------------------------------------
14
+ # Checks
15
+
16
+ def usable_image?(image)
17
+ image.state != 'DELETED'
18
+ end
19
+
20
+ #-----------------------------------------------------------------------------
21
+ # Property accessors / modifiers
22
+
23
+ def regions
24
+ [
25
+ :dfw, # Dallas
26
+ :ord, # Chicago
27
+ :lon # London (for UK accounts)
28
+ ]
29
+ end
30
+
31
+ #-----------------------------------------------------------------------------
32
+ # Settings groups
33
+
34
+ def machine_config
35
+ super do |config|
36
+ config.import({
37
+ :provider => 'rackspace',
38
+ :version => :v2,
39
+ :rackspace_region => region
40
+ })
41
+
42
+ config[:rackspace_username] = api_user if api_user
43
+ config[:rackspace_api_key] = api_key if api_key
44
+ config[:rackspace_auth_url] = auth_url if auth_url
45
+ end
46
+ end
47
+
48
+ #-----------------------------------------------------------------------------
49
+ # Node operations
50
+
51
+ def create(options = {})
52
+ super do |op, config|
53
+ if op == :config
54
+ config.defaults({
55
+ :name => hostname,
56
+ :flavor_id => machine_type,
57
+ :image_id => image
58
+ })
59
+ end
60
+ end
61
+ end
62
+
63
+ #-----------------------------------------------------------------------------
64
+ # Utilities
65
+
66
+ def render_machine_type(machine_type)
67
+ sprintf("[ %20s ][ VCPUS: %2i ] %-30s ( RAM: %6iMB | DISK: %4iGB )",
68
+ machine_type_id(machine_type),
69
+ machine_type.vcpus,
70
+ machine_type.name,
71
+ machine_type.ram,
72
+ machine_type.disk
73
+ )
74
+ end
75
+
76
+ #---
77
+
78
+ def render_image(image)
79
+ sprintf("[ %40s ][ %10s ] %s", image_id(image), image.state, image.name)
80
+ end
81
+
82
+ #---
83
+
84
+ def image_search_text(image)
85
+ sprintf("%s %s %s", image_id(image), image.name, image.state)
86
+ end
87
+ end
88
+ end
89
+ end