testlab 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -16,3 +16,5 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  *log
19
+ Vagrantfile
20
+ testlab/
data/README.md CHANGED
@@ -14,8 +14,16 @@ A framework for building lightweight virtual infrastructure using LXC
14
14
  * Latest Vagrant Package (non-gem version)
15
15
  * Ubuntu 13.04 Server 64-bit (Raring) Base Box - https://github.com/zpatten/raring64
16
16
 
17
+ # EXAMPLE USE
18
+
19
+ * See the `testlab-repo` - https://github.com/zpatten/testlab-repo
20
+
17
21
  # RESOURCES
18
22
 
23
+ IRC:
24
+
25
+ * #jovelabs on irc.freenode.net
26
+
19
27
  Documentation:
20
28
 
21
29
  * http://zpatten.github.io/testlab/
data/bin/tl ADDED
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gli'
3
+ require 'testlab'
4
+
5
+ include GLI::App
6
+
7
+ program_desc %(TestLab #{TestLab::VERSION} - A framework for building lightweight virtual infrastructure using LXC)
8
+
9
+ version Testlab::VERSION
10
+
11
+ # desc 'Describe some switch here'
12
+ # switch [:s,:switch]
13
+
14
+ # desc 'Describe some flag here'
15
+ # default_value 'the default'
16
+ # arg_name 'The name of the argument'
17
+ # flag [:f,:flagname]
18
+
19
+ # desc 'Manage the test lab'
20
+ # arg_name 'Describe arguments to lab here'
21
+ # command :lab do |c|
22
+
23
+ # # c.desc 'Describe a switch to lab'
24
+ # # c.switch :s
25
+
26
+ # # c.desc 'Describe a flag to lab'
27
+ # # c.default_value 'default'
28
+ # # c.flag :f
29
+ # # c.action do |global_options,options,args|
30
+
31
+ # # # Your command logic here
32
+
33
+ # # # If you have any errors, just raise them
34
+ # # # raise "that command made no sense"
35
+
36
+ # # puts "lab command ran"
37
+ # # end
38
+ # end
39
+
40
+ desc 'Create the test lab'
41
+ command :create do |create|
42
+ create.action do |global_options,options,args|
43
+ @testlab.create
44
+ end
45
+ end
46
+
47
+ desc 'Destroy the test lab'
48
+ command :destroy do |destroy|
49
+ destroy.action do |global_options,options,args|
50
+ @testlab.destroy
51
+ end
52
+ end
53
+
54
+ desc 'Online the test lab'
55
+ command :up do |up|
56
+ up.action do |global_options,options,args|
57
+ @testlab.up
58
+ end
59
+ end
60
+
61
+ desc 'Offline the test lab'
62
+ command :down do |down|
63
+ down.action do |global_options,options,args|
64
+ @testlab.down
65
+ end
66
+ end
67
+
68
+ desc 'Setup the test lab infrastructure'
69
+ command :setup do |setup|
70
+ setup.action do |global_options,options,args|
71
+ @testlab.setup
72
+ end
73
+ end
74
+
75
+ desc 'Teardown the test lab infrastructure'
76
+ command :teardown do |teardown|
77
+ teardown.action do |global_options,options,args|
78
+ @testlab.teardown
79
+ end
80
+ end
81
+
82
+ desc 'Display information on the status of the test lab'
83
+ command :status do |status|
84
+ status.action do |global_options,options,args|
85
+ @testlab.status
86
+ end
87
+ end
88
+
89
+ desc 'Manage nodes'
90
+ arg_name 'Describe arguments to node here'
91
+ command :node do |c|
92
+
93
+ c.desc 'Node ID'
94
+ c.flag [:i, :id]
95
+
96
+ c.desc 'Open an SSH console to a node'
97
+ c.command :ssh do |ssh|
98
+ ssh.action do |global_options,options,args|
99
+ help_now!('id is required') if options[:id].nil?
100
+
101
+ node = @testlab.nodes.select{ |n| n.id.to_sym == options[:id].to_sym }.first
102
+ node.ssh.console
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ desc 'Manage networks'
109
+ arg_name 'Describe arguments to network here'
110
+ command :network do |c|
111
+ c.action do |global_options,options,args|
112
+ puts "network command ran"
113
+ end
114
+ end
115
+
116
+ desc 'Manage containers'
117
+ arg_name 'Describe arguments to container here'
118
+ command :container do |c|
119
+
120
+ c.desc 'Container ID'
121
+ c.flag [:i, :id]
122
+
123
+ c.desc 'Open an SSH console to a container'
124
+ c.command :ssh do |ssh|
125
+ ssh.action do |global_options,options,args|
126
+ help_now!('id is required') if options[:id].nil?
127
+
128
+ container = @testlab.containers.select{ |n| n.id.to_sym == options[:id].to_sym }.first
129
+ container.ssh.console
130
+ end
131
+ end
132
+
133
+ end
134
+
135
+ pre do |global,command,options,args|
136
+ # Pre logic here
137
+ # Return true to proceed; false to abort and not call the
138
+ # chosen command
139
+ # Use skips_pre before a command to skip this block
140
+ # on that command only
141
+
142
+ log_file = File.join(Dir.pwd, "testlab.log")
143
+ @logger = ZTK::Logger.new(log_file)
144
+ @ui = ZTK::UI.new(:logger => @logger)
145
+ @testlab = TestLab.new(:ui => @ui)
146
+
147
+ message = TestLab::Utility.format_message("TestLab v#{TestLab::VERSION} Loaded".black.bold)
148
+ @testlab.ui.stdout.puts(message)
149
+
150
+ true
151
+ end
152
+
153
+ post do |global,command,options,args|
154
+ # Post logic here
155
+ # Use skips_post before a command to skip this
156
+ # block on that command only
157
+ end
158
+
159
+ on_error do |exception|
160
+ # Error logic here
161
+ # return false to skip default error handling
162
+ puts(["EXCEPTION:".red.bold, exception.inspect.red].join(' '))
163
+
164
+ false
165
+ end
166
+
167
+ exit run(ARGV)
@@ -7,40 +7,48 @@ class TestLab
7
7
  def create
8
8
  @ui.logger.debug { "Container Create: #{self.id} " }
9
9
 
10
- self.domain ||= self.node.labfile.config[:domain]
11
- self.distro ||= "ubuntu"
12
- self.release ||= "precise"
10
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Create', :green)) do
11
+ self.domain ||= self.node.labfile.config[:domain]
12
+ self.distro ||= "ubuntu"
13
+ self.release ||= "precise"
13
14
 
14
- self.arch ||= detect_arch
15
+ self.arch ||= detect_arch
15
16
 
16
- self.lxc.config.clear
17
- self.lxc.config['lxc.utsname'] = self.id
18
- self.lxc.config['lxc.arch'] = self.arch
19
- self.lxc.config.networks = build_lxc_network_conf(self.interfaces)
20
- self.lxc.config.save
17
+ self.lxc.config.clear
18
+ self.lxc.config['lxc.utsname'] = self.id
19
+ self.lxc.config['lxc.arch'] = self.arch
20
+ self.lxc.config.networks = build_lxc_network_conf(self.interfaces)
21
+ self.lxc.config.save
21
22
 
22
- self.lxc.create(*create_args)
23
+ self.lxc.create(*create_args)
24
+ end
23
25
  end
24
26
 
25
27
  # Destroy the container
26
28
  def destroy
27
29
  @ui.logger.debug { "Container Destroy: #{self.id} " }
28
30
 
29
- self.lxc.destroy
31
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Destroy', :red)) do
32
+ self.lxc.destroy
33
+ end
30
34
  end
31
35
 
32
36
  # Start the container
33
37
  def up
34
38
  @ui.logger.debug { "Container Up: #{self.id} " }
35
39
 
36
- self.lxc.start
40
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Up', :green)) do
41
+ self.lxc.start
42
+ end
37
43
  end
38
44
 
39
45
  # Stop the container
40
46
  def down
41
47
  @ui.logger.debug { "Container Down: #{self.id} " }
42
48
 
43
- self.lxc.stop
49
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Down', :red)) do
50
+ self.lxc.stop
51
+ end
44
52
  end
45
53
 
46
54
  end
@@ -3,6 +3,7 @@ class TestLab
3
3
 
4
4
  module Interface
5
5
 
6
+ # Returns the IP of the container
6
7
  def ip
7
8
  TestLab::Utility.ip(self.primary_interface.last[:ip])
8
9
  end
@@ -12,21 +13,9 @@ class TestLab
12
13
  TestLab::Utility.cidr(self.primary_interface.last[:ip]).to_i
13
14
  end
14
15
 
16
+ # Returns a BIND PTR record
15
17
  def ptr
16
- octets = self.ip.split('.')
17
-
18
- result = case self.cidr
19
- when 0..7 then
20
- octets[-4,4]
21
- when 8..15 then
22
- octets[-3,3]
23
- when 16..23 then
24
- octets[-2,2]
25
- when 24..31 then
26
- octets[-1,1]
27
- end
28
-
29
- result.reverse.join('.')
18
+ TestLab::Utility.ptr(self.primary_interface.last[:ip])
30
19
  end
31
20
 
32
21
  def primary_interface
@@ -9,14 +9,30 @@ class TestLab
9
9
 
10
10
  self.create
11
11
  self.up
12
+
13
+ if (!@provisioner.nil? && @provisioner.respond_to?(:setup))
14
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Setup', :green)) do
15
+ @provisioner.setup(self)
16
+ end
17
+ end
18
+
19
+ true
12
20
  end
13
21
 
14
22
  # Container Teardown
15
23
  def teardown
16
24
  @ui.logger.debug { "Container Teardown: #{self.id} " }
17
25
 
26
+ if (!@provisioner.nil? && @provisioner.respond_to?(:teardown))
27
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Teardown', :red)) do
28
+ @provisioner.teardown(self)
29
+ end
30
+ end
31
+
18
32
  self.down
19
33
  self.destroy
34
+
35
+ true
20
36
  end
21
37
 
22
38
  end
@@ -29,6 +29,8 @@ class TestLab
29
29
 
30
30
  extend TestLab::Container::ClassMethods
31
31
 
32
+ include TestLab::Utility::Misc
33
+
32
34
  # Associations and Attributes
33
35
  belongs_to :node, :class_name => 'TestLab::Node'
34
36
 
@@ -38,6 +40,7 @@ class TestLab
38
40
  attribute :domain
39
41
 
40
42
  attribute :user
43
+ attribute :passwd
41
44
  attribute :keys
42
45
 
43
46
  attribute :interfaces
@@ -53,7 +56,7 @@ class TestLab
53
56
  super(*args)
54
57
 
55
58
  @ui = TestLab.ui
56
- @provisioner = self.provisioner.new(self.config) if !self.provisioner.nil?
59
+ @provisioner = self.provisioner.new(self.config, @ui) if !self.provisioner.nil?
57
60
  end
58
61
 
59
62
  end
@@ -7,28 +7,36 @@ class TestLab
7
7
  def create
8
8
  @ui.logger.debug { "Network Create: #{self.id} " }
9
9
 
10
- self.node.ssh.exec(%(sudo brctl addbr #{self.bridge}), :silence => true, :ignore_exit_status => true)
10
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Create', :green)) do
11
+ self.node.ssh.exec(%(sudo brctl addbr #{self.bridge}), :silence => true, :ignore_exit_status => true)
12
+ end
11
13
  end
12
14
 
13
15
  # Destroy the network
14
16
  def destroy
15
17
  @ui.logger.debug { "Network Destroy: #{self.id} " }
16
18
 
17
- self.node.ssh.exec(%(sudo brctl delbr #{self.bridge}), :silence => true, :ignore_exit_status => true)
19
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Destroy', :red)) do
20
+ self.node.ssh.exec(%(sudo brctl delbr #{self.bridge}), :silence => true, :ignore_exit_status => true)
21
+ end
18
22
  end
19
23
 
20
24
  # Start the network
21
25
  def up
22
26
  @ui.logger.debug { "Network Up: #{self.id} " }
23
27
 
24
- self.node.ssh.exec(%(sudo ifconfig #{self.bridge} #{self.ip} up), :silence => true, :ignore_exit_status => true)
28
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Up', :green)) do
29
+ self.node.ssh.exec(%(sudo ifconfig #{self.bridge} #{self.ip} up), :silence => true, :ignore_exit_status => true)
30
+ end
25
31
  end
26
32
 
27
33
  # Stop the network
28
34
  def down
29
35
  @ui.logger.debug { "Network Down: #{self.id} " }
30
36
 
31
- self.node.ssh.exec(%(sudo ifconfig #{self.bridge} down), :silence => true, :ignore_exit_status => true)
37
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Down', :red)) do
38
+ self.node.ssh.exec(%(sudo ifconfig #{self.bridge} down), :silence => true, :ignore_exit_status => true)
39
+ end
32
40
  end
33
41
 
34
42
  end
@@ -23,6 +23,8 @@ class TestLab
23
23
 
24
24
  extend TestLab::Network::ClassMethods
25
25
 
26
+ include TestLab::Utility::Misc
27
+
26
28
  # Associations and Attributes
27
29
  belongs_to :node, :class_name => 'TestLab::Node'
28
30
 
@@ -35,7 +37,7 @@ class TestLab
35
37
  def initialize(*args)
36
38
  super(*args)
37
39
 
38
- @ui = TestLab.ui
40
+ @ui = TestLab.ui
39
41
  end
40
42
 
41
43
  end
@@ -79,9 +79,11 @@ class TestLab
79
79
 
80
80
  def bind_install
81
81
  self.ssh.exec(%(sudo apt-get -y install bind9))
82
+ self.ssh.exec(%(sudo rm -fv /etc/bind/{*.arpa,*.zone,*.conf*}))
82
83
  end
83
84
 
84
85
  def bind_reload
86
+ self.ssh.exec(%(sudo chown -Rv bind:bind /etc/bind))
85
87
  self.ssh.exec(%(sudo rndc reload))
86
88
  end
87
89
 
@@ -14,6 +14,8 @@ class TestLab
14
14
  # Calls the specified method on all the objects supplied
15
15
  def call_methods(objects, method_name)
16
16
  objects.each do |object|
17
+ # @ui.stdout.puts(format_message(format_object(object, (method_name == :setup ? :green : :red))))
18
+
17
19
  if object.respond_to?(method_name)
18
20
  object.send(method_name)
19
21
  end
@@ -30,14 +32,18 @@ class TestLab
30
32
  def setup
31
33
  @ui.logger.debug { "Node Setup: #{self.id} " }
32
34
 
33
- node_setup
35
+ # @ui.stdout.puts(format_message(format_object(self, :green)))
34
36
 
35
- if self.components.include?('resolv')
36
- build_resolv_conf
37
- end
37
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Setup', :green)) do
38
+ node_setup
38
39
 
39
- if self.components.include?('bind')
40
- bind_setup
40
+ if self.components.include?('resolv')
41
+ build_resolv_conf
42
+ end
43
+
44
+ if self.components.include?('bind')
45
+ bind_setup
46
+ end
41
47
  end
42
48
 
43
49
  call_collections([self.networks, self.routers, self.containers], :setup)
@@ -53,8 +59,13 @@ class TestLab
53
59
  def teardown
54
60
  @ui.logger.debug { "Node Teardown: #{self.id} " }
55
61
 
62
+ # @ui.stdout.puts(format_message(format_object(self, :red)))
63
+
56
64
  call_collections([self.containers, self.routers, self.networks], :teardown)
57
65
 
66
+ please_wait(:ui => @ui, :message => format_object_action(self, 'Teardown', :red)) do
67
+ end
68
+
58
69
  true
59
70
  end
60
71
 
@@ -31,7 +31,11 @@ class TestLab
31
31
 
32
32
  c.host_name = container.ip
33
33
  c.user = (container.user || "ubuntu")
34
- c.keys = container.keys
34
+ if container.keys.nil?
35
+ c.password = (container.passwd || "ubuntu")
36
+ else
37
+ c.keys = container.keys
38
+ end
35
39
  end
36
40
  end
37
41
  @container_ssh[name]
data/lib/testlab/node.rb CHANGED
@@ -10,6 +10,7 @@ class TestLab
10
10
  STATUS_KEYS = %w(id instance_id state user ip port provider con net rtr).map(&:to_sym)
11
11
 
12
12
  # Sub-Modules
13
+ autoload :Actions, 'testlab/node/actions'
13
14
  autoload :Bind, 'testlab/node/bind'
14
15
  autoload :ClassMethods, 'testlab/node/class_methods'
15
16
  autoload :Lifecycle, 'testlab/node/lifecycle'
@@ -19,6 +20,7 @@ class TestLab
19
20
  autoload :SSH, 'testlab/node/ssh'
20
21
  autoload :Status, 'testlab/node/status'
21
22
 
23
+ include TestLab::Node::Actions
22
24
  include TestLab::Node::Bind
23
25
  include TestLab::Node::Lifecycle
24
26
  include TestLab::Node::LXC
@@ -29,6 +31,8 @@ class TestLab
29
31
 
30
32
  extend TestLab::Node::ClassMethods
31
33
 
34
+ include TestLab::Utility::Misc
35
+
32
36
  # Associations and Attributes
33
37
  belongs_to :labfile, :class_name => 'TestLab::Lab'
34
38
 
@@ -45,7 +49,7 @@ class TestLab
45
49
  super(*args)
46
50
 
47
51
  @ui = TestLab.ui
48
- @provider = self.provider.new(self.config)
52
+ @provider = self.provider.new(self.config, @ui)
49
53
  end
50
54
 
51
55
  end
@@ -33,7 +33,7 @@ class TestLab
33
33
  ################################################################################
34
34
 
35
35
  def initialize(config={}, ui=nil)
36
- @config = config
36
+ @config = (config || Hash.new)
37
37
  @ui = (ui || TestLab.ui)
38
38
 
39
39
  # ensure our vagrant key is there
@@ -11,10 +11,16 @@ class TestLab
11
11
  class Chef
12
12
 
13
13
  def initialize(config={}, ui=nil)
14
- @config = config
14
+ @config = (config || Hash.new)
15
15
  @ui = (ui || TestLab.ui)
16
16
  end
17
17
 
18
+ def setup(container)
19
+ end
20
+
21
+ def teardown(container)
22
+ end
23
+
18
24
  end
19
25
 
20
26
  end
@@ -9,10 +9,27 @@ class TestLab
9
9
  #
10
10
  # @author Zachary Patten <zachary@jovelabs.net>
11
11
  class Shell
12
+ require 'tempfile'
12
13
 
13
14
  def initialize(config={}, ui=nil)
14
- @config = config
15
- @ui = (ui || TestLab.ui)
15
+ @config = (config || Hash.new)
16
+ @ui = (ui || TestLab.ui)
17
+
18
+ @config[:shell] ||= "/bin/bash"
19
+ end
20
+
21
+ def setup(container)
22
+ if !@config[:setup].nil?
23
+ tempfile = Tempfile.new("bootstrap")
24
+ container.node.ssh.file(:target => File.join(container.lxc.fs_root, tempfile.path), :chmod => '0777', :chown => 'root:root') do |file|
25
+ file.puts(@config[:setup])
26
+ end
27
+ container.lxc.attach(@config[:shell], tempfile.path)
28
+ end
29
+ end
30
+
31
+ def teardown(container)
32
+ # NOOP
16
33
  end
17
34
 
18
35
  end
@@ -8,8 +8,10 @@ class TestLab
8
8
  # @author Zachary Patten <zachary@jovelabs.net>
9
9
  module Utility
10
10
  autoload :CIDR, 'testlab/utility/cidr'
11
+ autoload :Misc, 'testlab/utility/misc'
11
12
 
12
13
  extend TestLab::Utility::CIDR
14
+ extend TestLab::Utility::Misc
13
15
 
14
16
  end
15
17
 
@@ -1,6 +1,6 @@
1
1
  class TestLab
2
2
  unless const_defined?(:VERSION)
3
3
  # TestLab Gem Version
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
6
6
  end
data/lib/testlab.rb CHANGED
@@ -2,6 +2,11 @@ require 'ztk'
2
2
 
3
3
  require 'testlab/version'
4
4
 
5
+ # Monkey Patch the String class so we can have some easy ANSI methods
6
+ class String
7
+ include ZTK::ANSI
8
+ end
9
+
5
10
  # Top-Level LXC Class
6
11
  #
7
12
  # @author Zachary Patten <zachary@jovelabs.net>
@@ -20,6 +25,8 @@ class TestLab
20
25
  autoload :Router, 'testlab/router'
21
26
  autoload :Utility, 'testlab/utility'
22
27
 
28
+ include TestLab::Utility::Misc
29
+
23
30
  @@ui ||= nil
24
31
 
25
32
  def initialize(options={})
@@ -61,18 +68,18 @@ class TestLab
61
68
 
62
69
  def status
63
70
  if alive?
64
- @@ui.stdout.puts("NODES:")
65
- ZTK::Report.new(:ui => @@ui).spreadsheet(TestLab::Node.all, TestLab::Node::STATUS_KEYS) do |node|
71
+ @@ui.stdout.puts("NODES:".green.bold)
72
+ ZTK::Report.new(:ui => @@ui).list(TestLab::Node.all, TestLab::Node::STATUS_KEYS) do |node|
66
73
  OpenStruct.new(node.status)
67
74
  end
68
75
  @@ui.stdout.puts
69
- @@ui.stdout.puts("NETWORKS:")
70
- ZTK::Report.new(:ui => @@ui).spreadsheet(TestLab::Network.all, TestLab::Network::STATUS_KEYS) do |network|
76
+ @@ui.stdout.puts("NETWORKS:".green.bold)
77
+ ZTK::Report.new(:ui => @@ui).list(TestLab::Network.all, TestLab::Network::STATUS_KEYS) do |network|
71
78
  OpenStruct.new(network.status)
72
79
  end
73
80
  @@ui.stdout.puts
74
- @@ui.stdout.puts("CONTAINERS:")
75
- ZTK::Report.new(:ui => @@ui).spreadsheet(TestLab::Container.all, TestLab::Container::STATUS_KEYS) do |container|
81
+ @@ui.stdout.puts("CONTAINERS:".green.bold)
82
+ ZTK::Report.new(:ui => @@ui).list(TestLab::Container.all, TestLab::Container::STATUS_KEYS) do |container|
76
83
  OpenStruct.new(container.status)
77
84
  end
78
85
 
@@ -98,7 +105,6 @@ class TestLab
98
105
 
99
106
  # Proxy various method calls to our subordinate classes
100
107
  def node_method_proxy(method_name, *method_args)
101
- @@ui.logger.debug { "TestLab.#{method_name}" }
102
108
  TestLab::Node.all.map do |node|
103
109
  node.send(method_name.to_sym, *method_args)
104
110
  end
@@ -115,6 +121,10 @@ class TestLab
115
121
  end
116
122
  end
117
123
 
124
+ def ui
125
+ @@ui ||= ZTK::UI.new
126
+ end
127
+
118
128
  # Class Helpers
119
129
  class << self
120
130
 
data/testlab.gemspec CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
37
37
  spec.require_paths = ["lib"]
38
38
 
39
+ spec.add_dependency("gli")
39
40
  spec.add_dependency("lxc")
40
41
  spec.add_dependency("ztk")
41
42
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: testlab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-28 00:00:00.000000000 Z
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: gli
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: lxc
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -143,7 +159,7 @@ description: A framework for building lightweight virtual infrastructure using L
143
159
  email:
144
160
  - zachary@jovelabs.com
145
161
  executables:
146
- - testlab-console
162
+ - tl
147
163
  extensions: []
148
164
  extra_rdoc_files: []
149
165
  files:
@@ -157,7 +173,7 @@ files:
157
173
  - LICENSE
158
174
  - README.md
159
175
  - Rakefile
160
- - bin/testlab-console
176
+ - bin/tl
161
177
  - lib/testlab.rb
162
178
  - lib/testlab/container.rb
163
179
  - lib/testlab/container/actions.rb
@@ -223,7 +239,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
223
239
  version: '0'
224
240
  segments:
225
241
  - 0
226
- hash: 4469350422868766283
242
+ hash: 3639724075672475487
227
243
  required_rubygems_version: !ruby/object:Gem::Requirement
228
244
  none: false
229
245
  requirements:
@@ -232,7 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
248
  version: '0'
233
249
  segments:
234
250
  - 0
235
- hash: 4469350422868766283
251
+ hash: 3639724075672475487
236
252
  requirements: []
237
253
  rubyforge_project:
238
254
  rubygems_version: 1.8.25
data/bin/testlab-console DELETED
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'pry'
3
- require 'testlab'
4
-
5
- tl = TestLab.new
6
-
7
- ##
8
- #
9
- # Welcome to the Cucumber-Chef pry console!
10
- #
11
- ##
12
- binding.pry