morpheus-cli 2.10.0 → 2.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/bin/morpheus +27 -32
  3. data/lib/morpheus/api/accounts_interface.rb +36 -47
  4. data/lib/morpheus/api/api_client.rb +141 -110
  5. data/lib/morpheus/api/app_templates_interface.rb +56 -72
  6. data/lib/morpheus/api/apps_interface.rb +111 -132
  7. data/lib/morpheus/api/auth_interface.rb +30 -0
  8. data/lib/morpheus/api/clouds_interface.rb +71 -76
  9. data/lib/morpheus/api/custom_instance_types_interface.rb +21 -46
  10. data/lib/morpheus/api/dashboard_interface.rb +10 -17
  11. data/lib/morpheus/api/deploy_interface.rb +60 -72
  12. data/lib/morpheus/api/deployments_interface.rb +53 -71
  13. data/lib/morpheus/api/groups_interface.rb +55 -45
  14. data/lib/morpheus/api/instance_types_interface.rb +19 -23
  15. data/lib/morpheus/api/instances_interface.rb +179 -177
  16. data/lib/morpheus/api/key_pairs_interface.rb +11 -17
  17. data/lib/morpheus/api/license_interface.rb +18 -23
  18. data/lib/morpheus/api/load_balancers_interface.rb +54 -69
  19. data/lib/morpheus/api/logs_interface.rb +25 -29
  20. data/lib/morpheus/api/options_interface.rb +13 -17
  21. data/lib/morpheus/api/provision_types_interface.rb +19 -22
  22. data/lib/morpheus/api/roles_interface.rb +75 -94
  23. data/lib/morpheus/api/security_group_rules_interface.rb +28 -37
  24. data/lib/morpheus/api/security_groups_interface.rb +39 -51
  25. data/lib/morpheus/api/servers_interface.rb +113 -115
  26. data/lib/morpheus/api/setup_interface.rb +31 -0
  27. data/lib/morpheus/api/task_sets_interface.rb +36 -38
  28. data/lib/morpheus/api/tasks_interface.rb +56 -69
  29. data/lib/morpheus/api/users_interface.rb +67 -76
  30. data/lib/morpheus/api/virtual_images_interface.rb +61 -61
  31. data/lib/morpheus/api/whoami_interface.rb +12 -15
  32. data/lib/morpheus/cli.rb +71 -60
  33. data/lib/morpheus/cli/accounts.rb +254 -315
  34. data/lib/morpheus/cli/alias_command.rb +219 -0
  35. data/lib/morpheus/cli/app_templates.rb +264 -272
  36. data/lib/morpheus/cli/apps.rb +608 -671
  37. data/lib/morpheus/cli/cli_command.rb +259 -21
  38. data/lib/morpheus/cli/cli_registry.rb +99 -14
  39. data/lib/morpheus/cli/clouds.rb +599 -372
  40. data/lib/morpheus/cli/config_file.rb +126 -0
  41. data/lib/morpheus/cli/credentials.rb +141 -117
  42. data/lib/morpheus/cli/dashboard_command.rb +48 -56
  43. data/lib/morpheus/cli/deployments.rb +254 -268
  44. data/lib/morpheus/cli/deploys.rb +150 -142
  45. data/lib/morpheus/cli/error_handler.rb +38 -0
  46. data/lib/morpheus/cli/groups.rb +551 -179
  47. data/lib/morpheus/cli/hosts.rb +862 -617
  48. data/lib/morpheus/cli/instance_types.rb +103 -95
  49. data/lib/morpheus/cli/instances.rb +1335 -1009
  50. data/lib/morpheus/cli/key_pairs.rb +82 -90
  51. data/lib/morpheus/cli/library.rb +498 -499
  52. data/lib/morpheus/cli/license.rb +83 -101
  53. data/lib/morpheus/cli/load_balancers.rb +314 -300
  54. data/lib/morpheus/cli/login.rb +66 -44
  55. data/lib/morpheus/cli/logout.rb +47 -46
  56. data/lib/morpheus/cli/mixins/accounts_helper.rb +69 -31
  57. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +106 -0
  58. data/lib/morpheus/cli/mixins/print_helper.rb +181 -17
  59. data/lib/morpheus/cli/mixins/provisioning_helper.rb +535 -458
  60. data/lib/morpheus/cli/mixins/whoami_helper.rb +2 -2
  61. data/lib/morpheus/cli/option_parser.rb +35 -0
  62. data/lib/morpheus/cli/option_types.rb +232 -192
  63. data/lib/morpheus/cli/recent_activity_command.rb +61 -65
  64. data/lib/morpheus/cli/remote.rb +446 -199
  65. data/lib/morpheus/cli/roles.rb +884 -906
  66. data/lib/morpheus/cli/security_group_rules.rb +213 -203
  67. data/lib/morpheus/cli/security_groups.rb +237 -192
  68. data/lib/morpheus/cli/shell.rb +338 -231
  69. data/lib/morpheus/cli/tasks.rb +326 -308
  70. data/lib/morpheus/cli/users.rb +457 -462
  71. data/lib/morpheus/cli/version.rb +1 -1
  72. data/lib/morpheus/cli/version_command.rb +16 -18
  73. data/lib/morpheus/cli/virtual_images.rb +526 -345
  74. data/lib/morpheus/cli/whoami.rb +125 -111
  75. data/lib/morpheus/cli/workflows.rb +338 -185
  76. data/lib/morpheus/formatters.rb +8 -1
  77. data/lib/morpheus/logging.rb +1 -1
  78. data/lib/morpheus/rest_client.rb +17 -8
  79. metadata +9 -3
  80. data/lib/morpheus/api/custom_instance_types.rb +0 -55
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 575e23105fe6df10494bb38dcdc54e02b582d3ac
4
- data.tar.gz: fb5e3ea23fc52347ecab160d92442029f6ea3ecb
3
+ metadata.gz: ad4ff693efbb10952b74f63eafd3ceacfe382d5e
4
+ data.tar.gz: f5fc0c7184848496e5fdcfedb6f08c38d0353c81
5
5
  SHA512:
6
- metadata.gz: 873500f5e460eaf1c1e56e5e223b3e1c52d83955786d7d4b5ed7642025e3001758a0dbdd5c6ca59cdf3b8385ffca0b473cf401d779a8166675f0c996d0ca6a1a
7
- data.tar.gz: 667d412138a4cb25766b8a55cea03cf20749caad2ad10d97ebd39ccf4da99d5830dd5b5d4ba629f6ceb66a8e4e771a4e9ff8b06abbb8ee90731ba60d4ddd9514
6
+ metadata.gz: 7193e79c98e5a13b6e7f60a686167eae26872dc8d62410099aa58ded65f73ce2d77430389b822cc818504ef382c837b620ba20ffe34c46315214bc37d020070a
7
+ data.tar.gz: 5dd1cde1959ea0dbcc0f2ade4805b2a23959d0edf450069a558eb454f0ca48a70eac75a19695d257a457917db76f783d13098eab72bff2dbcfbe47ab66d0309d
data/bin/morpheus CHANGED
@@ -1,59 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'term/ansicolor'
2
3
  require 'optparse'
3
4
  require 'morpheus/cli'
4
5
  require 'morpheus/rest_client'
5
6
  require 'morpheus/cli/cli_registry'
7
+ require 'morpheus/cli/config_file'
8
+ require 'morpheus/cli/error_handler'
9
+
10
+ # use colors by default
11
+ Term::ANSIColor::coloring = STDOUT.isatty
12
+ # include Term::ANSIColor # tempting
6
13
 
7
14
  # short circuit version switch
8
- if ARGV[0] == '-v' && ARGV.size == 1
15
+ if ARGV[0] == '-v'
9
16
  version = Morpheus::Cli::VERSION
10
17
  puts version
11
18
  exit 0
12
19
  end
13
20
 
14
- # handle global options
15
- args = ARGV
16
- # set global log level to debug (print stack trace for bubbled exceptions)
17
- if args.find {|arg| arg == '-V' || arg == '--debug'}
21
+ args = ARGV.dup
22
+
23
+ # raise log level right away
24
+ if args.find {|it| it == '-V' || it == '--debug'}
18
25
  Morpheus::Logging.set_log_level(Morpheus::Logging::Logger::DEBUG)
19
26
  end
20
- args = args.find_all {|arg| arg != '-V' && arg != '--debug'}
21
27
 
22
- # JD: figure out what to do with --insecure option
23
- if args.find {|arg| arg == '--insecure'}
24
- Morpheus::RestClient.enable_ssl_verification = false
25
- end
26
- args = args.find_all {|arg| arg != '--insecure'}
28
+ # load config file(s)
29
+ Morpheus::Cli::ConfigFile.init(ENV['MORPHEUS_CLI_HOME'])
27
30
 
28
- # all commands should be registered commands
29
- if Morpheus::Cli::CliRegistry.has_command?(args[0])
31
+ # all commands should be registered commands or aliases
32
+ if Morpheus::Cli::CliRegistry.has_command?(args[0]) || Morpheus::Cli::CliRegistry.has_alias?(args[0])
30
33
  begin
31
- Morpheus::Cli::CliRegistry.exec(args[0], args[1..-1])
32
- exit 0
33
- rescue OptionParser::InvalidOption => e
34
- # raise e
35
- print Term::ANSIColor.red, "\n", "#{e.message}", "", Term::ANSIColor.reset
36
- print "\n", "Try -h for help with this command.", "\n\n"
37
- if Morpheus::Logging.print_stacktrace?
38
- print Term::ANSIColor.red, "\n", "#{e.class}: #{e.message}", "\n", Term::ANSIColor.reset
39
- print e.backtrace.join("\n"), "\n\n"
34
+ cmd_result = Morpheus::Cli::CliRegistry.exec(args[0], args[1..-1])
35
+ if cmd_result == false
36
+ exit 1
37
+ else
38
+ exit 0
40
39
  end
41
- exit 1
42
40
  rescue => e
43
- print Term::ANSIColor.red, "\n", "Unexpected Error", "\n\n", Term::ANSIColor.reset
44
- if Morpheus::Logging.print_stacktrace?
45
- print Term::ANSIColor.red, "\n", "#{e.class}: #{e.message}", "\n", Term::ANSIColor.reset
46
- print e.backtrace.join("\n"), "\n\n"
47
- end
41
+ Morpheus::Cli::ErrorHandler.new.handle_error(e)
48
42
  exit 1
49
43
  end
50
- exit 0
51
44
  else
52
- puts "\nUsage: morpheus [command] [options]\n"
53
- puts "\nCommands:\n"
54
- Morpheus::Cli::CliRegistry.all.each {|cmd,klass|
45
+ puts "Usage: morpheus [command] [options]"
46
+ puts "\nCommands:"
47
+ Morpheus::Cli::CliRegistry.all.keys.sort.each {|cmd|
55
48
  puts "\t#{cmd.to_s}"
56
49
  }
57
50
  puts ""
51
+ puts "For more information, see https://github.com/gomorpheus/morpheus-cli/wiki"
52
+ puts ""
58
53
  exit 127
59
54
  end
@@ -1,55 +1,44 @@
1
- require 'json'
2
- require 'rest-client'
1
+ require 'morpheus/api/api_client'
3
2
 
4
3
  class Morpheus::AccountsInterface < Morpheus::APIClient
5
- def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
6
- @access_token = access_token
7
- @refresh_token = refresh_token
8
- @base_url = base_url
9
- @expires_at = expires_at
10
- end
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @expires_at = expires_at
9
+ end
11
10
 
12
- def get(id)
13
- raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
14
- url = "#{@base_url}/api/accounts/#{id}"
15
- headers = { params: {}, authorization: "Bearer #{@access_token}" }
16
- response = Morpheus::RestClient.execute(method: :get, url: url,
17
- timeout: 10, headers: headers)
18
- JSON.parse(response.to_s)
19
- end
11
+ def get(id)
12
+ raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
13
+ url = "#{@base_url}/api/accounts/#{id}"
14
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
15
+ execute(method: :get, url: url, headers: headers)
16
+ end
20
17
 
21
- def list(options={})
22
- url = "#{@base_url}/api/accounts"
23
- headers = { params: {}, authorization: "Bearer #{@access_token}" }
24
- headers[:params].merge!(options)
25
- response = Morpheus::RestClient.execute(method: :get, url: url,
26
- timeout: 10, headers: headers)
27
- JSON.parse(response.to_s)
28
- end
18
+ def list(options={})
19
+ url = "#{@base_url}/api/accounts"
20
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
21
+ headers[:params].merge!(options)
22
+ execute(method: :get, url: url, headers: headers)
23
+ end
29
24
 
30
- def create(options)
31
- url = "#{@base_url}/api/accounts"
32
- headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
33
- payload = options
34
- response = Morpheus::RestClient.execute(method: :post, url: url,
35
- timeout: 10, headers: headers, payload: payload.to_json)
36
- JSON.parse(response.to_s)
37
- end
25
+ def create(options)
26
+ url = "#{@base_url}/api/accounts"
27
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
28
+ payload = options
29
+ execute(method: :post, url: url, headers: headers, payload: payload.to_json)
30
+ end
38
31
 
39
- def update(id, options)
40
- url = "#{@base_url}/api/accounts/#{id}"
41
- headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
42
- payload = options
43
- response = Morpheus::RestClient.execute(method: :put, url: url,
44
- timeout: 10, headers: headers, payload: payload.to_json)
45
- JSON.parse(response.to_s)
46
- end
32
+ def update(id, options)
33
+ url = "#{@base_url}/api/accounts/#{id}"
34
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
35
+ payload = options
36
+ execute(method: :put, url: url, headers: headers, payload: payload.to_json)
37
+ end
47
38
 
48
- def destroy(id)
49
- url = "#{@base_url}/api/accounts/#{id}"
50
- headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
51
- response = Morpheus::RestClient.execute(method: :delete, url: url,
52
- timeout: 10, headers: headers)
53
- JSON.parse(response.to_s)
54
- end
39
+ def destroy(id)
40
+ url = "#{@base_url}/api/accounts/#{id}"
41
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
42
+ execute(method: :delete, url: url, headers: headers)
43
+ end
55
44
  end
@@ -1,118 +1,149 @@
1
1
  require 'json'
2
+ require 'uri'
2
3
  require 'rest-client'
3
4
 
4
5
  class Morpheus::APIClient
5
- def initialize(access_token, refresh_token=nil,expires_in = nil, base_url=nil)
6
- @access_token = access_token
7
- @refresh_token = refresh_token
8
- @base_url = base_url
9
- if expires_in != nil
10
- @expires_at = DateTime.now + expires_in.seconds
11
- end
12
- end
13
-
14
- def whoami
15
- Morpheus::WhoamiInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
16
- end
17
-
18
- def options
19
- Morpheus::OptionsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
20
- end
21
-
22
- def groups
23
- Morpheus::GroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
24
- end
25
-
26
- def clouds
27
- Morpheus::CloudsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
28
- end
29
-
30
- def servers
31
- Morpheus::ServersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
32
- end
33
-
34
- def instances
35
- Morpheus::InstancesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
36
- end
37
-
38
- def instance_types
39
- Morpheus::InstanceTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
40
- end
41
-
42
- def provision_types
43
- Morpheus::ProvisionTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
44
- end
45
-
46
- def load_balancers
47
- Morpheus::LoadBalancersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
48
- end
49
-
50
- def tasks
51
- Morpheus::TasksInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
52
- end
53
-
54
- def task_sets
55
- Morpheus::TaskSetsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
56
- end
57
-
58
- def virtual_images
59
- Morpheus::VirtualImagesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
60
- end
61
-
62
- def apps
63
- Morpheus::AppsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
64
- end
65
-
66
- def app_templates
67
- Morpheus::AppTemplatesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
68
- end
69
-
70
- def deploy
71
- Morpheus::DeployInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
72
- end
73
-
74
- def deployments
75
- Morpheus::DeploymentsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
76
- end
77
-
78
- def security_groups
79
- Morpheus::SecurityGroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
80
- end
81
-
82
- def security_group_rules
83
- Morpheus::SecurityGroupRulesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
84
- end
85
-
86
- def accounts
87
- Morpheus::AccountsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
88
- end
89
-
90
- def users
91
- Morpheus::UsersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
92
- end
93
-
94
- def logs
95
- Morpheus::LogsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
96
- end
97
-
98
- def roles
99
- Morpheus::RolesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
100
- end
101
-
102
- def key_pairs
103
- Morpheus::KeyPairsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
104
- end
105
-
106
- def license
107
- Morpheus::LicenseInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
108
- end
6
+ def initialize(access_token, refresh_token=nil,expires_in = nil, base_url=nil)
7
+ @access_token = access_token
8
+ @refresh_token = refresh_token
9
+ @base_url = base_url
10
+ if expires_in != nil
11
+ @expires_at = DateTime.now + expires_in.seconds
12
+ end
13
+ end
14
+
15
+ def dry_run(val=true)
16
+ @dry_run = !!val
17
+ self
18
+ end
19
+
20
+ def dry()
21
+ dry_run(true)
22
+ end
23
+
24
+ def execute(opts, parse_json=true)
25
+ if @dry_run
26
+ # JD: could return a Request object instead...
27
+ return opts
28
+ end
29
+ response = Morpheus::RestClient.execute(opts)
30
+ if parse_json
31
+ return JSON.parse(response.to_s)
32
+ else
33
+ return response
34
+ end
35
+ end
36
+
37
+ def auth
38
+ Morpheus::AuthInterface.new(@base_url, @access_token)
39
+ end
40
+
41
+ def whoami
42
+ Morpheus::WhoamiInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
43
+ end
44
+
45
+ def options
46
+ Morpheus::OptionsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
47
+ end
48
+
49
+ def groups
50
+ Morpheus::GroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
51
+ end
52
+
53
+ def clouds
54
+ Morpheus::CloudsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
55
+ end
56
+
57
+ def servers
58
+ Morpheus::ServersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
59
+ end
60
+
61
+ def instances
62
+ Morpheus::InstancesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
63
+ end
64
+
65
+ def instance_types
66
+ Morpheus::InstanceTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
67
+ end
68
+
69
+ def provision_types
70
+ Morpheus::ProvisionTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
71
+ end
72
+
73
+ def load_balancers
74
+ Morpheus::LoadBalancersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
75
+ end
76
+
77
+ def tasks
78
+ Morpheus::TasksInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
79
+ end
80
+
81
+ def task_sets
82
+ Morpheus::TaskSetsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
83
+ end
84
+
85
+ def virtual_images
86
+ Morpheus::VirtualImagesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
87
+ end
88
+
89
+ def apps
90
+ Morpheus::AppsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
91
+ end
92
+
93
+ def app_templates
94
+ Morpheus::AppTemplatesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
95
+ end
96
+
97
+ def deploy
98
+ Morpheus::DeployInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
99
+ end
100
+
101
+ def deployments
102
+ Morpheus::DeploymentsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
103
+ end
104
+
105
+ def security_groups
106
+ Morpheus::SecurityGroupsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
107
+ end
108
+
109
+ def security_group_rules
110
+ Morpheus::SecurityGroupRulesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
111
+ end
112
+
113
+ def accounts
114
+ Morpheus::AccountsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
115
+ end
116
+
117
+ def users
118
+ Morpheus::UsersInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
119
+ end
120
+
121
+ def logs
122
+ Morpheus::LogsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
123
+ end
124
+
125
+ def roles
126
+ Morpheus::RolesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
127
+ end
128
+
129
+ def key_pairs
130
+ Morpheus::KeyPairsInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
131
+ end
132
+
133
+ def license
134
+ Morpheus::LicenseInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
135
+ end
109
136
 
110
- def custom_instance_types
111
- Morpheus::CustomInstanceTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
112
- end
137
+ def custom_instance_types
138
+ Morpheus::CustomInstanceTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
139
+ end
113
140
 
114
- def dashboard
115
- Morpheus::DashboardInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
116
- end
141
+ def dashboard
142
+ Morpheus::DashboardInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
143
+ end
117
144
 
145
+ def setup
146
+ Morpheus::SetupInterface.new(@base_url)
147
+ end
148
+
118
149
  end