lxc-ruby 0.2.2 → 0.2.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.
- data/README.md +11 -3
- data/lib/lxc/container.rb +33 -10
- data/lib/lxc/version.rb +1 -1
- data/spec/container_spec.rb +61 -0
- metadata +9 -4
data/README.md
CHANGED
@@ -85,10 +85,21 @@ c.stop # => {:state => 'STOPPED', :pid => -1}
|
|
85
85
|
c.freeze
|
86
86
|
c.unfreeze
|
87
87
|
|
88
|
+
# Destroy container
|
89
|
+
c.destroy # => true
|
90
|
+
```
|
91
|
+
|
92
|
+
Container metrics:
|
93
|
+
|
94
|
+
```ruby
|
88
95
|
# Get container memory usage (in bytes)
|
89
96
|
c.memory_usage
|
90
97
|
c.memory_limit
|
91
98
|
|
99
|
+
# Get container cpu shares and usage (in seconds)
|
100
|
+
c.cpu_shares # => 1024
|
101
|
+
c.cpu_usage # => 4312.08
|
102
|
+
|
92
103
|
# Get running processes
|
93
104
|
c.processes
|
94
105
|
# =>
|
@@ -98,9 +109,6 @@ c.processes
|
|
98
109
|
# "memory"=>"0.1",
|
99
110
|
# "command"=>"/sbin/init",
|
100
111
|
# "args"=>""}]
|
101
|
-
|
102
|
-
# Destroy container
|
103
|
-
c.destroy # => true
|
104
112
|
```
|
105
113
|
|
106
114
|
To create a new container:
|
data/lib/lxc/container.rb
CHANGED
@@ -54,14 +54,14 @@ module LXC
|
|
54
54
|
# Start container
|
55
55
|
# @return [Hash] container status hash
|
56
56
|
def start
|
57
|
-
|
57
|
+
run('start', '-d')
|
58
58
|
status
|
59
59
|
end
|
60
60
|
|
61
61
|
# Stop container
|
62
62
|
# @return [Hash] container status hash
|
63
63
|
def stop
|
64
|
-
|
64
|
+
run('stop')
|
65
65
|
status
|
66
66
|
end
|
67
67
|
|
@@ -75,14 +75,14 @@ module LXC
|
|
75
75
|
# Freeze container
|
76
76
|
# @return [Hash] container status hash
|
77
77
|
def freeze
|
78
|
-
|
78
|
+
run('freeze')
|
79
79
|
status
|
80
80
|
end
|
81
81
|
|
82
82
|
# Unfreeze container
|
83
83
|
# @return [Hash] container status hash
|
84
84
|
def unfreeze
|
85
|
-
|
85
|
+
run('unfreeze')
|
86
86
|
status
|
87
87
|
end
|
88
88
|
|
@@ -92,26 +92,42 @@ module LXC
|
|
92
92
|
if !LXC::Shell.valid_state?(state)
|
93
93
|
raise ArgumentError, "Invalid container state: #{state}"
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
|
+
run('wait', '-s', state)
|
96
97
|
end
|
97
98
|
|
98
99
|
# Get container memory usage in bytes
|
99
100
|
# @return [Integer]
|
100
101
|
def memory_usage
|
101
|
-
|
102
|
+
run('cgroup', 'memory.usage_in_bytes').strip.to_i
|
102
103
|
end
|
103
104
|
|
104
105
|
# Get container memory limit in bytes
|
105
106
|
# @return [Integer]
|
106
107
|
def memory_limit
|
107
|
-
|
108
|
+
run('cgroup', 'memory.limit_in_bytes').strip.to_i
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get container cpu shares
|
112
|
+
# @return [Integer]
|
113
|
+
def cpu_shares
|
114
|
+
result = run('cgroup', "cpu.shares").strip
|
115
|
+
result.empty? ? nil : result.to_i
|
116
|
+
end
|
117
|
+
|
118
|
+
# Get container cpu usage in seconds
|
119
|
+
# @return [Float]
|
120
|
+
def cpu_usage
|
121
|
+
result = run('cgroup', "cpuacct.usage").strip
|
122
|
+
result.empty? ? nil : Float('%.4f' % (result.to_i / 1E9))
|
108
123
|
end
|
109
124
|
|
110
125
|
# Get container processes
|
111
126
|
# @return [Array] list of all processes
|
112
127
|
def processes
|
113
128
|
raise ContainerError, "Container is not running" if !running?
|
114
|
-
|
129
|
+
|
130
|
+
str = run('ps', '--', '-eo pid,user,%cpu,%mem,args').strip
|
115
131
|
lines = str.split("\n") ; lines.delete_at(0)
|
116
132
|
lines.map { |l| parse_process_line(l) }
|
117
133
|
end
|
@@ -121,6 +137,7 @@ module LXC
|
|
121
137
|
# @return [Boolean]
|
122
138
|
def create(path)
|
123
139
|
raise ContainerError, "Container already exists." if exists?
|
140
|
+
|
124
141
|
if path.is_a?(Hash)
|
125
142
|
args = "-n #{name}"
|
126
143
|
|
@@ -186,21 +203,27 @@ module LXC
|
|
186
203
|
#
|
187
204
|
def destroy(force=false)
|
188
205
|
raise ContainerError, "Container does not exist." unless exists?
|
206
|
+
|
189
207
|
if running?
|
190
208
|
if force
|
191
209
|
# This will force stop and destroy container automatically
|
192
|
-
|
210
|
+
run('destroy', '-f')
|
193
211
|
else
|
194
212
|
raise ContainerError, "Container is running. Stop it first or use force=true"
|
195
213
|
end
|
196
214
|
else
|
197
|
-
|
215
|
+
run('destroy')
|
198
216
|
end
|
217
|
+
|
199
218
|
!exists?
|
200
219
|
end
|
201
220
|
|
202
221
|
private
|
203
222
|
|
223
|
+
def run(command, *args)
|
224
|
+
LXC.run(command, "-n", name, *args)
|
225
|
+
end
|
226
|
+
|
204
227
|
def parse_process_line(line)
|
205
228
|
chunks = line.split(' ')
|
206
229
|
chunks.delete_at(0)
|
data/lib/lxc/version.rb
CHANGED
data/spec/container_spec.rb
CHANGED
@@ -120,4 +120,65 @@ describe LXC::Container do
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
123
|
+
|
124
|
+
describe '#cpu_shares' do
|
125
|
+
context 'when container is running' do
|
126
|
+
before do
|
127
|
+
stub_lxc("cgroup", "-n", "app", "cpu.shares") { "1024\n" }
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'returns cpu shares value' do
|
131
|
+
subject.cpu_shares.should eq 1024
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when container is stopped' do
|
136
|
+
before do
|
137
|
+
stub_lxc("cgroup", "-n", "app", "cpu.shares") { "\n" }
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'returns nil' do
|
141
|
+
subject.cpu_shares.should be_nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#cpu_usage' do
|
147
|
+
context 'when container is running' do
|
148
|
+
before do
|
149
|
+
stub_lxc("cgroup", "-n", "app", "cpuacct.usage") { "4239081939568\n" }
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'returns usage in seconds' do
|
153
|
+
subject.cpu_usage.should eq 4239.0819
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'when container is stopped' do
|
158
|
+
before do
|
159
|
+
stub_lxc("cgroup", "-n", "app", "cpuacct.usage") { "\n" }
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'returns nil' do
|
163
|
+
subject.cpu_usage.should be_nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe '#run' do
|
169
|
+
let(:subject) do
|
170
|
+
class Kontainer < LXC::Container
|
171
|
+
def info
|
172
|
+
run('info')
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
Kontainer.new('app')
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'executes a command with container name' do
|
180
|
+
stub_lxc("info", "-n", "app") { "info" }
|
181
|
+
subject.info.should eq "info"
|
182
|
+
end
|
183
|
+
end
|
123
184
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lxc-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -102,15 +102,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
102
|
- - ! '>='
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
hash: 2803095474129589431
|
105
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
109
|
none: false
|
107
110
|
requirements:
|
108
111
|
- - ! '>='
|
109
112
|
- !ruby/object:Gem::Version
|
110
113
|
version: '0'
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
hash: 2803095474129589431
|
111
117
|
requirements: []
|
112
118
|
rubyforge_project:
|
113
|
-
rubygems_version: 1.8.
|
119
|
+
rubygems_version: 1.8.25
|
114
120
|
signing_key:
|
115
121
|
specification_version: 3
|
116
122
|
summary: Ruby wrapper to LXC
|
@@ -125,4 +131,3 @@ test_files:
|
|
125
131
|
- spec/fixtures/lxc-version.txt
|
126
132
|
- spec/lxc_spec.rb
|
127
133
|
- spec/spec_helper.rb
|
128
|
-
has_rdoc:
|