logical-construct 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/bin/flight-deck +3 -0
  2. data/doc/DESIGN +48 -0
  3. data/doc/EC2-baking-notes +70 -0
  4. data/doc/ExampleStartupRakefile +152 -0
  5. data/doc/ExampleTargetRakefile +4 -0
  6. data/doc/TODO +148 -0
  7. data/doc/Vb-EC2-translation-notes +96 -0
  8. data/doc/hating-chef +32 -0
  9. data/lib/logical-construct/archive-tasks.rb +307 -0
  10. data/lib/logical-construct/ground-control.rb +4 -1
  11. data/lib/logical-construct/ground-control/build-plan.rb +95 -0
  12. data/lib/logical-construct/ground-control/core.rb +1 -1
  13. data/lib/logical-construct/ground-control/generate-manifest.rb +67 -0
  14. data/lib/logical-construct/ground-control/provision.rb +73 -168
  15. data/lib/logical-construct/ground-control/run-on-target.rb +1 -1
  16. data/lib/logical-construct/ground-control/setup.rb +1 -4
  17. data/lib/logical-construct/ground-control/setup/copy-files.rb +2 -2
  18. data/lib/logical-construct/ground-control/tools.rb +66 -0
  19. data/lib/logical-construct/node-client.rb +112 -0
  20. data/lib/logical-construct/plan.rb +2 -0
  21. data/lib/logical-construct/plan/core.rb +45 -0
  22. data/lib/logical-construct/plan/standalone-bundle.rb +80 -0
  23. data/lib/logical-construct/port-open-check.rb +41 -0
  24. data/lib/logical-construct/protocol.rb +2 -0
  25. data/lib/logical-construct/protocol/plan-validation.rb +46 -0
  26. data/lib/logical-construct/protocol/ssh-tunnel.rb +127 -0
  27. data/lib/logical-construct/protocol/vocabulary.rb +8 -0
  28. data/lib/logical-construct/target/Implement.rake +8 -0
  29. data/lib/logical-construct/target/command-line.rb +90 -0
  30. data/lib/logical-construct/target/flight-deck.rb +341 -0
  31. data/lib/logical-construct/target/implementation.rb +33 -0
  32. data/lib/logical-construct/target/plan-records.rb +317 -0
  33. data/lib/logical-construct/target/resolution-server.rb +153 -0
  34. data/lib/logical-construct/target/{unpack-cookbook.rb → unpack-plan.rb} +8 -4
  35. data/lib/logical-construct/template-file.rb +41 -0
  36. data/lib/templates/Rakefile.erb +8 -0
  37. data/spec/ground-control/smoke-test.rb +8 -7
  38. data/spec/node_resolution.rb +62 -0
  39. data/spec/target/plan-records.rb +142 -0
  40. data/spec/target/provisioning.rb +21 -0
  41. data/spec_help/file-sandbox.rb +12 -6
  42. data/spec_help/fixtures/Manifest +1 -0
  43. data/spec_help/fixtures/source/one.tbz +1 -0
  44. data/spec_help/fixtures/source/three.tbz +1 -0
  45. data/spec_help/fixtures/source/two.tbz +1 -0
  46. data/spec_help/spec_helper.rb +5 -7
  47. metadata +165 -72
  48. data/lib/logical-construct/ground-control/setup/build-files.rb +0 -93
  49. data/lib/logical-construct/ground-control/setup/create-construct-directory.rb +0 -22
  50. data/lib/logical-construct/ground-control/setup/install-init.rb +0 -32
  51. data/lib/logical-construct/resolving-task.rb +0 -141
  52. data/lib/logical-construct/satisfiable-task.rb +0 -87
  53. data/lib/logical-construct/target.rb +0 -4
  54. data/lib/logical-construct/target/chef-solo.rb +0 -37
  55. data/lib/logical-construct/target/platforms.rb +0 -51
  56. data/lib/logical-construct/target/platforms/aws.rb +0 -8
  57. data/lib/logical-construct/target/platforms/default/chef-config.rb +0 -134
  58. data/lib/logical-construct/target/platforms/default/resolve-configuration.rb +0 -44
  59. data/lib/logical-construct/target/platforms/default/volume.rb +0 -11
  60. data/lib/logical-construct/target/platforms/virtualbox.rb +0 -8
  61. data/lib/logical-construct/target/platforms/virtualbox/volume.rb +0 -15
  62. data/lib/logical-construct/target/provision.rb +0 -36
  63. data/lib/logical-construct/target/sinatra-resolver.rb +0 -99
  64. data/lib/logical-construct/testing/resolve-configuration.rb +0 -32
  65. data/lib/logical-construct/testing/resolving-task.rb +0 -15
  66. data/lib/templates/chef.rb.erb +0 -9
  67. data/lib/templates/construct.init.d.erb +0 -18
  68. data/lib/templates/resolver/finished.html.erb +0 -1
  69. data/lib/templates/resolver/index.html.erb +0 -17
  70. data/lib/templates/resolver/task-file-form.html.erb +0 -6
  71. data/lib/templates/resolver/task-form.html.erb +0 -6
  72. data/spec/resolution.rb +0 -147
  73. data/spec/target/chef-config.rb +0 -67
  74. data/spec/target/chef-solo.rb +0 -55
  75. data/spec/target/platforms.rb +0 -36
  76. data/spec/target/smoke-test.rb +0 -45
  77. data/spec_help/ungemmer.rb +0 -36
@@ -1,17 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head profile="http://lrdesign/document-profiles/logical-construct/resolution">
4
- <meta charset="UTF-8" />
5
- <title>Logical Construct Provisioning Data Resolution</title>
6
- </head>
7
- <body>
8
- <p>The following conditions must be satisfied in order to provision this machine:</p>
9
- <ul>
10
- <% unsatisfied.each do |task| %>
11
- <li>
12
- <a rel="requirement" href="<%= web_path(task.name)%>"><%= task.name %></a>
13
- </li>
14
- <% end %>
15
- </ul>
16
- </body>
17
- </html>
@@ -1,6 +0,0 @@
1
- <form action="<%= task_path %>" method="post" enctype='multipart/form-data'>
2
- <input type='file' name="data"></input>
3
- <button type="submit" class="button" value="" name="" >
4
- Submit
5
- </button>
6
- </form>
@@ -1,6 +0,0 @@
1
- <form action="<%= task_path %>" method="post">
2
- <textarea name="data"></textarea>
3
- <button type="submit" class="button" value="" name="" >
4
- Submit
5
- </button>
6
- </form>
@@ -1,147 +0,0 @@
1
- require 'mattock/testing/rake-example-group'
2
- require 'mattock/template-host'
3
- require 'timeout'
4
-
5
- require 'logical-construct/target/sinatra-resolver'
6
- require 'logical-construct/ground-control/provision'
7
- require 'logical-construct/satisfiable-task'
8
-
9
- describe LogicalConstruct::SinatraResolver, :slow => true do
10
- include Mattock::RakeExampleGroup
11
-
12
- let :file_target_path do
13
- "target-file"
14
- end
15
-
16
- let :string_target_path do
17
- "target-string"
18
- end
19
-
20
- let :resolver_pipe do
21
- IO.pipe
22
- end
23
-
24
- let! :resolver_write do
25
- resolver_pipe[1]
26
- end
27
-
28
- let :resolver_read do
29
- resolver_pipe[0]
30
- end
31
-
32
- let :resolver_buffer do
33
- ""
34
- end
35
-
36
- let :resolver_process do
37
- Process.fork do
38
- extend Mattock::ValiseManager
39
- file = LogicalConstruct::SatisfiableFileTask.new(:file_target) do |task|
40
- task.target_path = file_target_path
41
- end
42
-
43
- string = LogicalConstruct::SatisfiableFileTask.new(:string_target) do |task|
44
- task.target_path = string_target_path
45
- end
46
-
47
- LogicalConstruct::SinatraResolver.new(file, string, :resolver) do |task|
48
- task.valise = default_valise(File::expand_path("../../lib", __FILE__))
49
- task.bind = "127.0.0.1"
50
- end
51
-
52
- $stdout.reopen(resolver_write)
53
- $stderr.reopen(resolver_write)
54
-
55
- rake[:file_target].invoke
56
- rake[:string_target].invoke
57
- end.tap do |pid|
58
- at_exit do
59
- kill("KILL", pid) rescue nil
60
- end
61
- end
62
- end
63
-
64
-
65
- before :each do
66
- resolver_process
67
-
68
- begin
69
- resolver_buffer << resolver_read.read_nonblock(4096)
70
- rescue IO::WaitReadable => err
71
- sleep 0.1
72
- retry
73
- end until /Listening on/ =~ resolver_buffer
74
- end
75
-
76
- after do
77
- begin
78
- Process.kill("INT", resolver_process)
79
- Process.wait(resolver_process)
80
- rescue => ex
81
- warn ex
82
- end
83
- end
84
-
85
- it "should block when unresolved" do
86
- expect do
87
- Process.wait(resolver_process, Process::WNOHANG)
88
- end.not_to raise_error
89
- end
90
-
91
- it "should not have a file already" do
92
- File::file?(file_target_path).should be_false
93
- end
94
-
95
- describe LogicalConstruct::GroundControl::Provision::WebConfigure do
96
- let :file_content do
97
- "Some test file content"
98
- end
99
-
100
- let :string_content do
101
- "Some string content"
102
- end
103
-
104
- let :file do
105
- require 'stringio'
106
- StringIO.new(file_content).tap do |str|
107
- def str.path
108
- "fake_file.txt"
109
- end
110
- end
111
- end
112
-
113
- let! :web_configure do
114
- LogicalConstruct::GroundControl::Provision::WebConfigure.new(:web_configure) do |task|
115
- task.target_address = "127.0.0.1"
116
- task.resolutions["file_target"] = proc{ file }
117
- task.resolutions["string_target"] = string_content
118
- end
119
- end
120
-
121
- before :each do
122
- rake[:web_configure].invoke
123
- end
124
-
125
- it "should complete resolver thread" do
126
- expect do
127
- begin
128
- Timeout::timeout(10) do
129
- Process.wait(resolver_process)
130
- end
131
- rescue Object => ex
132
- resolver_buffer << resolver.read_nonblock(10000) rescue ""
133
- p resolver_buffer
134
- raise
135
- end
136
- end.not_to raise_error
137
- end
138
-
139
- it "should produce the file" do
140
- File::read(file_target_path).should == file_content
141
- end
142
-
143
- it "should produce the string" do
144
- File::read(string_target_path).should == string_content
145
- end
146
- end
147
- end
@@ -1,67 +0,0 @@
1
- require 'logical-construct/target/platforms'
2
- require 'mattock/testing/rake-example-group'
3
- require 'mattock/testing/mock-command-line'
4
-
5
- describe LogicalConstruct::VirtualBox::ChefConfig do
6
- include Mattock::RakeExampleGroup
7
- include Mattock::CommandLineExampleGroup
8
- include FileSandbox
9
-
10
- before :each do
11
- sandbox.new :directory => "construct-dir"
12
- sandbox.new :directory => "chef-dir"
13
- end
14
-
15
- let :provision do
16
- require 'logical-construct/target/provision'
17
- LogicalConstruct::Provision.new do |prov|
18
- prov.construct_dir = "construct-dir"
19
- end
20
- end
21
-
22
- let :resolution do
23
- require 'logical-construct/testing/resolve-configuration'
24
- LogicalConstruct::Testing::ResolveConfiguration.new(provision) do |resolve|
25
- resolve.resolutions = {
26
- 'chef_config:cookbook_tarball' => "",
27
- 'chef_config:json_attribs' => "",
28
- }
29
- end
30
- end
31
-
32
- let! :chef_config do
33
- LogicalConstruct::VirtualBox::ChefConfig.new(provision, resolution) do |cc|
34
- cc.file_cache_path = "chef-dir"
35
- cc.solo_rb = "chef-solo.rb"
36
- end
37
- end
38
-
39
- it "should make an absolute path for solo.rb" do
40
- chef_config.solo_rb.should =~ /\A\//
41
- end
42
-
43
- describe "invoked" do
44
- before :each do
45
- expect_command /tar/, 0
46
- expect_command /tar/, 0
47
- expect_command /tar/, 0
48
- rake[File::join(sandbox["chef-dir"].path, "chef-solo.rb")].invoke
49
- end
50
-
51
- it "should generate the chef-solo.rb file" do
52
- sandbox["chef-dir/chef-solo.rb"].should be_exist
53
- end
54
-
55
- describe "resulting config file" do
56
- subject do
57
- sandbox["chef-dir/chef-solo.rb"].contents
58
- end
59
-
60
- it{ should =~ %r{file_cache_path\s*(["']).*\1} }
61
- it{ should =~ %r{cookbook_path\s*(["']).*/cookbooks\1} }
62
- it{ should =~ %r{json_attribs\s*(["']).*/node.json\1} }
63
- it{ should_not =~ /role_path/ }
64
- end
65
-
66
- end
67
- end
@@ -1,55 +0,0 @@
1
- require 'logical-construct/target/chef-solo'
2
- require 'logical-construct/target/platforms'
3
- require 'mattock/testing/rake-example-group'
4
- require 'mattock/testing/mock-command-line'
5
-
6
- describe LogicalConstruct::ChefSolo do
7
- include Mattock::RakeExampleGroup
8
- include FileSandbox
9
-
10
- let :provision do
11
- require 'logical-construct/target/provision'
12
- LogicalConstruct::Provision.new
13
- end
14
-
15
- let :resolver do
16
- require 'logical-construct/testing/resolve-configuration'
17
- LogicalConstruct::Testing::ResolveConfiguration.new(provision) do |resolve|
18
- resolve.resolutions = {
19
- 'chef_config:cookbook_tarball' => '',
20
- 'chef_config:json_attribs' => '',
21
- }
22
- end
23
- end
24
-
25
- let! :chef_config do
26
- LogicalConstruct::VirtualBox::ChefConfig.new(provision, resolver) do |cc|
27
- cc.file_cache_path = "chef-dir"
28
- cc.solo_rb = "chef-solo.rb"
29
- end
30
- end
31
-
32
- let! :chef_solo do
33
- LogicalConstruct::ChefSolo.new(chef_config)
34
- end
35
-
36
- describe "invoked" do
37
- include Mattock::CommandLineExampleGroup
38
-
39
- it "should have the bundle path in the PATH" do
40
- expect_some_commands
41
- rake["chef_solo:run"].invoke
42
- ENV['PATH'].should =~ %r{/var/logical-construct/bin}
43
- end
44
-
45
- it "should run chef-solo" do
46
- Rake.verbose(true)
47
- expect_command /tar/, 0
48
- expect_command /tar/, 0
49
- expect_command /tar/, 0
50
- expect_command /chef-solo/, 0
51
-
52
- rake["chef_solo:run"].invoke
53
- end
54
- end
55
- end
@@ -1,36 +0,0 @@
1
- require 'logical-construct/target/platforms'
2
-
3
- describe LogicalConstruct do
4
- after :each do
5
- ENV['LOGCON_DEPLOYMENT_PLATFORM'] = nil
6
- $DEPLOYMENT_PLATFORM = nil
7
- end
8
-
9
- describe "Platform()" do
10
- it "should fail for unset plaform" do
11
- expect do
12
- LogicalConstruct::Platform()
13
- end.to raise_error(KeyError)
14
- end
15
-
16
- it "should succeed for ENV VirtualBox" do
17
- ENV['LOGCON_DEPLOYMENT_PLATFORM'] = 'VirtualBox'
18
- LogicalConstruct::Platform().should == LogicalConstruct::VirtualBox
19
- end
20
-
21
- it "should succeed for global VirtualBox" do
22
- $DEPLOYMENT_PLATFORM = 'VirtualBox'
23
- LogicalConstruct::Platform().should == LogicalConstruct::VirtualBox
24
- end
25
- end
26
-
27
- describe "including VirtualBox" do
28
- before :each do
29
- ENV['LOGCON_DEPLOYMENT_PLATFORM'] = 'VirtualBox'
30
- end
31
-
32
- it "should make ChefConfig available" do
33
- LogicalConstruct::Platform()::ChefConfig.should == ::LogicalConstruct::VirtualBox::ChefConfig
34
- end
35
- end
36
- end
@@ -1,45 +0,0 @@
1
- require 'logical-construct/target'
2
-
3
-
4
- module TestAWS
5
- include LogicalConstruct
6
- include LogicalConstruct::Platform("AWS")
7
-
8
- describe "VirtualBox platform" do
9
- before :each do
10
- provision = Provision.new
11
-
12
- provision.in_namespace do
13
- resolution = ResolveConfiguration.new(provision)
14
- chef_config = ChefConfig.new(provision, resolution)
15
- chef_solo = ChefSolo.new(chef_config)
16
- end
17
- end
18
-
19
- it "should not crash" do
20
- true.should be_true
21
- end
22
- end
23
- end
24
-
25
- module TestVirtualBox
26
- include LogicalConstruct
27
- include LogicalConstruct::Platform("VirtualBox")
28
-
29
- describe "VirtualBox platform" do
30
- before :each do
31
- provision = Provision.new
32
-
33
- provision.in_namespace do
34
- resolution = ResolveConfiguration.new(provision)
35
- chef_config = ChefConfig.new(provision, resolution)
36
- chef_solo = ChefSolo.new(chef_config)
37
- end
38
- end
39
-
40
- it "should not crash" do
41
- true.should be_true
42
- end
43
- end
44
-
45
- end
@@ -1,36 +0,0 @@
1
- class Ungemmer
2
- def self.ungem(*names)
3
- deps = names.map do |name|
4
- Gem::Dependency.new(name, nil)
5
- end
6
-
7
- deps.each do |dep|
8
- Gem.source_index.search(dep).each do |gemspec|
9
- puts " ** Ungemming #{gemspec.full_name} **"
10
- Gem.source_index.remove_spec(gemspec.full_name)
11
- end
12
- end
13
-
14
- Gem.instance_eval do
15
- if defined? Gem::MUTEX
16
- Gem::MUTEX.synchronize do
17
- @searcher = nil
18
- end
19
- else
20
- @searcher = nil
21
- end
22
- end
23
- end
24
-
25
- def self.ungem_gemspec
26
- Dir[File::expand_path(__FILE__ + "../../../*.gemspec")].each do |gemspec_path|
27
- puts "Ungemming based on #{gemspec_path}"
28
- begin
29
- spec = Gem::Specification::load(gemspec_path)
30
- Ungemmer::ungem(spec)
31
- rescue LoadError
32
- puts "Couldn't load #{gemspec_path}"
33
- end
34
- end
35
- end
36
- end