danarchy_sys 0.2.10

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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +21 -0
  7. data/README.txt +86 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +6 -0
  10. data/bin/danarchy_sys +4 -0
  11. data/bin/setup +18 -0
  12. data/bin/setup.rb +86 -0
  13. data/danarchy_sys.gemspec +38 -0
  14. data/lib/danarchy_sys.rb +16 -0
  15. data/lib/danarchy_sys/aws.rb +9 -0
  16. data/lib/danarchy_sys/aws/compute.rb +13 -0
  17. data/lib/danarchy_sys/cli.rb +63 -0
  18. data/lib/danarchy_sys/cli/instance_manager.rb +130 -0
  19. data/lib/danarchy_sys/cli/instance_manager/instance_status.rb +50 -0
  20. data/lib/danarchy_sys/cli/instance_manager/prompts_create_instance.rb +182 -0
  21. data/lib/danarchy_sys/cli/menus.rb +60 -0
  22. data/lib/danarchy_sys/cli/providers.rb +33 -0
  23. data/lib/danarchy_sys/config.rb +66 -0
  24. data/lib/danarchy_sys/helpers.rb +61 -0
  25. data/lib/danarchy_sys/openstack.rb +9 -0
  26. data/lib/danarchy_sys/openstack/compute.rb +59 -0
  27. data/lib/danarchy_sys/openstack/compute/flavors.rb +47 -0
  28. data/lib/danarchy_sys/openstack/compute/images.rb +52 -0
  29. data/lib/danarchy_sys/openstack/compute/instances.rb +120 -0
  30. data/lib/danarchy_sys/openstack/compute/keypairs.rb +84 -0
  31. data/lib/danarchy_sys/openstack/compute/tests/answer_yes.rb +7 -0
  32. data/lib/danarchy_sys/openstack/compute/tests/flavors_test.rb +10 -0
  33. data/lib/danarchy_sys/openstack/compute/tests/images_test.rb +14 -0
  34. data/lib/danarchy_sys/openstack/compute/tests/instance_create_test.rb +14 -0
  35. data/lib/danarchy_sys/openstack/compute/tests/instance_manage_test.rb +24 -0
  36. data/lib/danarchy_sys/openstack/compute/tests/keypairs_prompt_test.rb +12 -0
  37. data/lib/danarchy_sys/openstack/compute/tests/keypairs_test.rb +38 -0
  38. data/lib/danarchy_sys/openstack/compute/tests/manage_test.rb +16 -0
  39. data/lib/danarchy_sys/printformats.rb +49 -0
  40. data/lib/danarchy_sys/version.rb +3 -0
  41. metadata +151 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4971d607e81fc1716c7f5840dde2a638f859c461
4
+ data.tar.gz: 4a7daa5ca4fa3613cc8a7309a9b6a4c9615f9593
5
+ SHA512:
6
+ metadata.gz: a32d4ad9c820ef04a5f36c93670e9d1a2248586c23023502cb523b5b33be73b4c07eb88a9eba934e4540a88072377eeb1e43861fcc9110b91b7c5eac7eac13e8
7
+ data.tar.gz: e41daf8bb24a1b8484f68ad3c633fb55add7439c90e04b61056f523b6f2a5d2170f2dfbb16e19ad6f23c092200e9e4f1f82ab413fac1de6eba982b28a50874ab
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /config/*
11
+ /lib/danarchy_sys/tests/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.6
5
+ before_install: gem install bundler -v 1.13.6
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gem 'fog-openstack'
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 TODO: Write your name
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1,86 @@
1
+ # DanarchySys
2
+
3
+ Welcome to dAnarchy Systems! This gem will assist you in easing the setup of OpenStack instances for use of hosting various web applications.
4
+
5
+ ## Installation
6
+
7
+ Requires bundler to be installed already: 'gem install bundler'
8
+
9
+ Download danarchy_sys, 'cd' into its directory, then run 'sh bin/setup'.
10
+ This will run bundler and install the required gems. It will then prompt for a new OpenStack setup.
11
+
12
+ dAnarchySys config setup will be located at danarchy_sys/config/danarchysys.yml in YAML format like this:
13
+
14
+ :connections:
15
+ :your_connection:
16
+ :openstack_auth_url: http://openstack-provider.com:5000/v2.0/tokens
17
+ :openstack_username: openstack_username
18
+ :openstack_api_key: openstack_api_key
19
+ :openstack_tenant: openstack_tenant
20
+ :settings:
21
+ :ssh_key_path: PATH_TO_SSH_KEYS
22
+
23
+
24
+ ## Usage
25
+
26
+ Id Provider
27
+ 1. os_dreamcompute
28
+ Which provider should we use? (enter 'exit' to leave): 1
29
+ OpenStack -> os_dreamcompute
30
+ dAnarchy_sys main menu commands:
31
+ Enter 'help' to view available commands or 'exit' to leave.
32
+ 1. instance: Instance Manager
33
+ 2. keypair: Keypair Manager (Not yet implemented!)
34
+ 3. help: Outputs commands for current the menu level
35
+ 4. exit: Exit dAnarchy_sys
36
+ command ~: instance
37
+ Instance Manager: enter 'help' to view available commands or 'main' for the main menu.
38
+ Available instances:
39
+ Id Name State Image VCPUS RAM Disk KeyPair
40
+ 1. danarchysys_debian ACTIVE Debian-8 1 512 80 danarchy_sys
41
+ 2. cephmnt1 SHUTOFF Debian-8 2 4096 80 danarchy_sys
42
+ Enter an instance to manage or enter a name for a new instance: 1
43
+ Instance Manager commands:
44
+ Enter 'help' to view available commands or 'back' for the main menu.
45
+ 1. status: Current running status of instance
46
+ 2. connect: Connect to instance through SSH
47
+ 3. start: Start a currently stopped instance
48
+ 4. stop: Stop a currently running instance
49
+ 5. pause: Pause instance (to RAM)
50
+ 6. unpause: Unpause instance from paused state
51
+ 7. suspend: Suspend Instance (to disk)
52
+ 8. resume: Resume instance from suspended state
53
+ 9. create: Create a new instance
54
+ 10. delete: Delete this instance
55
+ Managing instance: danarchysys_debian Status: ACTIVE
56
+ danarchysys_debian ~: connect
57
+
58
+ The programs included with the Debian GNU/Linux system are free software;
59
+ the exact distribution terms for each program are described in the
60
+ individual files in /usr/share/doc/*/copyright.
61
+
62
+ Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
63
+ permitted by applicable law.
64
+ debian@danarchysys-debian:~$ lsb_release -a
65
+ No LSB modules are available.
66
+ Distributor ID: Debian
67
+ Description: Debian GNU/Linux 8.8 (jessie)
68
+ Release: 8.8
69
+ Codename: jessie
70
+
71
+ debian@danarchysys-debian:~$ exit
72
+ logout
73
+ Connection to 208.113.165.181 closed.
74
+ danarchysys_debian ~: exit
75
+ Exiting!
76
+
77
+
78
+ ## Contributing
79
+
80
+ Bug reports are welcome on GitHub at https://github.com/danarchy85/danarchy_sys.
81
+
82
+
83
+ ## License
84
+
85
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
86
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/danarchy_sys'
3
+ require_relative '../lib/danarchy_sys/cli'
4
+ require 'irb'
5
+
6
+ IRB.start
data/bin/danarchy_sys ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/danarchy_sys/cli'
3
+
4
+ DanarchySys::CLI.new
data/bin/setup ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
9
+ PATH=$(pwd)
10
+
11
+ if [[ $PATH =~ danarchy_sys/bin$ ]]; then
12
+ /usr/bin/ruby $PATH/setup.rb
13
+ elif [[ $PATH =~ danarchy_sys$ ]]; then
14
+ /usr/bin/ruby $PATH/bin/setup.rb
15
+ else
16
+ echo "Unable to find danarchy_sys/bin/setup.rb!"
17
+ echo "Please run it manually: /usr/bin/ruby danarchy_sys/bin/setup.rb"
18
+ fi
data/bin/setup.rb ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ require_relative '../lib/danarchy_sys'
4
+
5
+ # dAanarchySys config file setup
6
+ class DanarchySysConfig
7
+ def initialize
8
+ @config_mgr = ConfigMgr.new
9
+ end
10
+
11
+ def load_config
12
+ @config_mgr.load
13
+ end
14
+
15
+ def ssh_key_path
16
+ danarchysys_config = load_config
17
+
18
+ ssh_key_path = "#{File.expand_path('..', File.dirname(__FILE__))}/config/ssh"
19
+ FileUtils.mkdir_p(ssh_key_path) unless Dir.exist?(ssh_key_path)
20
+ danarchysys_config[:settings][:ssh_key_path] = ssh_key_path
21
+
22
+ @config_mgr.save(danarchysys_config)
23
+ end
24
+
25
+ def new_connection
26
+ danarchysys_config = load_config
27
+
28
+ if danarchysys_config[:connections].count.zero?
29
+ puts 'Creating a new configuration.'
30
+ else
31
+ puts 'Adding a new OpenStack connection to existing configuration.'
32
+ end
33
+
34
+ print 'Provider name: '
35
+ provider_name = gets.chomp
36
+ print "OpenStack Auth URL\t(Example: http://openstack-host.com:5000/v2.0/tokens)\nEnter URL: "
37
+ openstack_auth_url = gets.chomp
38
+ print 'OpenStack Username: '
39
+ openstack_username = gets.chomp
40
+ print 'OpenStack API Key: '
41
+ openstack_api_key = gets.chomp
42
+ print 'OpenStack Tenant ID: '
43
+ openstack_tenant = gets.chomp
44
+
45
+ danarchysys_config[:connections][provider_name.to_sym] = {
46
+ openstack_auth_url: openstack_auth_url,
47
+ openstack_username: openstack_username,
48
+ openstack_api_key: openstack_api_key,
49
+ openstack_tenant: openstack_tenant
50
+ }
51
+
52
+ @config_mgr.save(danarchysys_config)
53
+ end
54
+ end
55
+
56
+ config = DanarchySysConfig.new
57
+ danarchysys_config = config.load_config
58
+ puts 'Beginning danarchysys configuration setup.'
59
+
60
+ if danarchysys_config[:connections].count.zero?
61
+ config.new_connection
62
+ else
63
+ puts 'Available OpenStack Connections: '
64
+ danarchysys_config[:connections].each_key { |k| puts k }
65
+ end
66
+
67
+ continue = false
68
+ until continue == true
69
+ print 'Should we add another connection? (Y/N): '
70
+
71
+ if gets.chomp =~ /^y(es)?$/i
72
+ config.new_connection
73
+ else
74
+ continue = true
75
+ end
76
+ end
77
+
78
+ config.ssh_key_path
79
+
80
+ danarchysys_config = config.load_config
81
+
82
+ puts 'Available OpenStack Connections: '
83
+ danarchysys_config[:connections].each_key { |k| puts k }
84
+ puts "SSH key location: #{danarchysys_config[:settings][:ssh_key_path]}"
85
+ puts "Config saved to: #{File.expand_path('..', File.dirname(__FILE__))}/config/danarchysys.yml"
86
+ puts "dAnarchySys setup is finished. Run \'/usr/bin/ruby danarchy_sys/bin/danarchy_sys\' to begin!"
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'danarchy_sys/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "danarchy_sys"
8
+ spec.version = DanarchySys::VERSION
9
+ spec.authors = ["Dan James"]
10
+ spec.email = ["danheneise@me.com"]
11
+
12
+ spec.summary = %q{Facilitates the deployment and management of OpenStack.}
13
+ spec.description = %q{dAnarchy Sys is intended to be a platform for the management of cloud compute instances from initial setup through to the deployment of end-user software.}
14
+ spec.homepage = "https://github.com/danarchy85/danarchy_sys"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = "bin"
30
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_dependency "fog-openstack", "~> 0.1", ">=0.1.20"
34
+
35
+ spec.add_development_dependency "bundler", "~> 1.13"
36
+ spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rspec", "~> 3.0"
38
+ end
@@ -0,0 +1,16 @@
1
+
2
+ require 'fog/openstack'
3
+ require_relative 'danarchy_sys/version'
4
+ require_relative 'danarchy_sys/helpers'
5
+ require_relative 'danarchy_sys/config'
6
+ require_relative 'danarchy_sys/printformats'
7
+
8
+ module DanarchySys
9
+ module OpenStack
10
+ require_relative 'danarchy_sys/openstack'
11
+ end
12
+
13
+ module AWS
14
+ # Not yet implemented!
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+
2
+ require 'fog/aws'
3
+
4
+ module DanarchySys
5
+ module AWS
6
+ # Load AWS compute requirements
7
+ require_relative 'aws/compute'
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module DanarchySys
2
+ module AWS
3
+ class Compute
4
+ def initialize(provider)
5
+ config = ConfigMgr.new
6
+ danarchysys_config = config.load
7
+ connection = danarchysys_config[:connections][provider]
8
+ @settings = danarchysys_config[:settings]
9
+ @compute = Fog::Compute::AWS.new(connection)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,63 @@
1
+
2
+ require 'optparse'
3
+ require 'fog/openstack'
4
+ require_relative '../danarchy_sys'
5
+
6
+ module DanarchySys
7
+ class CLI
8
+ def initialize
9
+ require_relative 'cli/menus'
10
+ require_relative 'cli/providers'
11
+ require_relative 'cli/instance_manager'
12
+ # require_relative 'cli/keypair_manager'
13
+
14
+ provider = Providers.chooser
15
+ puts "OpenStack -> #{provider}"
16
+ @os_compute = DanarchySys::OpenStack::Compute.new provider
17
+ console
18
+ end
19
+
20
+ def instance_chooser
21
+ inst_mgr = InstanceManager.new(@os_compute)
22
+ instance = inst_mgr.chooser(@os_compute)
23
+
24
+ until instance != false
25
+ puts "\nReturning to Instance Chooser"
26
+ instance = inst_mgr.chooser(@os_compute)
27
+ end
28
+
29
+ menus('main')
30
+ puts "\nWorking with: #{instance.name}\tStatus: #{instance.state}"
31
+ console(instance.name)
32
+ end
33
+
34
+ def console
35
+ menu = Menus.numbered_menu('main')
36
+ Menus.print_menu('main')
37
+
38
+ loop do
39
+ print 'command ~: '
40
+ cmd = gets.chomp
41
+
42
+ next if cmd.empty?
43
+ if cmd =~ /^[0-9]*$/
44
+ menu[cmd.to_i].map { |k, v| cmd = k } if menu.keys.include? cmd.to_i
45
+ end
46
+
47
+ if cmd == 'instance'
48
+ InstanceManager.manager(@os_compute)
49
+ elsif cmd == 'keypair'
50
+ puts 'Keypair Manager not yet implemented!'
51
+ # Keypair.manager(@os_compute)
52
+ elsif cmd == 'help'
53
+ Menus.print_menu('main')
54
+ elsif cmd == 'exit'
55
+ abort('Exiting!')
56
+ else
57
+ Menus.print_menu('main')
58
+ puts "\nCommand \'#{cmd}\' not available. Enter a command from above."
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,130 @@
1
+ require_relative 'instance_manager/prompts_create_instance'
2
+ require_relative 'instance_manager/instance_status'
3
+
4
+ class InstanceManager
5
+ def self.manager(os_compute)
6
+ comp_inst = os_compute.compute_instances
7
+ puts 'Instance Manager: enter \'help\' to view available commands or \'main\' for the main menu.'
8
+ menu = Menus.numbered_menu('instance')
9
+ instance = false
10
+
11
+ loop do
12
+ while instance == false
13
+ instance = chooser(os_compute)
14
+ end
15
+
16
+ print "#{instance.name} ~: "
17
+ cmd = gets.chomp
18
+
19
+ next if cmd.empty?
20
+ abort('Exiting!') if cmd == 'exit'
21
+
22
+ if cmd =~ /^[0-9]*$/
23
+ menu[cmd.to_i].map { |k, v| cmd = k } if menu.keys.include? cmd.to_i
24
+ end
25
+
26
+ if cmd == 'help'
27
+ Menus.print_menu('instance')
28
+ elsif cmd == 'main'
29
+ return Menus.print_menu('main')
30
+ elsif cmd == 'chooser'
31
+ instance = chooser(os_compute)
32
+ elsif cmd == 'create'
33
+ PromptsCreateInstance.create_instance(os_compute, 'nil')
34
+ instance = chooser(os_compute)
35
+ elsif cmd == 'delete'
36
+ print "Are you sure you wish to delete instance: #{instance.name}? (this is permanent!) (Y/N): "
37
+ delete = comp_inst.delete_instance(instance.name) if gets.chomp =~ /^y(es)?$/i
38
+ if delete == true
39
+ puts "#{instance.name} has been deleted! Returning to the instance chooser."
40
+ instance = chooser(os_compute)
41
+ else
42
+ puts "#{instance.name} was not deleted!"
43
+ end
44
+ elsif cmd == 'status'
45
+ printf("%#{instance.name.size}s %0s %0s\n", instance.name, ' => ', instance.state)
46
+ elsif %w(connect pause unpause suspend resume start stop).include?(cmd.to_s)
47
+ if cmd == 'connect'
48
+ if instance.state == 'ACTIVE'
49
+ os_compute.compute_ssh(instance.name.to_s)
50
+ else
51
+ puts "Unable to connect: #{instance.name} is not running!"
52
+ end
53
+ else
54
+ response = comp_inst.send(cmd.to_s, instance.name.to_s)
55
+ # Need to recheck/wait for status update
56
+ printf("%#{instance.name.size}s %0s %0s\n", instance.name, ' => ', instance.state)
57
+ end
58
+ else
59
+ Menus.print_menu('instance')
60
+ puts "\nCommand \'#{cmd}\' not available. Enter a command from above."
61
+ end
62
+ end
63
+ end
64
+
65
+ def self.chooser(os_compute)
66
+ comp_inst = os_compute.compute_instances
67
+ instances = comp_inst.all_instances
68
+ instances_numhash = Helpers.objects_to_numhash(instances)
69
+ instance_name = 'nil'
70
+ instance = 'nil'
71
+
72
+ # Create a new instances if none exist
73
+ if instances_numhash.empty?
74
+ print 'No existing instances were found. Should we create a new one? (Y/N): '
75
+ abort('Exiting!') unless gets.chomp =~ /^y(es)?$/i
76
+ instance = PromptsCreateInstance.create_instance(os_compute, 'nil')
77
+ puts "Working with: #{instance.name}\tStatus: #{instance.state}"
78
+ return instance
79
+ end
80
+
81
+ # Display existing instances in numbered hash
82
+ fields = PrintFormats.printf_numhash_values(instances_numhash, [:name, :state])
83
+
84
+ puts 'Available instances:'
85
+ InstanceStatus.all_instances(os_compute, instances)
86
+
87
+ # Loop input until an existing instance is selected
88
+ print 'Enter an instance to manage or enter a name for a new instance: '
89
+
90
+ until Helpers.check_nested_hash_value(instances_numhash, :name, instance_name) == true
91
+ instance_name = gets.chomp
92
+
93
+ until instance_name.empty? == false
94
+ print 'Input was blank! Enter an instance or Id from above: '
95
+ instance_name = gets.chomp
96
+ end
97
+
98
+ abort('Exiting') if instance_name == 'exit'
99
+
100
+ # Accept instance Id as an entry
101
+ if instance_name =~ /^[0-9]*$/
102
+ until instances_numhash.keys.include?(instance_name.to_i)
103
+ print "#{instance_name} is not a valid Id. Enter an Id from above: "
104
+ instance_name = gets.chomp
105
+ end
106
+
107
+ instance_name = instances_numhash[instance_name.to_i][:name].to_s
108
+ end
109
+
110
+ unless Helpers.check_nested_hash_value(instances_numhash, :name, instance_name) == true
111
+ print "#{instance_name} is not a valid instance.
112
+ Should we create a new instance named #{instance_name}? (Y/N): "
113
+
114
+ if gets.chomp =~ /^y(es)?$/i
115
+ PromptsCreateInstance.create_instance(os_compute, instance_name)
116
+ instances_numhash = Helpers.objects_to_numhash(comp_inst.all_instances)
117
+ else
118
+ puts "Not creating new instance: #{instance_name}."
119
+ return false
120
+ end
121
+ end
122
+ end
123
+
124
+ instance = comp_inst.get_instance(instance_name)
125
+ status = instance.state
126
+ Menus.print_menu('instance')
127
+ puts "Managing instance: #{instance_name}\tStatus: #{status}"
128
+ instance
129
+ end
130
+ end