bin/tl in testlab-0.3.1 vs bin/tl in testlab-0.4.0

- old
+ new

@@ -25,57 +25,71 @@ include TestLab::Utility::Misc version TestLab::VERSION program_desc %(A framework for building lightweight virtual infrastructure using LXC) -program_long_desc %(Program Long Description) +# program_long_desc %(Program Long Description) sort_help :manually default_command :help +# LAB CREATE +############# desc 'Create the test lab' command :create do |create| create.action do |global_options,options,args| @testlab.create end end +# LAB DESTROY +############## desc 'Destroy the test lab' command :destroy do |destroy| destroy.action do |global_options,options,args| @testlab.destroy end end +# LAB ONLINE +############# desc 'Online the test lab' command :up do |up| up.action do |global_options,options,args| @testlab.up end end +# LAB OFFLINE +############## desc 'Offline the test lab' command :down do |down| down.action do |global_options,options,args| @testlab.down end end +# LAB SETUP +############ desc 'Setup the test lab infrastructure' command :setup do |setup| setup.action do |global_options,options,args| @testlab.setup end end +# LAB TEARDOWN +############### desc 'Teardown the test lab infrastructure' command :teardown do |teardown| teardown.action do |global_options,options,args| @testlab.teardown end end +# LAB STATUS +############# desc 'Display information on the status of the test lab' command :status do |status| status.action do |global_options,options,args| @testlab.ui.stdout.puts("\nNODES:".green.bold) commands[:node].commands[:status].execute({}, {}, []) @@ -86,18 +100,22 @@ @testlab.ui.stdout.puts("\nCONTAINERS:".green.bold) commands[:container].commands[:status].execute({}, {}, []) end end +# NODES +######## desc 'Manage nodes' arg_name 'Describe arguments to node here' command :node do |c| c.desc 'Node ID or Name' c.arg_name 'node' c.flag [:i, :id] + # NODE SSH + ########### c.desc 'Open an SSH console to a node' c.command :ssh do |ssh| ssh.action do |global_options,options,args| help_now!('id is required') if options[:id].nil? @@ -106,19 +124,23 @@ node.ssh.console end end + # NODE STATUS + ############## c.desc 'Display the status of node(s)' - c.long_desc 'Displays the status of all nodes or a single node if supplied via the id parameter.' + c.long_desc 'Displays the status of all nodes or a single node if supplied via the ID parameter.' c.command :status do |status| status.action do |global_options, options, args| if options[:id].nil? + # No ID supplied; show everything ZTK::Report.new(:ui => @testlab.ui).spreadsheet(@testlab.nodes, TestLab::Node::STATUS_KEYS) do |node| OpenStruct.new(node.status) end else + # ID supplied; show just that item node = @testlab.nodes.select{ |c| c.id.to_sym == options[:id].to_sym }.first node.nil? and raise TestLab::TestLabError, "We could not find the node you supplied!" ZTK::Report.new(:ui => @testlab.ui).list(node, TestLab::Node::STATUS_KEYS) do |node| OpenStruct.new(node.status) @@ -127,27 +149,38 @@ end end end +# NETWORKS +########### desc 'Manage networks' arg_name 'Describe arguments to network here' command :network do |c| c.desc 'Network ID or Name' c.arg_name 'network' c.flag [:i, :id] + # NETWORK STATUS + ################# c.desc 'Display the status of network(s)' - c.long_desc 'Displays the status of all networks or a single network if supplied via the id parameter.' + c.long_desc 'Displays the status of all networks or a single network if supplied via the ID parameter.' c.command :status do |status| status.action do |global_options, options, args| if options[:id].nil? - ZTK::Report.new(:ui => @testlab.ui).spreadsheet(@testlab.networks, TestLab::Network::STATUS_KEYS) do |network| - OpenStruct.new(network.status) + # No ID supplied; show everything + networks = @testlab.networks.delete_if{|n| n.node.dead? } + if networks.count == 0 + @testlab.ui.stderr.puts("You either have no networks defined or dead nodes!".yellow) + else + ZTK::Report.new(:ui => @testlab.ui).spreadsheet(networks, TestLab::Network::STATUS_KEYS) do |network| + OpenStruct.new(network.status) + end end else + # ID supplied; show just that item network = @testlab.networks.select{ |c| c.id.to_sym == options[:id].to_sym }.first network.nil? and raise TestLab::TestLabError, "We could not find the network you supplied!" ZTK::Report.new(:ui => @testlab.ui).list(network, TestLab::Network::STATUS_KEYS) do |network| OpenStruct.new(network.status) @@ -156,18 +189,22 @@ end end end +# CONTAINERS +############# desc 'Manage containers' arg_name 'Describe arguments to container here' command :container do |c| c.desc 'Container ID or Name' c.arg_name 'container' c.flag [:i, :id] + # CONTAINER SSH + ################ c.desc 'Open an SSH console to a container' c.command :ssh do |ssh| ssh.action do |global_options, options, args| help_now!('id is required') if options[:id].nil? @@ -176,34 +213,111 @@ container.ssh.console end end + # CONTAINER STATUS + ################### c.desc 'Display the status of container(s)' - c.long_desc 'Displays the status of all containers or a single container if supplied via the id parameter.' + c.long_desc <<-EOF +Displays the status of all containers or a single container if supplied via the ID parameter. +EOF c.command :status do |status| status.action do |global_options, options, args| if options[:id].nil? - ZTK::Report.new(:ui => @testlab.ui).spreadsheet(@testlab.containers, TestLab::Container::STATUS_KEYS) do |container| - OpenStruct.new(container.status) + # No ID supplied; show everything + containers = @testlab.containers.delete_if{ |c| c.node.dead? } + if containers.count == 0 + @testlab.ui.stderr.puts("You either have no containers defined or dead nodes!".yellow) + else + ZTK::Report.new(:ui => @testlab.ui).spreadsheet(containers, TestLab::Container::STATUS_KEYS.reject{|k| k == :fqdn}) do |container| + OpenStruct.new(container.status.reject{|k,v| k == :fqdn}) + end end else + # ID supplied; show just that item container = @testlab.containers.select{ |c| c.id.to_sym == options[:id].to_sym }.first container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!" ZTK::Report.new(:ui => @testlab.ui).list(container, TestLab::Container::STATUS_KEYS) do |container| OpenStruct.new(container.status) end end end end + # CONTAINER RECYCLE + #################### + c.desc 'Recycles a container' + c.long_desc <<-EOF +Recycles a container. The container is taken through a series of state changes to ensure it is pristine. + +The containers is cycled in this order: + +Down -> Destroy -> Create -> Up +EOF + c.command :recycle do |recycle| + recycle.action do |global_options, options, args| + if options[:id].nil? + help_now!('id is required') if options[:id].nil? + else + container = @testlab.containers.select{ |c| c.id.to_sym == options[:id].to_sym }.first + container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!" + + container.teardown + container.setup + end + end + end + + # CONTAINER SETUP + #################### + c.desc 'Setup a container' + c.long_desc <<-EOF +Setup a container. The container is created, started and provisioned. +EOF + c.command :setup do |setup| + setup.action do |global_options, options, args| + if options[:id].nil? + help_now!('id is required') if options[:id].nil? + else + container = @testlab.containers.select{ |c| c.id.to_sym == options[:id].to_sym }.first + container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!" + + container.setup + end + end + end + + # CONTAINER TEARDOWN + #################### + c.desc 'Teardown a container' + c.long_desc <<-EOF +Teardown a container. The container is offlined and destroyed. +EOF + c.command :teardown do |teardown| + teardown.action do |global_options, options, args| + if options[:id].nil? + help_now!('id is required') if options[:id].nil? + else + container = @testlab.containers.select{ |c| c.id.to_sym == options[:id].to_sym }.first + container.nil? and raise TestLab::TestLabError, "We could not find the container you supplied!" + + container.teardown + end + end + end + end +# ROUTES +######### desc 'Manage routes' command :route do |c| + # ROUTE ADD + ############ c.desc 'Add routes to lab networks' c.command :add do |add| add.action do |global_options,options,args| @testlab.nodes.each do |node| node.route_setup(:add) @@ -211,9 +325,11 @@ @testlab.ui.stdout.puts %x(netstat -nr | grep '#{node.ip}').strip end end end + # ROUTE DEL + ############ c.desc 'Delete routes to lab networks' c.command :del do |del| del.action do |global_options,options,args| @testlab.nodes.each do |node| node.route_setup(:del)