morpheus-cli 4.1.7 → 4.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e55c3726ed7947b5d691c9027193844361880ca143f493aa886ece9423bb45a1
4
- data.tar.gz: a6e90dac8b23e38762565259def0bddead03a57d38c9f4f691c39032ed6d6431
3
+ metadata.gz: 2cd6e1f9ac938239cda4d222bb5f48a1a6567203d030e65a2efa6a5ed4742918
4
+ data.tar.gz: '09548881659c074b1d2d37219f5d13a3d94d9320672c2cca07803da1311dcac9'
5
5
  SHA512:
6
- metadata.gz: 910f2ccd9bd70988654f744a47a4633baa8b525a7054b961ee62600691c36d9706303b134c37b01c1584b29d87e7cb958fab237f721467966b12aa355e7d7ad7
7
- data.tar.gz: 8c14cf726ac4ca45aa716b590b56d46a1043f5ac2d9d668f5de4234aea48f9955aac2d79ebd43851f0ea9f652192794f329fe9afe4bd77c09e5821e97d69d0dc
6
+ metadata.gz: 8bd9c56fdeaf03e419cd48780afaea7d645ef07ab0c898b86a2ec3ca33e381fab349d4b79f7f260890be0ef0d9a579d32949c6834419597862ba380a27672762
7
+ data.tar.gz: 2675aed77287c61387bdb1c3d1484d0a2eaa96d6fafff21ffca64cc0a2a12be3a4e0745906fd90f6f432524b6f87e7d7cb93da58f84e6dcca620662c0e7d99a4
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
- FROM ruby:2.3.5
1
+ FROM ruby:2.5.1
2
2
 
3
- RUN gem install morpheus-cli
3
+ RUN gem install morpheus-cli -v 4.1.8
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
data/README.md CHANGED
@@ -1,6 +1,13 @@
1
- # Morpheus::Cli
1
+ # Morpheus CLI
2
2
 
3
- Provides a command line interface for interacting with the Morpheus Cloud Platform. Easily provision servers, containers, and manage deployments.
3
+ - Website: https://www.morpheusdata.com/
4
+ - Guide: [Morpheus CLI Wiki](https://github.com/gomorpheus/morpheus-cli/wiki)
5
+ - Docs: [Morpheus Documentation](https://docs.morpheusdata.com)
6
+ - Support: [Morpheus Support](https://support.morpheusdata.com)
7
+
8
+ <img src="https://www.morpheusdata.com/wp-content/uploads/2018/06/cropped-morpheus_highres.png" width="600px">
9
+
10
+ This library is a Ruby gem that provides a command line interface for interacting with the Morpheus Data appliance. The features provided include provisioning clusters, hosts, and containers, deploying and monitoring applications, automating tasks, and much more.
4
11
 
5
12
  ## Installation
6
13
 
@@ -10,7 +17,7 @@ Add this line to your application's Gemfile:
10
17
 
11
18
  And then execute:
12
19
 
13
- $ bundle
20
+ $ bundle install
14
21
 
15
22
  Or install it yourself as:
16
23
 
@@ -18,12 +25,17 @@ Or install it yourself as:
18
25
 
19
26
  ## Usage
20
27
 
21
- Please check out the [Wiki](https://github.com/gomorpheus/morpheus-cli/wiki) for usage instructions.
28
+ ### morpheus binary
29
+
30
+ This gem installs the [morpheus](https://github.com/gomorpheus/morpheus-cli/wiki/CLI-Manual) binary for executing commands in your shell environment.
31
+
32
+ ```sh
33
+ morpheus remote add demo https://demo.mymorpheus.com
34
+ morpheus instances list
35
+ ```
36
+
37
+ ### ruby code
22
38
 
23
- ## Contributing
39
+ If you want to interface with your Morpheus appliance via ruby directly, you can use [Morpheus::APIClient](https://github.com/gomorpheus/morpheus-cli/wiki/APIClient) or [Morpheus::Terminal](https://github.com/gomorpheus/morpheus-cli/wiki/Terminal).
24
40
 
25
- 1. Fork it ( https://github.com/[my-github-username]/morpheus-cli/fork )
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create a new Pull Request
41
+ For more detailed usage information, visit the [Morpheus CLI Wiki](https://github.com/gomorpheus/morpheus-cli/wiki).
@@ -55,7 +55,7 @@ class Morpheus::APIClient
55
55
  def inspect
56
56
  to_s
57
57
  end
58
-
58
+
59
59
  def dry_run(val=true)
60
60
  @dry_run = !!val
61
61
  self
@@ -339,6 +339,14 @@ class Morpheus::APIClient
339
339
  Morpheus::InstanceTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
340
340
  end
341
341
 
342
+ def integrations
343
+ Morpheus::IntegrationsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
344
+ end
345
+
346
+ def jobs
347
+ Morpheus::JobsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
348
+ end
349
+
342
350
  def server_types
343
351
  Morpheus::ServerTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
344
352
  end
@@ -399,6 +407,10 @@ class Morpheus::APIClient
399
407
  Morpheus::AccountsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
400
408
  end
401
409
 
410
+ def approvals
411
+ Morpheus::ApprovalsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
412
+ end
413
+
402
414
  def users
403
415
  Morpheus::UsersInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
404
416
  end
@@ -0,0 +1,35 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::ApprovalsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil, api='approvals')
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @api_url = "#{base_url}/api/#{api}"
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def list(params={})
13
+ url = @api_url
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ execute(method: :get, url: url, headers: headers)
16
+ end
17
+
18
+ def get(id, params={})
19
+ url = "#{@api_url}/#{id}"
20
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
21
+ execute(method: :get, url: url, headers: headers)
22
+ end
23
+
24
+ def get_item(id, params={})
25
+ url = "#{@base_url}/api/approval-items/#{id}"
26
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
27
+ execute(method: :get, url: url, headers: headers)
28
+ end
29
+
30
+ def update_item(id, action)
31
+ url = "#{@base_url}/api/approval-items/#{id}/#{action}"
32
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
33
+ execute(method: :put, url: url, headers: headers)
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::IntegrationsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil, api='integrations')
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @api_url = "#{base_url}/api/#{api}"
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def list(params={})
13
+ url = @api_url
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ execute(method: :get, url: url, headers: headers)
16
+ end
17
+
18
+ def get(id, params={})
19
+ url = "#{@api_url}/#{id}"
20
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
21
+ execute(method: :get, url: url, headers: headers)
22
+ end
23
+
24
+ def update(payload, params={})
25
+ url = @api_url
26
+ headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
27
+ execute(method: :put, url: url, headers: headers, payload: payload.to_json)
28
+ end
29
+ end
@@ -0,0 +1,86 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::JobsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil, api='jobs')
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @api_url = "#{base_url}/api/#{api}"
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def list(params={})
13
+ url = @api_url
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ execute(method: :get, url: url, headers: headers)
16
+ end
17
+
18
+ def get(id, params={})
19
+ url = "#{@api_url}/#{id}"
20
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
21
+ if params.is_a?(Hash)
22
+ headers[:params].merge!(params)
23
+ elsif params.is_a?(Numeric)
24
+ url = "#{@api_url}/#{params}"
25
+ elsif params.is_a?(String)
26
+ headers[:params]['name'] = params
27
+ end
28
+ execute(method: :get, url: url, headers: headers)
29
+ end
30
+
31
+ def create(payload)
32
+ url = @api_url
33
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
34
+ execute(method: :post, url: url, headers: headers, payload: payload.to_json)
35
+ end
36
+
37
+ def update(id, payload, params={})
38
+ url = "#{@api_url}/#{id}"
39
+ headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
40
+ execute(method: :put, url: url, headers: headers, payload: payload.to_json)
41
+ end
42
+
43
+ def destroy(id, params={})
44
+ url = "#{@api_url}/#{id}"
45
+ headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
46
+ execute(method: :delete, url: url, headers: headers)
47
+ end
48
+
49
+ def execute_job(id, params={})
50
+ url = "#{@api_url}/#{id}/execute"
51
+ headers = { params: params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
52
+ execute(method: :put, url: url, headers: headers)
53
+ end
54
+
55
+ =begin
56
+ def list_job_executions(id, params={})
57
+ url = "#{@api_url}/#{id}/executions"
58
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
59
+ execute(method: :get, url: url, headers: headers)
60
+ end
61
+ =end
62
+
63
+ def list_executions(params={})
64
+ url = "#{@base_url}/api/job-executions"
65
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
66
+ execute(method: :get, url: url, headers: headers)
67
+ end
68
+
69
+ def get_execution(id, params={})
70
+ url = "#{@base_url}/api/job-executions/#{id}"
71
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
72
+ execute(method: :get, url: url, headers: headers)
73
+ end
74
+
75
+ def get_execution_event(id, event_id, params={})
76
+ url = "#{@base_url}/api/job-executions/#{id}/events/#{event_id}"
77
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
78
+ execute(method: :get, url: url, headers: headers)
79
+ end
80
+
81
+ def options(jobTypeId, params={})
82
+ url = "#{@base_url}/api/job-options/#{jobTypeId}"
83
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
84
+ execute(method: :get, url: url, headers: headers)
85
+ end
86
+ end
@@ -98,6 +98,8 @@ module Morpheus
98
98
  load 'morpheus/cli/deploys.rb'
99
99
  load 'morpheus/cli/license.rb'
100
100
  load 'morpheus/cli/instance_types.rb'
101
+ load 'morpheus/cli/jobs_command.rb'
102
+ load 'morpheus/cli/integrations_command.rb'
101
103
  load 'morpheus/cli/security_groups.rb'
102
104
  load 'morpheus/cli/security_group_rules.rb'
103
105
  load 'morpheus/cli/clusters.rb'
@@ -153,6 +155,7 @@ module Morpheus
153
155
  load 'morpheus/cli/log_settings_command.rb'
154
156
  load 'morpheus/cli/whitelabel_settings_command.rb'
155
157
  load 'morpheus/cli/wiki_command.rb'
158
+ load 'morpheus/cli/approvals_command.rb'
156
159
 
157
160
  # Your new commands go here...
158
161
 
@@ -3,9 +3,9 @@ require 'morpheus/cli/cli_command'
3
3
  class Morpheus::Cli::ApplianceSettingsCommand
4
4
  include Morpheus::Cli::CliCommand
5
5
  include Morpheus::Cli::AccountsHelper
6
- set_command_hidden
7
- set_command_name :'appliance-settings'
8
6
 
7
+ set_command_name :'appliance-settings'
8
+ set_command_hidden
9
9
  register_subcommands :get, :update
10
10
 
11
11
  set_default_subcommand :get
@@ -67,10 +67,10 @@ class Morpheus::Cli::ApplianceSettingsCommand
67
67
  "Default User Role" => lambda {|it| it['defaultUserRoleId'] },
68
68
  "Docker Privileged Mode" => lambda {|it| format_boolean(it['dockerPrivilegedMode']) },
69
69
  # User Management Settings
70
- "Expire Password After" => lambda {|it| it['expirePwdDays'] == 0 ? 'Disabled' : it['expirePwdDays'] + ' Days' },
70
+ "Expire Password After" => lambda {|it| format_days(it['expirePwdDays']) },
71
71
  "Disable User After Attempts" => lambda {|it| it['disableAfterAttempts'] == 0 ? 'Disabled' : it['disableAfterAttempts']},
72
- "Disable User if Inactive For" => lambda {|it| it['disableAfterDaysInactive'] == 0 ? 'Disabled' : it['disableAfterDaysInactive'] + ' Days' },
73
- "Send warning email before deactivating" => lambda {|it| it['warnUserDaysBefore'] == 0 ? 'Disabled' : it['warnUserDaysBefore'] + ' Days' },
72
+ "Disable User if Inactive For" => lambda {|it| format_days(it['disableAfterDaysInactive']) },
73
+ "Send warning email before deactivating" => lambda {|it| format_days(it['warnUserDaysBefore']) },
74
74
  # Email Settings
75
75
  "SMTP From Address" => lambda {|it| it['smtpMailFrom'] },
76
76
  "SMTP Server" => lambda {|it| it['smtpServer'] },
@@ -160,10 +160,10 @@ class Morpheus::Cli::ApplianceSettingsCommand
160
160
  params['smtpPort'] = val == 'null' ? nil : val.to_i
161
161
  end
162
162
  opts.on("--smtp-ssl [on|off]", ['on','off'], "Use SSL for SMTP connections") do |val|
163
- params['smtpSSL'] = ['true','on'].include?(val.to_s.strip)
163
+ params['smtpSSL'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
164
164
  end
165
165
  opts.on("--smtp-tls [on|off]", ['on','off'], "Use TLS for SMTP connections") do |val|
166
- params['smtpTLS'] = ['true','on'].include?(val.to_s.strip)
166
+ params['smtpTLS'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
167
167
  end
168
168
  opts.on("--smtp-user STRING", String, "SMTP user") do |val|
169
169
  params['smtpUser'] = val == 'null' ? nil : val
@@ -298,4 +298,10 @@ class Morpheus::Cli::ApplianceSettingsCommand
298
298
  exit 1
299
299
  end
300
300
  end
301
+
302
+ private
303
+
304
+ def format_days(days)
305
+ days ? (days == 0 ? 'Disabled' : days + ' Days') : ''
306
+ end
301
307
  end
@@ -0,0 +1,236 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::ApprovalsCommand
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::AccountsHelper
6
+
7
+ set_command_name :'approvals'
8
+ set_command_hidden
9
+ register_subcommands :list, :get, :approve, :deny, :cancel
10
+ set_default_subcommand :list
11
+
12
+ def connect(opts)
13
+ @api_client = establish_remote_appliance_connection(opts)
14
+ @approvals_interface = @api_client.approvals
15
+ end
16
+
17
+ def handle(args)
18
+ handle_subcommand(args)
19
+ end
20
+
21
+ def list(args)
22
+ options = {}
23
+ params = {}
24
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
25
+ opts.banner = subcommand_usage()
26
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
27
+ opts.footer = "List approvals."
28
+ end
29
+ optparse.parse!(args)
30
+ connect(options)
31
+ if args.count != 0
32
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
33
+ return 1
34
+ end
35
+
36
+ begin
37
+ params.merge!(parse_list_options(options))
38
+ @approvals_interface.setopts(options)
39
+ if options[:dry_run]
40
+ print_dry_run @approvals_interface.dry.list(params)
41
+ return
42
+ end
43
+ json_response = @approvals_interface.list(params)
44
+
45
+ render_result = render_with_format(json_response, options, 'approvals')
46
+ return 0 if render_result
47
+
48
+ title = "Morpheus Approvals"
49
+ subtitles = []
50
+ subtitles += parse_list_subtitles(options)
51
+ print_h1 title, subtitles
52
+
53
+ approvals = json_response['approvals']
54
+ if approvals.empty?
55
+ print yellow,"No approvals found.",reset,"\n"
56
+ else
57
+ rows = approvals.collect do |it|
58
+ {
59
+ id: it['id'],
60
+ name: it['name'] || (it['accountIntegration'] ? 'Pending' : 'Not Set'),
61
+ requestType: it['requestType'],
62
+ externalName: it['accountIntegration'] ? it['externalName'] || 'Pending' : 'N/A',
63
+ type: it['accountIntegration'] ? it['accountIntegration']['type'] : 'Internal',
64
+ status: it['status'],
65
+ dateCreated: format_local_dt(it['dateCreated']),
66
+ requestedBy: it['requestBy']
67
+ }
68
+ end
69
+ columns = [
70
+ :id, :name, :requestType, :externalName, :type, :status, :dateCreated, :requestedBy
71
+ ]
72
+ print as_pretty_table(rows, columns, options)
73
+ print_results_pagination(json_response)
74
+ print reset,"\n"
75
+ end
76
+ print reset,"\n"
77
+ return 0
78
+ rescue RestClient::Exception => e
79
+ print_rest_exception(e, options)
80
+ exit 1
81
+ end
82
+ end
83
+
84
+ def get(args)
85
+ options = {}
86
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
87
+ opts.banner = subcommand_usage("[approval]")
88
+ build_common_options(opts, options, [:json, :dry_run, :remote])
89
+ opts.footer = "Get details about a job.\n" +
90
+ "[approval] is required. Approval ID or name"
91
+ end
92
+ optparse.parse!(args)
93
+ if args.count != 1
94
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
95
+ end
96
+ connect(options)
97
+ return _get(args[0], options)
98
+ end
99
+
100
+ def _get(approval_id, options = {})
101
+ params = {}
102
+ begin
103
+ @approvals_interface.setopts(options)
104
+
105
+ if !(approval_id.to_s =~ /\A\d{1,}\Z/)
106
+ approval = find_approval_by_name_or_id('approval', approval_id)
107
+
108
+ if !approval
109
+ print_red_alert "Approval #{approval_id} not found"
110
+ exit 1
111
+ end
112
+ approval_id = approval['id']
113
+ end
114
+
115
+ if options[:dry_run]
116
+ print_dry_run @approvals_interface.dry.get(approval_id, params)
117
+ return
118
+ end
119
+ json_response = @approvals_interface.get(approval_id, params)
120
+
121
+ render_result = render_with_format(json_response, options, 'approval')
122
+ return 0 if render_result
123
+
124
+ title = "Morpheus Approval"
125
+ subtitles = []
126
+ subtitles += parse_list_subtitles(options)
127
+ print_h1 title, subtitles
128
+
129
+ approval = json_response['approval']
130
+ print cyan
131
+ description_cols = {
132
+ "ID" => lambda {|it| it['id']},
133
+ "Name" => lambda {|it| it['name'] || (it['accountIntegration'] ? 'Pending' : 'Not Set')},
134
+ "Request Type" => lambda {|it| it['requestType']},
135
+ "External Name" => lambda {|it|it['accountIntegration'] ? it['externalName'] || 'Pending' : 'N/A'},
136
+ "Type" => lambda {|it| it['accountIntegration'] ? it['accountIntegration']['type'] : 'Internal'},
137
+ "Date Created" => lambda {|it| format_local_dt(it['dateCreated'])},
138
+ "Requested By" => lambda {|it| it['requestBy']}
139
+ }
140
+ print_description_list(description_cols, approval)
141
+
142
+ print_h2 "Requested Items"
143
+ approval_items = approval['approvalItems']
144
+
145
+ if approval_items && !approval_items.empty?
146
+ rows = approval_items.collect do |it|
147
+ {
148
+ id: it['id'],
149
+ name: it['name'] || 'Not Set',
150
+ external_name: it['externalName'] || 'N/A',
151
+ reference: it['reference'] ? it['reference']['displayName'] || it['reference']['name'] : '',
152
+ status: (it['status'] || '').capitalize,
153
+ created: format_local_dt(it['dateCreated']),
154
+ updated: format_local_dt(it['lastUpdated'])
155
+ }
156
+ end
157
+ columns = [
158
+ :id, :name, :external_name, :reference, :status, :created, :updated
159
+ ]
160
+ print as_pretty_table(rows, columns, options)
161
+ else
162
+ print yellow,"No requested items.",reset,"\n"
163
+ end
164
+
165
+ print reset,"\n"
166
+ return 0
167
+ rescue RestClient::Exception => e
168
+ print_rest_exception(e, options)
169
+ exit 1
170
+ end
171
+ end
172
+
173
+ def approve(args)
174
+ return _update_item(args, 'approve')
175
+ end
176
+
177
+ def deny(args)
178
+ return _update_item(args, 'deny')
179
+ end
180
+
181
+ def cancel(args)
182
+ return _update_item(args, 'cancel')
183
+ end
184
+
185
+ def _update_item(args, action)
186
+ options = {}
187
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
188
+ opts.banner = subcommand_usage( "[id]")
189
+ build_common_options(opts, options, [:json, :dry_run, :remote, :quiet])
190
+ opts.footer = "#{action.capitalize} item.\n[id] is required. Approval item ID"
191
+ end
192
+ optparse.parse!(args)
193
+ connect(options)
194
+ if args.count != 1
195
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
196
+ return 1
197
+ end
198
+
199
+ begin
200
+ approval_item = @approvals_interface.get_item(args[0].to_i)['approvalItem']
201
+
202
+ if !approval_item
203
+ print_red_alert "Approval item #{args[0]} not found"
204
+ exit 1
205
+ end
206
+
207
+ @approvals_interface.setopts(options)
208
+ if options[:dry_run]
209
+ print_dry_run @approvals_interface.dry.update_item(approval_item['id'], action)
210
+ return
211
+ end
212
+ json_response = @approvals_interface.update_item(approval_item['id'], action)
213
+
214
+ if options[:json]
215
+ puts as_json(json_response, options)
216
+ elsif !options[:quiet]
217
+ if json_response['success']
218
+ print_green_success "Approval item #{action} applied"
219
+ _get(approval_item['approval']['id'])
220
+ else
221
+ print_red_alert "Error updating approval item: #{json_response['msg'] || json_response['errors']}"
222
+ end
223
+ end
224
+ return 0
225
+ rescue RestClient::Exception => e
226
+ print_rest_exception(e, options)
227
+ exit 1
228
+ end
229
+ end
230
+
231
+ private
232
+
233
+ def find_approval_by_name_or_id(type, val)
234
+ (val.to_s =~ /\A\d{1,}\Z/) ? @approvals_interface.get(val.to_i)[typeCamelCase] : @approvals_interface.list({'name' => val})["approvals"].first
235
+ end
236
+ end