warden-protocol 0.1.3

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 (63) hide show
  1. data/.gitignore +17 -0
  2. data/.rspec +1 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile +6 -0
  5. data/README.md +13 -0
  6. data/Rakefile +40 -0
  7. data/lib/warden/protocol.rb +4 -0
  8. data/lib/warden/protocol/base.rb +168 -0
  9. data/lib/warden/protocol/buffer.rb +69 -0
  10. data/lib/warden/protocol/build.sh +13 -0
  11. data/lib/warden/protocol/message.rb +50 -0
  12. data/lib/warden/protocol/pb.rb +497 -0
  13. data/lib/warden/protocol/pb/copy_in.proto +35 -0
  14. data/lib/warden/protocol/pb/copy_out.proto +39 -0
  15. data/lib/warden/protocol/pb/create.proto +65 -0
  16. data/lib/warden/protocol/pb/destroy.proto +33 -0
  17. data/lib/warden/protocol/pb/echo.proto +26 -0
  18. data/lib/warden/protocol/pb/error.proto +19 -0
  19. data/lib/warden/protocol/pb/info.proto +95 -0
  20. data/lib/warden/protocol/pb/limit_bandwidth.proto +30 -0
  21. data/lib/warden/protocol/pb/limit_disk.proto +70 -0
  22. data/lib/warden/protocol/pb/limit_memory.proto +34 -0
  23. data/lib/warden/protocol/pb/link.proto +40 -0
  24. data/lib/warden/protocol/pb/list.proto +25 -0
  25. data/lib/warden/protocol/pb/message.proto +36 -0
  26. data/lib/warden/protocol/pb/net_in.proto +39 -0
  27. data/lib/warden/protocol/pb/net_out.proto +35 -0
  28. data/lib/warden/protocol/pb/ping.proto +24 -0
  29. data/lib/warden/protocol/pb/resource_limits.proto +30 -0
  30. data/lib/warden/protocol/pb/run.proto +29 -0
  31. data/lib/warden/protocol/pb/spawn.proto +37 -0
  32. data/lib/warden/protocol/pb/stop.proto +40 -0
  33. data/lib/warden/protocol/pb/stream.proto +41 -0
  34. data/lib/warden/protocol/version.rb +7 -0
  35. data/spec/base_spec.rb +150 -0
  36. data/spec/buffer_spec.rb +65 -0
  37. data/spec/copy_in_spec.rb +51 -0
  38. data/spec/copy_out_spec.rb +56 -0
  39. data/spec/create_spec.rb +70 -0
  40. data/spec/destroy_spec.rb +36 -0
  41. data/spec/echo_spec.rb +42 -0
  42. data/spec/error_spec.rb +33 -0
  43. data/spec/info_spec.rb +122 -0
  44. data/spec/limit_bandwidth_spec.rb +57 -0
  45. data/spec/limit_disk_spec.rb +103 -0
  46. data/spec/limit_memory_spec.rb +47 -0
  47. data/spec/link_spec.rb +67 -0
  48. data/spec/list_spec.rb +41 -0
  49. data/spec/net_in_spec.rb +57 -0
  50. data/spec/net_out_spec.rb +47 -0
  51. data/spec/ping_spec.rb +32 -0
  52. data/spec/resource_limits_spec.rb +84 -0
  53. data/spec/run_spec.rb +79 -0
  54. data/spec/spawn_spec.rb +55 -0
  55. data/spec/spec_helper.rb +11 -0
  56. data/spec/stop_spec.rb +46 -0
  57. data/spec/stream_spec.rb +65 -0
  58. data/spec/support/examples/wrappable_reply.rb +26 -0
  59. data/spec/support/examples/wrappable_request.rb +26 -0
  60. data/spec/support/helper.rb +122 -0
  61. data/spec/support/matchers.rb +22 -0
  62. data/warden-protocol.gemspec +21 -0
  63. metadata +166 -0
@@ -0,0 +1,65 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+ require "warden/protocol/buffer"
5
+
6
+ describe Warden::Protocol::Buffer do
7
+ let(:request) { Warden::Protocol::EchoRequest.new(:message => "request") }
8
+ let(:response) { Warden::Protocol::EchoResponse.new(:message => "response") }
9
+
10
+ it "should support iterating over requests" do
11
+ subject << Warden::Protocol::Buffer.request_to_wire(request)
12
+ subject.each_request do |request|
13
+ request.class.should == Warden::Protocol::EchoRequest
14
+ request.message.should == "request"
15
+ end
16
+ end
17
+
18
+ it "should support iterating over responses" do
19
+ subject << Warden::Protocol::Buffer.response_to_wire(response)
20
+ subject.each_response do |response|
21
+ response.class.should == Warden::Protocol::EchoResponse
22
+ response.message.should == "response"
23
+ end
24
+ end
25
+
26
+ describe "fuzzing" do
27
+ it "should not break request iteration" do
28
+ data = Warden::Protocol::Buffer.request_to_wire(request)
29
+
30
+ loop do
31
+ chunk = data.slice!(0)
32
+ subject << chunk
33
+ break if data.empty?
34
+
35
+ subject.each_request do
36
+ fail
37
+ end
38
+ end
39
+
40
+ subject.each_request do |request|
41
+ request.class.should == Warden::Protocol::EchoRequest
42
+ request.message.should == "request"
43
+ end
44
+ end
45
+
46
+ it "should not break response iteration" do
47
+ data = Warden::Protocol::Buffer.response_to_wire(response)
48
+
49
+ loop do
50
+ chunk = data.slice!(0)
51
+ subject << chunk
52
+ break if data.empty?
53
+
54
+ subject.each_response do
55
+ fail
56
+ end
57
+ end
58
+
59
+ subject.each_response do |response|
60
+ response.class.should == Warden::Protocol::EchoResponse
61
+ response.message.should == "response"
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,51 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::CopyInRequest do
6
+ subject(:request) do
7
+ described_class.new(
8
+ :handle => "handle",
9
+ :src_path => "/src",
10
+ :dst_path => "/dst",
11
+ )
12
+ end
13
+
14
+ it_should_behave_like "wrappable request"
15
+
16
+ its("class.type_camelized") { should == "CopyIn" }
17
+ its("class.type_underscored") { should == "copy_in" }
18
+
19
+ field :handle do
20
+ it_should_be_required
21
+ it_should_be_typed_as_string
22
+ end
23
+
24
+ field :src_path do
25
+ it_should_be_required
26
+ it_should_be_typed_as_string
27
+ end
28
+
29
+ field :dst_path do
30
+ it_should_be_required
31
+ it_should_be_typed_as_string
32
+ end
33
+
34
+ it "should respond to #create_response" do
35
+ request.create_response.should be_a(Warden::Protocol::CopyInResponse)
36
+ end
37
+ end
38
+
39
+ describe Warden::Protocol::CopyInResponse do
40
+ subject(:response) do
41
+ described_class.new
42
+ end
43
+
44
+ it_should_behave_like "wrappable response"
45
+
46
+ its("class.type_camelized") { should == "CopyIn" }
47
+ its("class.type_underscored") { should == "copy_in" }
48
+
49
+ it { should be_ok }
50
+ it { should_not be_error }
51
+ end
@@ -0,0 +1,56 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::CopyOutRequest do
6
+ subject(:request) do
7
+ described_class.new(
8
+ :handle => "handle",
9
+ :src_path => "/src",
10
+ :dst_path => "/dst",
11
+ )
12
+ end
13
+
14
+ it_should_behave_like "wrappable request"
15
+
16
+ its("class.type_camelized") { should == "CopyOut" }
17
+ its("class.type_underscored") { should == "copy_out" }
18
+
19
+ field :handle do
20
+ it_should_be_required
21
+ it_should_be_typed_as_string
22
+ end
23
+
24
+ field :src_path do
25
+ it_should_be_required
26
+ it_should_be_typed_as_string
27
+ end
28
+
29
+ field :dst_path do
30
+ it_should_be_required
31
+ it_should_be_typed_as_string
32
+ end
33
+
34
+ field :owner do
35
+ it_should_be_optional
36
+ it_should_be_typed_as_string
37
+ end
38
+
39
+ it "should respond to #create_response" do
40
+ request.create_response.should be_a(Warden::Protocol::CopyOutResponse)
41
+ end
42
+ end
43
+
44
+ describe Warden::Protocol::CopyOutResponse do
45
+ subject(:response) do
46
+ described_class.new
47
+ end
48
+
49
+ it_should_behave_like "wrappable response"
50
+
51
+ its("class.type_camelized") { should == "CopyOut" }
52
+ its("class.type_underscored") { should == "copy_out" }
53
+
54
+ it { should be_ok }
55
+ it { should_not be_error }
56
+ end
@@ -0,0 +1,70 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::CreateRequest do
6
+ subject(:request) do
7
+ described_class.new
8
+ end
9
+
10
+ it_should_behave_like "wrappable request"
11
+
12
+ its("class.type_camelized") { should == "Create" }
13
+ its("class.type_underscored") { should == "create" }
14
+
15
+ field :bind_mounts do
16
+ it_should_be_optional
17
+
18
+ it "should be populated with BindMount objects" do
19
+ m = Warden::Protocol::CreateRequest::BindMount.new
20
+ m.src_path = "/src"
21
+ m.dst_path = "/dst"
22
+ m.mode = Warden::Protocol::CreateRequest::BindMount::Mode::RO
23
+
24
+ subject.bind_mounts = [m]
25
+ subject.should be_valid
26
+ end
27
+ end
28
+
29
+ field :grace_time do
30
+ it_should_be_optional
31
+ it_should_be_typed_as_uint
32
+ end
33
+
34
+ field :handle do
35
+ it_should_be_optional
36
+ it_should_be_typed_as_string
37
+ end
38
+
39
+ field :network do
40
+ it_should_be_optional
41
+ it_should_be_typed_as_string
42
+ end
43
+
44
+ field :rootfs do
45
+ it_should_be_optional
46
+ it_should_be_typed_as_string
47
+ end
48
+
49
+ it "should respond to #create_response" do
50
+ request.create_response.should be_a(Warden::Protocol::CreateResponse)
51
+ end
52
+ end
53
+
54
+ describe Warden::Protocol::CreateResponse do
55
+ subject(:response) do
56
+ described_class.new(:handle => "handle")
57
+ end
58
+
59
+ it_should_behave_like "wrappable response"
60
+
61
+ its("class.type_camelized") { should == "Create" }
62
+ its("class.type_underscored") { should == "create" }
63
+
64
+ it { should be_ok }
65
+ it { should_not be_error }
66
+
67
+ field :handle do
68
+ it_should_be_required
69
+ end
70
+ end
@@ -0,0 +1,36 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::DestroyRequest do
6
+ subject(:request) do
7
+ described_class.new(:handle => "handle")
8
+ end
9
+
10
+ it_should_behave_like "wrappable request"
11
+
12
+ its("class.type_camelized") { should == "Destroy" }
13
+ its("class.type_underscored") { should == "destroy" }
14
+
15
+ field :handle do
16
+ it_should_be_required
17
+ end
18
+
19
+ it "should respond to #create_response" do
20
+ request.create_response.should be_a(Warden::Protocol::DestroyResponse)
21
+ end
22
+ end
23
+
24
+ describe Warden::Protocol::DestroyResponse do
25
+ subject(:response) do
26
+ described_class.new
27
+ end
28
+
29
+ it_should_behave_like "wrappable response"
30
+
31
+ its("class.type_camelized") { should == "Destroy" }
32
+ its("class.type_underscored") { should == "destroy" }
33
+
34
+ it { should be_ok }
35
+ it { should_not be_error }
36
+ end
data/spec/echo_spec.rb ADDED
@@ -0,0 +1,42 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::EchoRequest do
6
+ subject(:request) do
7
+ described_class.new(:message => "here's a snowman: ☃")
8
+ end
9
+
10
+ it_should_behave_like "wrappable request"
11
+
12
+ its("class.type_camelized") { should == "Echo" }
13
+ its("class.type_underscored") { should == "echo" }
14
+
15
+ field :message do
16
+ it_should_be_required
17
+ it_should_be_typed_as_string
18
+ end
19
+
20
+ it "should respond to #create_response" do
21
+ request.create_response.should be_a(Warden::Protocol::EchoResponse)
22
+ end
23
+ end
24
+
25
+ describe Warden::Protocol::EchoResponse do
26
+ subject(:response) do
27
+ described_class.new(:message => "here's a snowman: ☃")
28
+ end
29
+
30
+ it_should_behave_like "wrappable response"
31
+
32
+ its("class.type_camelized") { should == "Echo" }
33
+ its("class.type_underscored") { should == "echo" }
34
+
35
+ it { should be_ok }
36
+ it { should_not be_error }
37
+
38
+ field :message do
39
+ it_should_be_required
40
+ it_should_be_typed_as_string
41
+ end
42
+ end
@@ -0,0 +1,33 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::ErrorResponse do
6
+ subject(:response) do
7
+ described_class.new
8
+ end
9
+
10
+ it_should_behave_like "wrappable response"
11
+
12
+ it { should_not be_ok }
13
+ it { should be_error }
14
+
15
+ field :message do
16
+ it_should_be_optional
17
+ it_should_be_typed_as_string
18
+ end
19
+
20
+ field :data do
21
+ it_should_be_optional
22
+ it_should_be_typed_as_string
23
+ end
24
+
25
+ field :backtrace do
26
+ it_should_be_optional
27
+
28
+ it "should allow one or more entries" do
29
+ subject.backtrace = ["a", "b"]
30
+ subject.should be_valid
31
+ end
32
+ end
33
+ end
data/spec/info_spec.rb ADDED
@@ -0,0 +1,122 @@
1
+ # coding: UTF-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Warden::Protocol::InfoRequest do
6
+ subject(:request) do
7
+ described_class.new(:handle => "handle")
8
+ end
9
+
10
+ it_should_behave_like "wrappable request"
11
+
12
+ its("class.type_camelized") { should == "Info" }
13
+ its("class.type_underscored") { should == "info" }
14
+
15
+ field :handle do
16
+ it_should_be_required
17
+ it_should_be_typed_as_string
18
+ end
19
+
20
+ it "should respond to #create_response" do
21
+ request.create_response.should be_a(Warden::Protocol::InfoResponse)
22
+ end
23
+ end
24
+
25
+ describe Warden::Protocol::InfoResponse::CpuStat do
26
+ field :usage do
27
+ it_should_be_optional
28
+ it_should_be_typed_as_uint64
29
+ end
30
+
31
+ field :user do
32
+ it_should_be_optional
33
+ it_should_be_typed_as_uint64
34
+ end
35
+
36
+ field :system do
37
+ it_should_be_optional
38
+ it_should_be_typed_as_uint64
39
+ end
40
+ end
41
+
42
+ describe Warden::Protocol::InfoResponse::DiskStat do
43
+ field :bytes_used do
44
+ it_should_be_optional
45
+ it_should_be_typed_as_uint64
46
+ end
47
+
48
+ field :inodes_used do
49
+ it_should_be_optional
50
+ it_should_be_typed_as_uint64
51
+ end
52
+ end
53
+
54
+ describe Warden::Protocol::InfoResponse do
55
+ subject(:response) do
56
+ described_class.new
57
+ end
58
+
59
+ it_should_behave_like "wrappable response"
60
+
61
+ its("class.type_camelized") { should == "Info" }
62
+ its("class.type_underscored") { should == "info" }
63
+
64
+ it { should be_ok }
65
+ it { should_not be_error }
66
+
67
+ field :state do
68
+ it_should_be_optional
69
+ it_should_be_typed_as_string
70
+ end
71
+
72
+ field :events do
73
+ it_should_be_optional
74
+
75
+ it "should allow one or more events" do
76
+ subject.events = ["a", "b"]
77
+ subject.should be_valid
78
+ end
79
+ end
80
+
81
+ field :host_ip do
82
+ it_should_be_optional
83
+ it_should_be_typed_as_string
84
+ end
85
+
86
+ field :container_ip do
87
+ it_should_be_optional
88
+ it_should_be_typed_as_string
89
+ end
90
+
91
+ field :container_path do
92
+ it_should_be_optional
93
+ it_should_be_typed_as_string
94
+ end
95
+
96
+ field :cpu_stat do
97
+ it_should_be_optional
98
+
99
+ it "should allow instances of CpuStat" do
100
+ subject.cpu_stat = Warden::Protocol::InfoResponse::CpuStat.new
101
+ subject.should be_valid
102
+ end
103
+ end
104
+
105
+ field :disk_stat do
106
+ it_should_be_optional
107
+
108
+ it "should allow instances of DiskStat" do
109
+ subject.disk_stat = Warden::Protocol::InfoResponse::DiskStat.new
110
+ subject.should be_valid
111
+ end
112
+ end
113
+
114
+ field :job_ids do
115
+ it_should_be_optional
116
+
117
+ it "should allow one or more job ids" do
118
+ subject.job_ids = [1, 2]
119
+ subject.should be_valid
120
+ end
121
+ end
122
+ end