Class: LXC::Container

Inherits:
Object
  • Object
show all
Defined in:
lib/lxc/container.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ LXC::Container

Initialize a new LXC::Container instance

Parameters:

  • name (String)

    container name



10
11
12
# File 'lib/lxc/container.rb', line 10

def initialize(name)
  @name = name
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



3
4
5
# File 'lib/lxc/container.rb', line 3

def name
  @name
end

#pidObject (readonly)

Returns the value of attribute pid.



5
6
7
# File 'lib/lxc/container.rb', line 5

def pid
  @pid
end

#stateObject (readonly)

Returns the value of attribute state.



4
5
6
# File 'lib/lxc/container.rb', line 4

def state
  @state
end

Instance Method Details

#clone_from(source) ⇒ Boolean

Create a new container from an existing container

Parameters:

  • source (String)

    name of existing container

Returns:

  • (Boolean)

Raises:



187
188
189
190
191
192
193
194
195
# File 'lib/lxc/container.rb', line 187

def clone_from(source)
  raise ContainerError, "Container already exists." if exists?
  unless self.class.new(source).exists?
    raise ContainerError, "Source container does not exist."
  end

  LXC.run('clone', '-o', source, '-n', name)
  exists?
end

#clone_to(target) ⇒ LXC::Container

Clone to a new container from self

Parameters:

  • target (String)

    name of new container

Returns:

Raises:



174
175
176
177
178
179
180
181
182
# File 'lib/lxc/container.rb', line 174

def clone_to(target)
  raise ContainerError, "Container does not exist." unless exists?
  if self.class.new(target).exists?
    raise ContainerError, "New container already exists."
  end

  LXC.run('clone', '-o', name, '-n', target)
  self.class.new target
end

#cpu_sharesInteger

Get container cpu shares

Returns:

  • (Integer)


113
114
115
116
# File 'lib/lxc/container.rb', line 113

def cpu_shares
  result = run('cgroup', "cpu.shares").strip
  result.empty? ? nil : result.to_i
end

#cpu_usageFloat

Get container cpu usage in seconds

Returns:

  • (Float)


120
121
122
123
# File 'lib/lxc/container.rb', line 120

def cpu_usage
  result = run('cgroup', "cpuacct.usage").strip
  result.empty? ? nil : Float('%.4f' % (result.to_i / 1E9))
end

#create(path) ⇒ Boolean

Create a new container

Parameters:

  • path (String)

    path to container config file or [Hash] options

Returns:

  • (Boolean)

Raises:



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/lxc/container.rb', line 138

def create(path)
  raise ContainerError, "Container already exists." if exists?

  if path.is_a?(Hash)
    args = "-n #{name}"

    if !!path[:config_file]
      unless File.exists?(path[:config_file])
        raise ArgumentError, "File #{path[:config_file]} does not exist."
      end
      args += " -f #{path[:config_file]}"
    end

    if !!path[:template]
      template_path = "/usr/lib/lxc/templates/lxc-#{path[:template]}"
      unless File.exists?(template_path)
        raise ArgumentError, "Template #{path[:template]} does not exist."
      end
      args += " -t #{path[:template]} "
    end

    args += " -B #{path[:backingstore]}" if !!path[:backingstore]
    args += " -- #{path[:template_options].join(' ')}".strip if !!path[:template_options]

    LXC.run('create', args)
    exists?
  else
    raise ArgumentError, "File #{path} does not exist." unless File.exists?(path)
    LXC.run('create', '-n', name, '-f', path)
    exists?
  end
end

#destroy(force = false) ⇒ Boolean

Destroy the container If container is running and force parameter is true it will be stopped first. Otherwise it will raise exception.

Parameters:

  • force (Boolean) (defaults to: false)

    force destruction

Returns:

  • (Boolean)

    true if container was destroyed

Raises:



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/lxc/container.rb', line 204

def destroy(force=false)
  raise ContainerError, "Container does not exist." unless exists?

  if running?
    if force
      # This will force stop and destroy container automatically
      run('destroy', '-f')
    else
      raise ContainerError, "Container is running. Stop it first or use force=true"
    end
  else
    run('destroy')
  end  

  !exists?
end

#exists?Boolean

Check if container exists

Returns:

  • (Boolean)


32
33
34
# File 'lib/lxc/container.rb', line 32

def exists?
  LXC.run('ls').split("\n").uniq.include?(name)
end

#freezeHash

Freeze container

Returns:

  • (Hash)

    container status hash



77
78
79
80
# File 'lib/lxc/container.rb', line 77

def freeze
  run('freeze')
  status
end

#frozen?Boolean

Check if container is frozen

Returns:

  • (Boolean)


44
45
46
# File 'lib/lxc/container.rb', line 44

def frozen?
  status[:state] == 'FROZEN'
end

#memory_limitInteger

Get container memory limit in bytes

Returns:

  • (Integer)


107
108
109
# File 'lib/lxc/container.rb', line 107

def memory_limit
  run('cgroup', 'memory.limit_in_bytes').strip.to_i
end

#memory_usageInteger

Get container memory usage in bytes

Returns:

  • (Integer)


101
102
103
# File 'lib/lxc/container.rb', line 101

def memory_usage
  run('cgroup', 'memory.usage_in_bytes').strip.to_i
end

#processesArray

Get container processes

Returns:

  • (Array)

    list of all processes

Raises:



127
128
129
130
131
132
133
# File 'lib/lxc/container.rb', line 127

def processes
  raise ContainerError, "Container is not running" if !running?

  str = run('ps', '--', '-eo pid,user,%cpu,%mem,args').strip
  lines = str.split("\n") ; lines.delete_at(0)
  lines.map { |l| parse_process_line(l) }
end

#restartHash

Restart container

Returns:

  • (Hash)

    container status hash



70
71
72
73
# File 'lib/lxc/container.rb', line 70

def restart
  stop
  start
end

#running?Boolean

Check if container is running

Returns:

  • (Boolean)


38
39
40
# File 'lib/lxc/container.rb', line 38

def running?
  status[:state] == 'RUNNING'
end

#startHash

Start container

Returns:

  • (Hash)

    container status hash



56
57
58
59
# File 'lib/lxc/container.rb', line 56

def start
  run('start', '-d')
  status
end

#statusHash

Get current status of container

Returns:

  • (Hash)

    hash with :state and :pid attributes



23
24
25
26
27
28
# File 'lib/lxc/container.rb', line 23

def status
  str    = LXC.run('info', '-n', name)
  @state = str.scan(/^state:\s+([\w]+)$/).flatten.first
  @pid   = str.scan(/^pid:\s+(-?[\d]+)$/).flatten.first
  {:state => @state, :pid => @pid}
end

#stopHash

Stop container

Returns:

  • (Hash)

    container status hash



63
64
65
66
# File 'lib/lxc/container.rb', line 63

def stop
  run('stop')
  status
end

#stopped?Boolean

Check if container is stopped?

Returns:

  • (Boolean)


50
51
52
# File 'lib/lxc/container.rb', line 50

def stopped?
  exists? && status[:state] == 'STOPPED'
end

#to_hashHash

Get container attributes hash

Returns:

  • (Hash)


16
17
18
19
# File 'lib/lxc/container.rb', line 16

def to_hash
  status
  {'name' => name, 'state' => state, 'pid' => pid}
end

#unfreezeHash

Unfreeze container

Returns:

  • (Hash)

    container status hash



84
85
86
87
# File 'lib/lxc/container.rb', line 84

def unfreeze
  run('unfreeze')
  status
end

#wait(state) ⇒ Object

Wait for container to change status

Parameters:

  • state (String)

    state name



91
92
93
94
95
96
97
# File 'lib/lxc/container.rb', line 91

def wait(state)
  if !LXC::Shell.valid_state?(state)
    raise ArgumentError, "Invalid container state: #{state}"
  end

  run('wait', '-s', state)
end