elecksee 1.0.22 → 1.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +25 -0
- data/README.md +43 -6
- data/elecksee.gemspec +3 -3
- data/lib/elecksee/clone.rb +47 -16
- data/lib/elecksee/ephemeral.rb +65 -15
- data/lib/elecksee/helpers/copies.rb +36 -5
- data/lib/elecksee/helpers/options.rb +29 -3
- data/lib/elecksee/{helpers/base.rb → helpers.rb} +115 -56
- data/lib/elecksee/lxc.rb +204 -82
- data/lib/elecksee/lxc_file_config.rb +26 -0
- data/lib/elecksee/storage/overlay_directory.rb +68 -37
- data/lib/elecksee/storage/overlay_mount.rb +80 -45
- data/lib/elecksee/storage/virtual_device.rb +104 -60
- data/lib/elecksee/storage.rb +13 -0
- data/lib/elecksee/version.rb +2 -1
- data/lib/elecksee.rb +13 -0
- metadata +26 -33
- data/Gemfile +0 -5
- data/Gemfile.lock +0 -22
- data/lib/elecksee/knife/config.rb +0 -37
@@ -1,50 +1,81 @@
|
|
1
|
-
require 'elecksee
|
1
|
+
require 'elecksee'
|
2
2
|
|
3
3
|
class Lxc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
attr_reader :tmp_dir
|
8
|
-
|
9
|
-
include Helpers
|
10
|
-
|
11
|
-
def initialize(name, args={})
|
12
|
-
@name = name
|
13
|
-
@tmp_dir = args[:tmp_dir] || '/tmp/lxc/ephemerals'
|
14
|
-
create
|
15
|
-
end
|
4
|
+
module Storage
|
5
|
+
# Overlay directory backed storage
|
6
|
+
class OverlayDirectory
|
16
7
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
8
|
+
# @return [String] storage name (usually container name)
|
9
|
+
attr_reader :name
|
10
|
+
# @return [String] path to temporary directory
|
11
|
+
attr_reader :tmp_dir
|
21
12
|
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
include Helpers
|
14
|
+
|
15
|
+
# Create new instance
|
16
|
+
#
|
17
|
+
# @param name [String] storage name (usually container name)
|
18
|
+
# @param args [Hash]
|
19
|
+
# @option args [String] :tmp_dir path to temporary directory
|
20
|
+
def initialize(name, args={})
|
21
|
+
@name = name
|
22
|
+
@tmp_dir = args[:tmp_dir] || '/tmp/lxc/ephemerals'
|
23
|
+
create
|
25
24
|
end
|
26
|
-
end
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
# @return [String] path to overlay directory
|
27
|
+
def overlay_path
|
28
|
+
File.join(tmp_dir, 'virt-overlays', name)
|
29
|
+
end
|
30
|
+
alias_method :target_path, :overlay_path
|
31
|
+
|
32
|
+
# Create the storage
|
33
|
+
#
|
34
|
+
# @return [TrueClass, FalseClass]
|
35
|
+
def create
|
36
|
+
unless(File.directory?(overlay_path))
|
37
|
+
FileUtils.mkdir_p(overlay_path)
|
38
|
+
true
|
39
|
+
else
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Destroy the storage
|
45
|
+
#
|
46
|
+
# @return [TrueClass, FalseClass]
|
47
|
+
def destroy
|
48
|
+
if(File.directory?(overlay_path))
|
49
|
+
command("rm -rf #{overlay_path}", :sudo => true)
|
50
|
+
true
|
51
|
+
else
|
52
|
+
false
|
53
|
+
end
|
31
54
|
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
55
|
|
36
|
-
# Clone directory does the same as the overlay, just in
|
37
|
-
# a persistent place
|
38
|
-
class CloneDirectory < OverlayDirectory
|
39
|
-
def initialize(name, args={})
|
40
|
-
args[:tmp_dir] = args[:dir] if args[:dir]
|
41
|
-
args[:tmp_dir] || '/var/lib/lxc'
|
42
|
-
super
|
43
56
|
end
|
44
57
|
|
45
|
-
|
46
|
-
|
58
|
+
# Clone directory does the same as the overlay, just in
|
59
|
+
# a persistent location
|
60
|
+
class CloneDirectory < OverlayDirectory
|
61
|
+
|
62
|
+
# Create new instance
|
63
|
+
#
|
64
|
+
# @param name [String] name of storage (usually container name)
|
65
|
+
# @param args [Hash]
|
66
|
+
# @option args [String] :dir persistent storage path
|
67
|
+
def initialize(name, args={})
|
68
|
+
args[:tmp_dir] = args[:dir] if args[:dir]
|
69
|
+
args[:tmp_dir] || '/var/lib/lxc'
|
70
|
+
super
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [String]
|
74
|
+
def overlay_path
|
75
|
+
File.join(tmp_dir, name)
|
76
|
+
end
|
77
|
+
alias_method :target_path, :overlay_path
|
47
78
|
end
|
48
|
-
|
79
|
+
|
49
80
|
end
|
50
81
|
end
|
@@ -1,60 +1,95 @@
|
|
1
|
-
require 'elecksee
|
1
|
+
require 'elecksee'
|
2
2
|
|
3
3
|
class Lxc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@overlay
|
17
|
-
|
18
|
-
|
19
|
-
|
4
|
+
module Storage
|
5
|
+
# Overlay mount backed storage
|
6
|
+
class OverlayMount
|
7
|
+
|
8
|
+
include Helpers
|
9
|
+
|
10
|
+
# @return [String] base path to overlay
|
11
|
+
attr_reader :base
|
12
|
+
# @return [String] path to overlay storage
|
13
|
+
attr_reader :overlay
|
14
|
+
# @return [String] path to mount overlay
|
15
|
+
attr_reader :target
|
16
|
+
# @return [String] type of overlay to implement
|
17
|
+
attr_reader :overlay_type
|
18
|
+
|
19
|
+
# Create new instance
|
20
|
+
#
|
21
|
+
# @param args [Hash]
|
22
|
+
# @option args [String] :base base path to overlay
|
23
|
+
# @option args [String] :overlay path to overlay storage
|
24
|
+
# @option args [String] :target path to mount overlay
|
25
|
+
# @option args [String] :overlay_type type of overlay to implement
|
26
|
+
# @note :overlay_type defaults to overlayfs
|
27
|
+
def initialize(args={})
|
28
|
+
validate!(args)
|
29
|
+
@base = args[:base]
|
30
|
+
@overlay = args[:overlay]
|
31
|
+
@target = args[:target]
|
32
|
+
@overlay_type = args[:overlay_type] || 'overlayfs'
|
33
|
+
end
|
20
34
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
35
|
+
# Mount the overlay
|
36
|
+
#
|
37
|
+
# @return [TrueClass, FalseClass]
|
38
|
+
def mount
|
39
|
+
unless(mounted?)
|
40
|
+
case overlay_type
|
41
|
+
when 'aufs'
|
42
|
+
cmd = "mount -t aufs -o br=#{overlay}=rw:#{base}=ro,noplink none #{target}"
|
43
|
+
when 'overlayfs'
|
44
|
+
cmd = "mount -t overlayfs -oupperdir=#{overlay},lowerdir=#{base} none #{target}"
|
45
|
+
else
|
46
|
+
raise "Invalid overlay type provided: #{overlay_type}"
|
47
|
+
end
|
48
|
+
command(cmd, :sudo => true)
|
49
|
+
true
|
28
50
|
else
|
29
|
-
|
51
|
+
false
|
30
52
|
end
|
31
|
-
command(cmd, :sudo => true)
|
32
|
-
true
|
33
53
|
end
|
34
|
-
end
|
35
54
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def unmount
|
41
|
-
if(mounted?)
|
42
|
-
command("umount #{target}", :sudo => true, :allow_failure => true)
|
43
|
-
true
|
55
|
+
# @return [TrueClass, FalseClass]
|
56
|
+
def mounted?
|
57
|
+
command("mount").stdout.include?(target)
|
44
58
|
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
59
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
60
|
+
# Unmount the overlay
|
61
|
+
#
|
62
|
+
# @return [TrueClass, FalseClass]
|
63
|
+
def unmount
|
64
|
+
if(mounted?)
|
65
|
+
command("umount #{target}", :sudo => true, :allow_failure => true)
|
66
|
+
true
|
67
|
+
else
|
68
|
+
false
|
53
69
|
end
|
54
|
-
|
55
|
-
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Validate the provide arguments
|
75
|
+
#
|
76
|
+
# @param args [Hash]
|
77
|
+
# @option args [String] :base
|
78
|
+
# @option args [String] :overlay
|
79
|
+
# @option args [String] :target
|
80
|
+
# @return [TrueClass]
|
81
|
+
def validate!(args)
|
82
|
+
[:base, :overlay, :target].each do |required|
|
83
|
+
unless(args[required])
|
84
|
+
raise ArgumentError.new "Missing required argument: #{required}"
|
85
|
+
end
|
86
|
+
unless(File.directory?(args[required]))
|
87
|
+
raise TypeError.new "Provided argument is not a valid directory for #{required}: #{args[required]}"
|
88
|
+
end
|
56
89
|
end
|
90
|
+
true
|
57
91
|
end
|
92
|
+
|
58
93
|
end
|
59
94
|
end
|
60
95
|
end
|
@@ -1,84 +1,128 @@
|
|
1
|
-
require 'elecksee
|
1
|
+
require 'elecksee'
|
2
2
|
|
3
3
|
class Lxc
|
4
|
+
module Storage
|
5
|
+
# Virtual device backed storage
|
6
|
+
class VirtualDevice
|
4
7
|
|
5
|
-
|
8
|
+
include Helpers
|
6
9
|
|
7
|
-
|
10
|
+
# @return [String] storage name (usually container name)
|
11
|
+
attr_reader :name
|
12
|
+
# @return [String] path to temporary directory
|
13
|
+
attr_reader :tmp_dir
|
14
|
+
# @return [Integer] device size
|
15
|
+
attr_reader :size
|
16
|
+
# @return [TrueClass, FalseClass] use tmpfs
|
17
|
+
attr_reader :tmp_fs
|
18
|
+
# @return [String] file system to format (defaults ext4)
|
19
|
+
attr_reader :fs_type
|
8
20
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
# Create new instance
|
22
|
+
#
|
23
|
+
# @param name [String] generally container name
|
24
|
+
# @param args [Hash]
|
25
|
+
# @option args [String] :tmp_dir temporary directory
|
26
|
+
# @option args [Integer] :size size of device
|
27
|
+
# @option args [String] :fs_type file system to format
|
28
|
+
# @option args [TrueClass, FalseClass] :tmp_fs
|
29
|
+
def initialize(name, args={})
|
30
|
+
@name = name
|
31
|
+
@tmp_dir = args[:tmp_dir] || '/tmp/lxc/ephemerals'
|
32
|
+
@size = args[:size] || 2000
|
33
|
+
@fs_type = args[:fs_type] || 'ext4'
|
34
|
+
@tmp_fs = !!args[:tmp_fs]
|
35
|
+
@fs_type = 'tmpfs' if @tmp_fs
|
36
|
+
create
|
37
|
+
end
|
24
38
|
|
25
|
-
|
26
|
-
|
27
|
-
|
39
|
+
# @return [String] path to device
|
40
|
+
def device_path
|
41
|
+
tmp_fs ? :none : File.join(tmp_dir, 'virt-imgs', name)
|
42
|
+
end
|
28
43
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
44
|
+
# @return [String] path to mount
|
45
|
+
def mount_path
|
46
|
+
File.join(tmp_dir, 'virt-mnts', name)
|
47
|
+
end
|
48
|
+
alias_method :target_path, :mount_path
|
33
49
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
50
|
+
# Create the storage
|
51
|
+
#
|
52
|
+
# @return [TrueClass, FalseClass]
|
53
|
+
def create
|
54
|
+
make_directories!
|
55
|
+
unless(tmp_fs)
|
56
|
+
command("dd if=/dev/zero of=#{@device_path} bs=1k seek=#{sive}k count=1 > /dev/null")
|
57
|
+
command("echo \"y\" | mkfs -t #{fs_type} #{size} > /dev/null")
|
58
|
+
true
|
59
|
+
else
|
60
|
+
false
|
61
|
+
end
|
39
62
|
end
|
40
|
-
end
|
41
63
|
|
42
|
-
|
43
|
-
|
44
|
-
|
64
|
+
# @return [TrueClass, FalseClass] device currently mounted
|
65
|
+
def mounted?
|
66
|
+
command("mount").stdout.include?(mount_path)
|
67
|
+
end
|
45
68
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
69
|
+
# @return [TrueClass, FalseClass] mount device
|
70
|
+
def mount
|
71
|
+
unless(mounted?)
|
72
|
+
command("mount -t #{fs_type}#{mount_options} #{device_path} #{mount_path}", :sudo => true)
|
73
|
+
true
|
74
|
+
else
|
75
|
+
false
|
76
|
+
end
|
50
77
|
end
|
51
|
-
end
|
52
78
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
79
|
+
# @return [TrueClass, FalseClass] unmount device
|
80
|
+
def unmount
|
81
|
+
if(mounted?)
|
82
|
+
command("umount #{mount_path}", :sudo => true)
|
83
|
+
true
|
84
|
+
else
|
85
|
+
false
|
86
|
+
end
|
57
87
|
end
|
58
|
-
end
|
59
88
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
89
|
+
# Destroy the storage device
|
90
|
+
#
|
91
|
+
# @return [TrueClass]
|
92
|
+
def destroy
|
93
|
+
unmount
|
94
|
+
unless(device_path == :none)
|
95
|
+
File.delete(device_path) if File.file?(device_path)
|
96
|
+
FileUtils.rm_rf(device_path) if File.directory?(device_path)
|
97
|
+
end
|
98
|
+
unless(mount_path == :none)
|
99
|
+
if(File.directory?(mount_path))
|
100
|
+
FileUtils.rmdir(mount_path)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
true
|
65
104
|
end
|
66
|
-
FileUtils.rmdir(mount_path) if File.directory?(mount_path) unless mount_path == :none
|
67
|
-
end
|
68
105
|
|
69
|
-
|
106
|
+
private
|
70
107
|
|
71
|
-
|
72
|
-
|
73
|
-
|
108
|
+
# @return [String] options for device mount
|
109
|
+
def mount_options
|
110
|
+
' -o loop' unless tmp_fs
|
111
|
+
end
|
74
112
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
113
|
+
# Create required directories
|
114
|
+
#
|
115
|
+
# @return [TrueClass]
|
116
|
+
def make_directories!
|
117
|
+
[device_path, mount_path].each do |path|
|
118
|
+
next if path == :none
|
119
|
+
unless(File.directory?(path))
|
120
|
+
FileUtils.mkdir_p(path)
|
121
|
+
end
|
80
122
|
end
|
123
|
+
true
|
81
124
|
end
|
125
|
+
|
82
126
|
end
|
83
127
|
end
|
84
128
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'elecksee'
|
2
|
+
|
3
|
+
class Lxc
|
4
|
+
# Container storage backers
|
5
|
+
module Storage
|
6
|
+
|
7
|
+
autoload :CloneDirectory, 'elecksee/storage/overlay_directory'
|
8
|
+
autoload :OverlayDirectory, 'elecksee/storage/overlay_directory'
|
9
|
+
autoload :OverlayMount, 'elecksee/storage/overlay_mount'
|
10
|
+
autoload :VirtualDevice, 'elecksee/storage/virtual_device'
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
data/lib/elecksee/version.rb
CHANGED
data/lib/elecksee.rb
CHANGED
@@ -1 +1,14 @@
|
|
1
1
|
require 'elecksee/version'
|
2
|
+
|
3
|
+
# LXC interface
|
4
|
+
class Lxc
|
5
|
+
autoload :Clone, 'elecksee/clone'
|
6
|
+
autoload :Ephemeral, 'elecksee/ephemeral'
|
7
|
+
autoload :Helpers, 'elecksee/helpers'
|
8
|
+
autoload :CommandFailed, 'elecksee/helpers'
|
9
|
+
autoload :Timeout,'elecksee/helpers'
|
10
|
+
autoload :CommandResult, 'elecksee/helpers'
|
11
|
+
autoload :Storage, 'elecksee/storage'
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'elecksee/lxc'
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elecksee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Chris Roberts
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-01-17 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: childprocess
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
28
|
+
name: rye
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: LXC helpers
|
@@ -50,49 +45,47 @@ executables:
|
|
50
45
|
extensions: []
|
51
46
|
extra_rdoc_files: []
|
52
47
|
files:
|
48
|
+
- CHANGELOG.md
|
49
|
+
- CONTRIBUTING.md
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- bin/lxc-awesome-ephemeral
|
53
53
|
- elecksee.gemspec
|
54
|
+
- lib/elecksee.rb
|
54
55
|
- lib/elecksee/clone.rb
|
55
|
-
- lib/elecksee/
|
56
|
-
- lib/elecksee/
|
56
|
+
- lib/elecksee/ephemeral.rb
|
57
|
+
- lib/elecksee/helpers.rb
|
57
58
|
- lib/elecksee/helpers/copies.rb
|
58
59
|
- lib/elecksee/helpers/options.rb
|
59
|
-
- lib/elecksee/
|
60
|
-
- lib/elecksee/
|
60
|
+
- lib/elecksee/lxc.rb
|
61
|
+
- lib/elecksee/lxc_file_config.rb
|
62
|
+
- lib/elecksee/storage.rb
|
63
|
+
- lib/elecksee/storage/overlay_directory.rb
|
61
64
|
- lib/elecksee/storage/overlay_mount.rb
|
62
65
|
- lib/elecksee/storage/virtual_device.rb
|
63
|
-
- lib/elecksee/
|
64
|
-
- lib/elecksee/ephemeral.rb
|
65
|
-
- lib/elecksee/lxc.rb
|
66
|
-
- lib/elecksee.rb
|
67
|
-
- Gemfile
|
68
|
-
- README.md
|
69
|
-
- LICENSE
|
70
|
-
- bin/lxc-awesome-ephemeral
|
71
|
-
- CHANGELOG.md
|
72
|
-
- Gemfile.lock
|
66
|
+
- lib/elecksee/version.rb
|
73
67
|
homepage: http://github.com/chrisroberts/elecksee
|
74
68
|
licenses: []
|
69
|
+
metadata: {}
|
75
70
|
post_install_message:
|
76
71
|
rdoc_options: []
|
77
72
|
require_paths:
|
78
73
|
- lib
|
79
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
75
|
requirements:
|
82
|
-
- -
|
76
|
+
- - ">="
|
83
77
|
- !ruby/object:Gem::Version
|
84
78
|
version: '0'
|
85
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
-
none: false
|
87
80
|
requirements:
|
88
|
-
- -
|
81
|
+
- - ">="
|
89
82
|
- !ruby/object:Gem::Version
|
90
83
|
version: '0'
|
91
84
|
requirements: []
|
92
85
|
rubyforge_project:
|
93
|
-
rubygems_version:
|
86
|
+
rubygems_version: 2.2.2
|
94
87
|
signing_key:
|
95
|
-
specification_version:
|
88
|
+
specification_version: 4
|
96
89
|
summary: LXC helpers
|
97
90
|
test_files: []
|
98
91
|
has_rdoc:
|
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
elecksee (1.0.21)
|
5
|
-
mixlib-shellout
|
6
|
-
net-ssh
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
childprocess (0.3.9)
|
12
|
-
ffi (~> 1.0, >= 1.0.11)
|
13
|
-
ffi (1.9.3)
|
14
|
-
mixlib-shellout (1.3.0)
|
15
|
-
net-ssh (2.7.0)
|
16
|
-
|
17
|
-
PLATFORMS
|
18
|
-
ruby
|
19
|
-
|
20
|
-
DEPENDENCIES
|
21
|
-
childprocess
|
22
|
-
elecksee!
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'chef/mash'
|
2
|
-
require 'chef/json_compat'
|
3
|
-
|
4
|
-
class Lxc
|
5
|
-
class Knife
|
6
|
-
class Config
|
7
|
-
|
8
|
-
attr_reader :base_path
|
9
|
-
attr_reader :store
|
10
|
-
|
11
|
-
def initialize(args={})
|
12
|
-
|
13
|
-
|
14
|
-
def initialize(path='/etc/knife-lxc/config.json')
|
15
|
-
if(File.exists?(path))
|
16
|
-
@base_path = path
|
17
|
-
@store = Chef::JSONCompat.from_json(File.read(path))
|
18
|
-
else
|
19
|
-
raise ArgumentError.new("Provided path is not valid: #{path}")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def [](k)
|
24
|
-
@store[k]
|
25
|
-
end
|
26
|
-
|
27
|
-
def
|
28
|
-
|
29
|
-
def used_addresses
|
30
|
-
end
|
31
|
-
|
32
|
-
def available_addresses
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|