morpheus-cli 3.6.31 → 3.6.32

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.
@@ -10,7 +10,9 @@ class Morpheus::Cli::Clouds
10
10
  include Morpheus::Cli::CliCommand
11
11
  include Morpheus::Cli::InfrastructureHelper
12
12
 
13
- register_subcommands :list, :count, :get, :add, :update, :remove, :firewall_disable, :firewall_enable, :security_groups, :apply_security_groups, :types => :list_cloud_types
13
+ register_subcommands :list, :count, :get, :add, :update, :remove, :security_groups, :apply_security_groups, :types => :list_cloud_types
14
+ register_subcommands :wiki, :update_wiki
15
+ #register_subcommands :firewall_disable, :firewall_enable
14
16
  alias_subcommand :details, :get
15
17
  set_default_subcommand :list
16
18
 
@@ -660,6 +662,205 @@ class Morpheus::Cli::Clouds
660
662
  end
661
663
  end
662
664
 
665
+ def wiki(args)
666
+ options = {}
667
+ params = {}
668
+ open_wiki_link = false
669
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
670
+ opts.banner = subcommand_usage("[cloud]")
671
+ opts.on('--view', '--view', "View wiki page in web browser.") do
672
+ open_wiki_link = true
673
+ end
674
+ build_common_options(opts, options, [:json, :dry_run, :remote])
675
+ opts.footer = "View wiki page details for a cloud." + "\n" +
676
+ "[cloud] is required. This is the name or id of a cloud."
677
+ end
678
+ optparse.parse!(args)
679
+ if args.count != 1
680
+ puts_error "#{Morpheus::Terminal.angry_prompt}wrong number of arguments. Expected 1 and received #{args.count} #{args.inspect}\n#{optparse}"
681
+ return 1
682
+ end
683
+ connect(options)
684
+
685
+ begin
686
+ cloud = find_cloud_by_name_or_id(args[0])
687
+ return 1 if cloud.nil?
688
+
689
+
690
+ @clouds_interface.setopts(options)
691
+ if options[:dry_run]
692
+ print_dry_run @clouds_interface.dry.wiki(cloud["id"], params)
693
+ return
694
+ end
695
+ json_response = @clouds_interface.wiki(cloud["id"], params)
696
+ page = json_response['page']
697
+
698
+ render_result = render_with_format(json_response, options, 'page')
699
+ return 0 if render_result
700
+
701
+ if page
702
+
703
+ # my_terminal.exec("wiki get #{page['id']}")
704
+
705
+ print_h1 "Cloud Wiki Page: #{cloud['name']}"
706
+ # print_h1 "Wiki Page Details"
707
+ print cyan
708
+
709
+ print_description_list({
710
+ "Page ID" => 'id',
711
+ "Name" => 'name',
712
+ #"Category" => 'category',
713
+ #"Ref Type" => 'refType',
714
+ #"Ref ID" => 'refId',
715
+ #"Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
716
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
717
+ "Created By" => lambda {|it| it['createdBy'] ? it['createdBy']['username'] : '' },
718
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
719
+ "Updated By" => lambda {|it| it['updatedBy'] ? it['updatedBy']['username'] : '' }
720
+ }, page)
721
+ print reset,"\n"
722
+
723
+ print_h2 "Page Content"
724
+ print cyan, page['content'], reset, "\n"
725
+
726
+ else
727
+ print "\n"
728
+ print cyan, "No wiki page found.", reset, "\n"
729
+ end
730
+ print reset,"\n"
731
+
732
+ if open_wiki_link
733
+ return view_wiki([args[0]])
734
+ end
735
+
736
+ return 0
737
+ rescue RestClient::Exception => e
738
+ print_rest_exception(e, options)
739
+ exit 1
740
+ end
741
+ end
742
+
743
+ def view_wiki(args)
744
+ params = {}
745
+ options = {}
746
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
747
+ opts.banner = subcommand_usage("[id]")
748
+ build_common_options(opts, options, [:dry_run, :remote])
749
+ opts.footer = "View cloud wiki page in a web browser" + "\n" +
750
+ "[cloud] is required. This is the name or id of a cloud."
751
+ end
752
+ optparse.parse!(args)
753
+ if args.count != 1
754
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
755
+ end
756
+ connect(options)
757
+ begin
758
+ cloud = find_cloud_by_name_or_id(args[0])
759
+ return 1 if cloud.nil?
760
+
761
+ link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/infrastructure/clouds/#{cloud['id']}#!wiki"
762
+
763
+ open_command = nil
764
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
765
+ open_command = "start #{link}"
766
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin/
767
+ open_command = "open #{link}"
768
+ elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
769
+ open_command = "xdg-open #{link}"
770
+ end
771
+
772
+ if options[:dry_run]
773
+ puts "system: #{open_command}"
774
+ return 0
775
+ end
776
+
777
+ system(open_command)
778
+
779
+ return 0
780
+ rescue RestClient::Exception => e
781
+ print_rest_exception(e, options)
782
+ exit 1
783
+ end
784
+ end
785
+
786
+ def update_wiki(args)
787
+ options = {}
788
+ params = {}
789
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
790
+ opts.banner = subcommand_usage("[cloud] [options]")
791
+ build_option_type_options(opts, options, update_wiki_page_option_types)
792
+ opts.on('--file FILE', "File containing the wiki content. This can be used instead of --content") do |filename|
793
+ full_filename = File.expand_path(filename)
794
+ if File.exists?(full_filename)
795
+ params['content'] = File.read(full_filename)
796
+ else
797
+ print_red_alert "File not found: #{full_filename}"
798
+ return 1
799
+ end
800
+ # use the filename as the name by default.
801
+ if !params['name']
802
+ params['name'] = File.basename(full_filename)
803
+ end
804
+ end
805
+ opts.on(nil, '--clear', "Clear current page content") do |val|
806
+ params['content'] = ""
807
+ end
808
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
809
+ end
810
+ optparse.parse!(args)
811
+ if args.count != 1
812
+ puts_error "#{Morpheus::Terminal.angry_prompt}wrong number of arguments. Expected 1 and received #{args.count} #{args.inspect}\n#{optparse}"
813
+ return 1
814
+ end
815
+ connect(options)
816
+
817
+ begin
818
+ cloud = find_cloud_by_name_or_id(args[0])
819
+ return 1 if cloud.nil?
820
+ # construct payload
821
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
822
+ payload = nil
823
+ if options[:payload]
824
+ payload = options[:payload]
825
+ payload.deep_merge!({'page' => passed_options}) unless passed_options.empty?
826
+ else
827
+ payload = {
828
+ 'page' => {
829
+ }
830
+ }
831
+ # allow arbitrary -O options
832
+ payload.deep_merge!({'page' => passed_options}) unless passed_options.empty?
833
+ # prompt for options
834
+ #params = Morpheus::Cli::OptionTypes.prompt(update_wiki_page_option_types, options[:options], @api_client, options[:params])
835
+ #params = passed_options
836
+ params.deep_merge!(passed_options)
837
+
838
+ if params.empty?
839
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
840
+ end
841
+
842
+ payload.deep_merge!({'page' => params}) unless params.empty?
843
+ end
844
+ @clouds_interface.setopts(options)
845
+ if options[:dry_run]
846
+ print_dry_run @clouds_interface.dry.update_wiki(cloud["id"], payload)
847
+ return
848
+ end
849
+ json_response = @clouds_interface.update_wiki(cloud["id"], payload)
850
+
851
+ if options[:json]
852
+ puts as_json(json_response, options)
853
+ else
854
+ print_green_success "Updated wiki page for cloud #{cloud['name']}"
855
+ wiki([cloud['id']])
856
+ end
857
+ return 0
858
+ rescue RestClient::Exception => e
859
+ print_rest_exception(e, options)
860
+ exit 1
861
+ end
862
+ end
863
+
663
864
  private
664
865
 
665
866
  def print_clouds_table(clouds, opts={})
@@ -742,4 +943,11 @@ class Morpheus::Cli::Clouds
742
943
  out
743
944
  end
744
945
 
946
+ def update_wiki_page_option_types
947
+ [
948
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => false, 'displayOrder' => 1, 'description' => 'The name of the wiki page for this instance. Default is the instance name.'},
949
+ #{'fieldName' => 'category', 'fieldLabel' => 'Category', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
950
+ {'fieldName' => 'content', 'fieldLabel' => 'Content', 'type' => 'textarea', 'required' => false, 'displayOrder' => 3, 'description' => 'The content (markdown) of the wiki page.'}
951
+ ]
952
+ end
745
953
  end
@@ -0,0 +1,406 @@
1
+ require 'io/console'
2
+ require 'rest_client'
3
+ require 'optparse'
4
+ require 'morpheus/cli/cli_command'
5
+ require 'morpheus/cli/option_types'
6
+ require 'json'
7
+
8
+ class Morpheus::Cli::EnvironmentsCommand
9
+ include Morpheus::Cli::CliCommand
10
+ set_command_name :environments
11
+ register_subcommands :list, :get, :add, :update, :remove, :'toggle-active'
12
+
13
+ def initialize()
14
+ # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
15
+ end
16
+
17
+ def connect(opts)
18
+ @api_client = establish_remote_appliance_connection(opts)
19
+ @environments_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).environments
20
+ end
21
+
22
+ def handle(args)
23
+ handle_subcommand(args)
24
+ end
25
+
26
+ def list(args)
27
+ options = {}
28
+ params = {}
29
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
30
+ opts.banner = subcommand_usage()
31
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
32
+ end
33
+ optparse.parse!(args)
34
+ if args.count != 0
35
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args}\n#{optparse}"
36
+ end
37
+ connect(options)
38
+ begin
39
+ params.merge!(parse_list_options(options))
40
+ @environments_interface.setopts(options)
41
+ if options[:dry_run]
42
+ print_dry_run @environments_interface.dry.list(params)
43
+ return 0
44
+ end
45
+ json_response = @environments_interface.list(params)
46
+ render_result = render_with_format(json_response, options, 'environments')
47
+ return 0 if render_result
48
+ environments = json_response['environments']
49
+ unless options[:quiet]
50
+ title = "Morpheus Environments"
51
+ subtitles = []
52
+ subtitles += parse_list_subtitles(options)
53
+ print_h1 title, subtitles
54
+ if environments.empty?
55
+ print yellow,"No Environments found.",reset
56
+ else
57
+ print_environments_table(environments)
58
+ print_results_pagination(json_response)
59
+ end
60
+ print reset,"\n"
61
+ end
62
+ return 0
63
+ rescue RestClient::Exception => e
64
+ print_rest_exception(e, options)
65
+ exit 1
66
+ end
67
+ end
68
+
69
+ def get(args)
70
+ options = {}
71
+ params = {}
72
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
73
+ opts.banner = subcommand_usage("[name]")
74
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
75
+ end
76
+ optparse.parse!(args)
77
+
78
+ if args.count != 1
79
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
80
+ end
81
+
82
+ connect(options)
83
+ begin
84
+ @environments_interface.setopts(options)
85
+ if options[:dry_run]
86
+ if args[0].to_s =~ /\A\d{1,}\Z/
87
+ print_dry_run @environments_interface.dry.get(args[0])
88
+ else
89
+ print_dry_run @environments_interface.dry.list({name: args[0].to_s})
90
+ end
91
+ return 0
92
+ end
93
+ environment = find_environment_by_name_or_id(args[0])
94
+ return 1 if environment.nil?
95
+ json_response = {'environment' => environment}
96
+ render_result = render_with_format(json_response, options, 'environment')
97
+ return 0 if render_result
98
+
99
+ unless options[:quiet]
100
+ print_h1 "Environment Details"
101
+ print cyan
102
+
103
+ print_description_list({
104
+ "ID" => 'id',
105
+ "Name" => 'name',
106
+ "Code" => 'code',
107
+ "Description" => 'description',
108
+ "Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
109
+ "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
110
+ "Sort Order" => lambda {|it| it['sortOrder'] },
111
+ "Active" => lambda {|it| format_boolean(it['active']) },
112
+ #"Created" => lambda {|it| format_local_dt(it['dateCreated']) }
113
+ }, environment)
114
+ print reset,"\n"
115
+ end
116
+ return 0
117
+ rescue RestClient::Exception => e
118
+ print_rest_exception(e, options)
119
+ exit 1
120
+ end
121
+ end
122
+
123
+ def add(args)
124
+ options = {}
125
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
126
+ opts.banner = subcommand_usage("[name] [options]")
127
+ build_option_type_options(opts, options, add_environment_option_types)
128
+ build_common_options(opts, options, [:payload, :options, :json, :dry_run, :remote])
129
+ end
130
+ optparse.parse!(args)
131
+ if args.count > 1
132
+ raise_command_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args}\n#{optparse}"
133
+ end
134
+ if args[0]
135
+ options[:options] ||= {}
136
+ options[:options]['name'] ||= args[0]
137
+ end
138
+ connect(options)
139
+ begin
140
+ # construct payload
141
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
142
+ payload = nil
143
+ if options[:payload]
144
+ payload = options[:payload]
145
+ payload.deep_merge!({'environment' => passed_options}) unless passed_options.empty?
146
+ else
147
+ payload = {
148
+ 'environment' => {
149
+ }
150
+ }
151
+ # allow arbitrary -O options
152
+ payload.deep_merge!({'environment' => passed_options}) unless passed_options.empty?
153
+ # prompt for options
154
+ params = Morpheus::Cli::OptionTypes.prompt(add_environment_option_types, options[:options], @api_client, options[:params])
155
+ payload.deep_merge!({'environment' => params}) unless params.empty?
156
+ end
157
+
158
+ @environments_interface.setopts(options)
159
+ if options[:dry_run]
160
+ print_dry_run @environments_interface.dry.create(payload)
161
+ return
162
+ end
163
+ json_response = @environments_interface.create(payload)
164
+ if options[:json]
165
+ print JSON.pretty_generate(json_response)
166
+ print "\n"
167
+ else
168
+ display_name = json_response['environment'] ? json_response['environment']['name'] : ''
169
+ print_green_success "Environment #{display_name} added"
170
+ get([json_response['environment']['id']])
171
+ end
172
+ return 0
173
+ rescue RestClient::Exception => e
174
+ print_rest_exception(e, options)
175
+ exit 1
176
+ end
177
+ end
178
+
179
+ def update(args)
180
+ options = {}
181
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
182
+ opts.banner = subcommand_usage("[name] [options]")
183
+ build_option_type_options(opts, options, update_environment_option_types)
184
+ build_common_options(opts, options, [:payload, :options, :json, :dry_run, :remote])
185
+ end
186
+ optparse.parse!(args)
187
+
188
+ if args.count != 1
189
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
190
+ end
191
+
192
+ connect(options)
193
+ begin
194
+
195
+ environment = find_environment_by_name_or_id(args[0])
196
+ return 1 if environment.nil?
197
+
198
+ # construct payload
199
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
200
+ payload = nil
201
+ if options[:payload]
202
+ payload = options[:payload]
203
+ payload.deep_merge!({'environment' => passed_options}) unless passed_options.empty?
204
+ else
205
+ payload = {
206
+ 'environment' => {
207
+ }
208
+ }
209
+ # allow arbitrary -O options
210
+ payload.deep_merge!({'environment' => passed_options}) unless passed_options.empty?
211
+ # prompt for options
212
+ #params = Morpheus::Cli::OptionTypes.prompt(update_environment_option_types, options[:options], @api_client, options[:params])
213
+ params = passed_options
214
+
215
+ if params.empty?
216
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
217
+ end
218
+
219
+ payload.deep_merge!({'environment' => params}) unless params.empty?
220
+ end
221
+ @environments_interface.setopts(options)
222
+ if options[:dry_run]
223
+ print_dry_run @environments_interface.dry.update(environment['id'], payload)
224
+ return
225
+ end
226
+ json_response = @environments_interface.update(environment['id'], payload)
227
+ if options[:json]
228
+ print JSON.pretty_generate(json_response)
229
+ print "\n"
230
+ else
231
+ display_name = json_response['environment'] ? json_response['environment']['name'] : ''
232
+ print_green_success "Environment #{display_name} updated"
233
+ get([json_response['environment']['id']])
234
+ end
235
+ return 0
236
+ rescue RestClient::Exception => e
237
+ print_rest_exception(e, options)
238
+ exit 1
239
+ end
240
+ end
241
+
242
+ def remove(args)
243
+ options = {}
244
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
245
+ opts.banner = subcommand_usage("[name]")
246
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
247
+ end
248
+ optparse.parse!(args)
249
+
250
+ if args.count != 1
251
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
252
+ end
253
+
254
+ connect(options)
255
+ begin
256
+ environment = find_environment_by_name_or_id(args[0])
257
+ return 1 if environment.nil?
258
+
259
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the environment #{environment['name']}?")
260
+ return 9, "aborted command"
261
+ end
262
+ @environments_interface.setopts(options)
263
+ if options[:dry_run]
264
+ print_dry_run @environments_interface.dry.destroy(environment['id'])
265
+ return
266
+ end
267
+ json_response = @environments_interface.destroy(environment['id'])
268
+ if options[:json]
269
+ print JSON.pretty_generate(json_response)
270
+ print "\n"
271
+ else
272
+ print_green_success "Environment #{environment['name']} removed"
273
+ # list([])
274
+ end
275
+ return 0
276
+ rescue RestClient::Exception => e
277
+ print_rest_exception(e, options)
278
+ exit 1
279
+ end
280
+ end
281
+
282
+ def toggle_active(args)
283
+ params = {}
284
+ options = {}
285
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
286
+ opts.banner = subcommand_usage("[name] [on|off]")
287
+ build_common_options(opts, options, [:json, :dry_run, :remote])
288
+ end
289
+ optparse.parse!(args)
290
+
291
+ if args.count < 1 || args.count > 2
292
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
293
+ end
294
+ if args[1]
295
+ params['active'] = (args[1].to_s == 'on' || args[1].to_s == 'true')
296
+ end
297
+ connect(options)
298
+ begin
299
+
300
+ environment = find_environment_by_name_or_id(args[0])
301
+ return 1 if environment.nil?
302
+
303
+ @environments_interface.setopts(options)
304
+ if options[:dry_run]
305
+ print_dry_run @environments_interface.dry.toggle_active(environment['id'], params)
306
+ return
307
+ end
308
+ json_response = @environments_interface.toggle_active(environment['id'], params)
309
+ if options[:json]
310
+ print JSON.pretty_generate(json_response)
311
+ print "\n"
312
+ else
313
+ display_name = json_response['environment'] ? json_response['environment']['name'] : ''
314
+ print_green_success "Environment #{display_name} updated"
315
+ get([json_response['environment']['id']])
316
+ end
317
+ return 0
318
+ rescue RestClient::Exception => e
319
+ print_rest_exception(e, options)
320
+ exit 1
321
+ end
322
+ end
323
+
324
+ private
325
+ def find_environment_by_name_or_id(val)
326
+ if val.to_s =~ /\A\d{1,}\Z/
327
+ return find_environment_by_id(val)
328
+ else
329
+ return find_environment_by_name(val)
330
+ end
331
+ end
332
+
333
+ def find_environment_by_id(id)
334
+ raise "#{self.class} has not defined @environments_interface" if @environments_interface.nil?
335
+ begin
336
+ json_response = @environments_interface.get(id)
337
+ return json_response['environment']
338
+ rescue RestClient::Exception => e
339
+ if e.response && e.response.code == 404
340
+ print_red_alert "Environment not found by id #{id}"
341
+ else
342
+ raise e
343
+ end
344
+ end
345
+ end
346
+
347
+ def find_environment_by_name(name)
348
+ raise "#{self.class} has not defined @environments_interface" if @environments_interface.nil?
349
+ environments = @environments_interface.list({name: name.to_s})['environments']
350
+ if environments.empty?
351
+ print_red_alert "Environment not found by name #{name}"
352
+ return nil
353
+ elsif environments.size > 1
354
+ print_red_alert "#{environments.size} environments by name #{name}"
355
+ print_environments_table(environments, {color: red})
356
+ print reset,"\n"
357
+ return nil
358
+ else
359
+ return environments[0]
360
+ end
361
+ end
362
+
363
+ def print_environments_table(environments, opts={})
364
+ table_color = opts[:color] || cyan
365
+ rows = environments.collect do |environment|
366
+ {
367
+ id: environment['id'],
368
+ name: environment['name'],
369
+ code: environment['code'],
370
+ description: environment['description'],
371
+ active: format_boolean(environment['active'])
372
+ }
373
+ end
374
+ columns = [
375
+ :id,
376
+ :name,
377
+ :code,
378
+ :description,
379
+ :active
380
+ ]
381
+ print as_pretty_table(rows, columns, opts)
382
+ print reset
383
+ end
384
+
385
+
386
+ def add_environment_option_types
387
+ [
388
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
389
+ {'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'required' => true, 'displayOrder' => 2},
390
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'displayOrder' => 3},
391
+ {'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'displayOrder' => 6},
392
+ {'fieldName' => 'sortOrder', 'fieldLabel' => 'Sort Order', 'type' => 'number', 'required' => false, 'defaultValue' => 0, 'displayOrder' => 5}
393
+ ]
394
+ end
395
+
396
+ def update_environment_option_types
397
+ [
398
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => false, 'displayOrder' => 1},
399
+ #{'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'required' => true, 'displayOrder' => 2},
400
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'displayOrder' => 3},
401
+ {'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'displayOrder' => 6},
402
+ {'fieldName' => 'sortOrder', 'fieldLabel' => 'Sort Order', 'type' => 'number', 'required' => false, 'defaultValue' => 0, 'displayOrder' => 5}
403
+ ]
404
+ end
405
+
406
+ end