dtk-client 0.7.4.1 → 0.7.5

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dtk +10 -3
  3. data/bin/dtk-shell +1 -1
  4. data/lib/command_helpers/git_repo.rb +26 -20
  5. data/lib/command_helpers/jenkins_client.rb +4 -3
  6. data/lib/command_helpers/service_importer.rb +37 -25
  7. data/lib/commands.rb +2 -2
  8. data/lib/commands/common/thor/assembly_workspace.rb +185 -173
  9. data/lib/commands/common/thor/base_command_helper.rb +42 -0
  10. data/lib/commands/common/thor/clone.rb +1 -1
  11. data/lib/commands/common/thor/module.rb +37 -58
  12. data/lib/commands/common/thor/module/import.rb +1 -1
  13. data/lib/commands/common/thor/pull_from_remote.rb +7 -12
  14. data/lib/commands/common/thor/purge_clone.rb +1 -1
  15. data/lib/commands/common/thor/push_clone_changes.rb +3 -1
  16. data/lib/commands/common/thor/task_status.rb +52 -75
  17. data/lib/commands/common/thor/task_status/refresh_mode.rb +56 -0
  18. data/lib/commands/common/thor/task_status/snapshot_mode.rb +11 -0
  19. data/lib/commands/common/thor/task_status/stream_mode.rb +31 -0
  20. data/lib/commands/common/thor/task_status/stream_mode/element.rb +90 -0
  21. data/lib/commands/common/thor/task_status/stream_mode/element/no_results.rb +10 -0
  22. data/lib/commands/common/thor/task_status/stream_mode/element/render.rb +88 -0
  23. data/lib/commands/common/thor/task_status/stream_mode/element/stage.rb +13 -0
  24. data/lib/commands/common/thor/task_status/stream_mode/element/task_end.rb +10 -0
  25. data/lib/commands/common/thor/task_status/stream_mode/element/task_start.rb +10 -0
  26. data/lib/commands/thor/account.rb +10 -8
  27. data/lib/commands/thor/assembly.rb +9 -2
  28. data/lib/commands/thor/component_module.rb +0 -52
  29. data/lib/commands/thor/library.rb +1 -0
  30. data/lib/commands/thor/node.rb +1 -36
  31. data/lib/commands/thor/node_template.rb +4 -47
  32. data/lib/commands/thor/service.rb +57 -46
  33. data/lib/commands/thor/service_module.rb +2 -49
  34. data/lib/commands/thor/target.rb +7 -7
  35. data/lib/commands/thor/workspace.rb +44 -27
  36. data/lib/context_router.rb +4 -0
  37. data/lib/core.rb +71 -99
  38. data/lib/domain/response.rb +9 -0
  39. data/lib/domain/response/error_handler.rb +61 -0
  40. data/lib/dtk-client/version.rb +1 -1
  41. data/lib/dtk_client.rb +14 -0
  42. data/lib/dtk_error.rb +91 -0
  43. data/lib/error.rb +3 -9
  44. data/lib/execute/cli_pure/cli_rerouter.rb +82 -0
  45. data/lib/parser/adapters/thor.rb +3 -0
  46. data/lib/shell.rb +2 -1
  47. data/lib/shell/domain/context_params.rb +2 -0
  48. data/lib/util/console.rb +1 -1
  49. data/lib/util/os_util.rb +1 -0
  50. data/lib/util/remote_dependency_util.rb +20 -3
  51. data/lib/view_processor/table_print.rb +7 -25
  52. metadata +17 -5
  53. data/lib/commands/common/thor/test_action_agent.rb +0 -39
  54. data/lib/commands/thor/repo.rb +0 -35
@@ -20,7 +20,7 @@ module DTK::Client
20
20
  include PurgeCloneMixin
21
21
  include AssemblyWorkspaceMixin
22
22
  include ActionResultHandler
23
-
23
+
24
24
  def get_workspace_name(workspace_id)
25
25
  get_name_from_id_helper(workspace_id)
26
26
  end
@@ -43,7 +43,7 @@ module DTK::Client
43
43
  end
44
44
 
45
45
  # using extended_context when we want to use autocomplete from other context
46
- # e.g. we are in assembly/apache context and want to create-component we will use extended context to add
46
+ # e.g. we are in assembly/apache context and want to create-component we will use extended context to add
47
47
  # component-templates to autocomplete
48
48
  def self.extended_context()
49
49
  {
@@ -56,13 +56,13 @@ module DTK::Client
56
56
  },
57
57
  :command => {
58
58
  :edit_component_module => {
59
- :endpoint => "assembly",
60
- :url => "assembly/info_about",
59
+ :endpoint => "assembly",
60
+ :url => "assembly/info_about",
61
61
  :opts => {:subtype=>"instance", :about=>"modules"}
62
62
  },
63
63
  :push_component_module_updates => {
64
- :endpoint => "assembly",
65
- :url => "assembly/info_about",
64
+ :endpoint => "assembly",
65
+ :url => "assembly/info_about",
66
66
  :opts => {:subtype=>"instance", :about=>"modules"}
67
67
  },
68
68
  :delete_node => {
@@ -142,7 +142,7 @@ module DTK::Client
142
142
  ]
143
143
  },
144
144
  :identifier_only => {
145
- :node => [
145
+ :node => [
146
146
  ['add-component',"add-component COMPONENT","# Add a component to the node."],
147
147
  ['delete-component',"delete-component COMPONENT-NAME [-y]","# Delete component from workspace's node"],
148
148
  ['info',"info","# Return info about node instance belonging to given workspace."],
@@ -154,7 +154,7 @@ module DTK::Client
154
154
  ['stop', "stop", "# Stop node instance."],
155
155
  ['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# SSH into node, optional parameters are path to identity file."]
156
156
  ],
157
-
157
+
158
158
  :component => [
159
159
  ['info',"info","# Return info about component instance belonging to given node."],
160
160
  ['edit',"edit","# Edit component module related to given component."],
@@ -181,11 +181,20 @@ module DTK::Client
181
181
  # clear_tasks_aux(context_params)
182
182
  #end
183
183
 
184
+ desc "WORKSPACE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow."
185
+ method_option "commit_msg",:aliases => "-m",
186
+ :type => :string,
187
+ :banner => "COMMIT-MSG",
188
+ :desc => "Commit message"
189
+ def execute_workflow(context_params)
190
+ converge_aux(context_params)
191
+ end
192
+
184
193
  desc "WORKSPACE-NAME/ID converge [-m COMMIT-MSG]", "Converge workspace instance."
185
194
  method_option "commit_msg",:aliases => "-m" ,
186
195
  :type => :string,
187
196
  :banner => "COMMIT-MSG",
188
- :desc => "Commit message"
197
+ :desc => "Commit message"
189
198
  def converge(context_params)
190
199
  converge_aux(context_params)
191
200
  end
@@ -205,7 +214,7 @@ module DTK::Client
205
214
 
206
215
  desc "WORKSPACE-NAME/ID push-assembly-updates [NAMESPACE:]SERVICE-MODULE-NAME/ASSEMBLY-NAME", "Push changes made to this workspace to the designated assembly."
207
216
  def push_assembly_updates(context_params)
208
- workspace_id, qualified_assembly_name = context_params.retrieve_arguments([:workspace_id!,:option_1!],method_argument_names)
217
+ workspace_id, qualified_assembly_name = context_params.retrieve_arguments([:workspace_id!,:option_1!],method_argument_names)
209
218
  if qualified_assembly_name =~ /(^[^\/]*)\/([^\/]*$)/
210
219
  service_module_name, assembly_template_name = [$1,$2]
211
220
  else
@@ -218,7 +227,7 @@ module DTK::Client
218
227
  end
219
228
 
220
229
  desc "WORKSPACE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-p] [-m DESCRIPTION]", "Create a new assembly from the workspace instance in the designated service module."
221
- # The option -p will purge the workspace after assembly creation."
230
+ # The option -p will purge the workspace after assembly creation."
222
231
  method_option :purge, :aliases => '-p', :type => :boolean, :default => false
223
232
  method_option "description",:aliases => "-m" ,
224
233
  :type => :string,
@@ -257,7 +266,7 @@ module DTK::Client
257
266
 
258
267
  #only supported at node-level
259
268
  # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
260
- desc "HIDE_FROM_BASE add-component NODE-NAME COMPONENT", "Add a component to a workspace."
269
+ desc "WORKSPACE-NAME/ID add-component COMPONENT", "Add a component to a workspace."
261
270
  def add_component(context_params)
262
271
  response = create_component_aux(context_params)
263
272
  return response unless response.ok?
@@ -319,18 +328,18 @@ module DTK::Client
319
328
  response = delete_component_aux(context_params)
320
329
  return response unless response.ok?
321
330
  @@invalidate_map << :service_node_component
322
-
331
+
323
332
  response
324
333
  end
325
334
  # delete_aux(context_params)
326
335
  end
327
336
 
328
337
  # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
329
- desc "HIDE_FROM_BASE delete-component COMPONENT-NAME [-y]","Delete component from the workspace."
338
+ desc "WORKSPACE-NAME/ID delete-component COMPONENT-NAME [-y]","Delete component from the workspace."
330
339
  method_option :force, :aliases => '-y', :type => :boolean, :default => false
331
340
  def delete_component(context_params)
332
341
  response = delete_component_aux(context_params)
333
-
342
+
334
343
  @@invalidate_map << :service
335
344
  @@invalidate_map << :service_node
336
345
  @@invalidate_map << :service_node_component
@@ -379,9 +388,15 @@ module DTK::Client
379
388
  edit_module_aux(context_params)
380
389
  end
381
390
 
382
- desc "WORKSPACE-NAME/ID edit-workflow", "Edit workflow"
391
+ desc "WORKSPACE-NAME/ID create-workflow WORKFLOW-NAME [--from BASE-WORKFLOW-NAME]", "Create a new workflow in the workspace."
392
+ method_option :from, :type => :string
393
+ def create_workflow(context_params)
394
+ edit_or_create_workflow_aux(context_params,:create => true,:create_from => options.from)
395
+ end
396
+
397
+ desc "WORKSPACE-NAME/ID edit-workflow [WORKFLOW-NAME]", "Edit a workflow in the workspace."
383
398
  def edit_workflow(context_params)
384
- edit_workflow_aux(context_params)
399
+ edit_or_create_workflow_aux(context_params)
385
400
  end
386
401
 
387
402
  desc "WORKSPACE-NAME/ID edit-attributes", "Edit workspace's attributes."
@@ -399,7 +414,7 @@ module DTK::Client
399
414
  # TODO: DTK-2027 might subsume by the dtk actions; currently server changes does not support this command
400
415
  # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
401
416
  desc "HIDE_FROM_BASE execute-tests [--component COMPONENT-NAME] [--timeout TIMEOUT]", "Execute tests. --component filters execution per component, --timeout changes default execution timeout"
402
- method_option :component, :type => :string, :desc => "Component name"
417
+ method_option :component, :type => :string, :desc => "Component name"
403
418
  method_option :timeout, :type => :string, :desc => "Timeout"
404
419
  def execute_tests(context_params)
405
420
  execute_tests_aux(context_params)
@@ -436,7 +451,7 @@ module DTK::Client
436
451
  def list_ssh_access(context_params)
437
452
  list_ssh_access_aux(context_params)
438
453
  end
439
-
454
+
440
455
  desc "WORKSPACE-NAME/ID info", "Get info about content of the workspace."
441
456
  def info(context_params)
442
457
  info_aux(context_params)
@@ -447,11 +462,6 @@ module DTK::Client
447
462
  link_attributes_aux(context_params)
448
463
  end
449
464
 
450
- #desc "WORKSPACE-NAME/ID list-attribute-mappings SERVICE-LINK-NAME/ID", "List attribute mappings associated with service link"
451
- #def list_attribute_mappings(context_params)
452
- # list_attribute_mappings_aux(context_params)
453
- #end
454
-
455
465
  desc "list", ""
456
466
  def list(context_params)
457
467
  if context_params.is_last_command_eql_to?(:node)
@@ -460,7 +470,7 @@ module DTK::Client
460
470
  end
461
471
 
462
472
  desc "WORKSPACE-NAME/ID list-attributes [-f FORMAT] [-t TAG,..] [--links]","List attributes associated with workspace."
463
- method_option :format, :aliases => '-f'
473
+ method_option :format, :aliases => '-f'
464
474
  method_option :tags, :aliases => '-t'
465
475
  method_option :links, :type => :boolean, :default => false, :aliases => '-l'
466
476
  def list_attributes(context_params)
@@ -493,11 +503,16 @@ module DTK::Client
493
503
  list_tasks_aux(context_params)
494
504
  end
495
505
 
496
- desc "WORKSPACE-NAME/ID workflow-info", "Get the structure of the workflow associated with workspace."
506
+ desc "WORKSPACE-NAME/ID workflow-info [WORKFLOW-NAME]", "Get the contents of a workflow associated with the workspace."
497
507
  def workflow_info(context_params)
498
508
  workflow_info_aux(context_params)
499
509
  end
500
510
 
511
+ desc "WORKSPACE-NAME/ID workflow-list", "List the workflows associated with the workspace."
512
+ def workflow_list(context_params)
513
+ workflow_list_aux(context_params)
514
+ end
515
+
501
516
  desc "WORKSPACE-NAME/ID list-violations", "Finds violations in the workspace that will prevent a converge operation."
502
517
  def list_violations(context_params)
503
518
  list_violations_aux(context_params)
@@ -525,8 +540,10 @@ module DTK::Client
525
540
  set_target_aux(context_params)
526
541
  end
527
542
 
528
- desc "WORKSPACE-NAME/ID set-attribute ATTRIBUTE-NAME [VALUE] [-u]", "(Un)Set attribute value. The option -u will unset the attribute's value."
543
+ desc "WORKSPACE-NAME/ID set-attribute ATTRIBUTE-NAME [VALUE] [-u] [-c] [-n]", "(Un)Set attribute value. The option -u will unset the attribute's value, -c to set component-attribute, -n to set node-attribute."
529
544
  method_option :unset, :aliases => '-u', :type => :boolean, :default => false
545
+ method_option :component_attribute, :aliases => '-c', :type => :boolean, :default => false
546
+ method_option :node_attribute, :aliases => '-n', :type => :boolean, :default => false
530
547
  def set_attribute(context_params)
531
548
  set_attribute_aux(context_params)
532
549
  end
@@ -6,8 +6,12 @@ module DTK
6
6
  #
7
7
  class ContextRouter
8
8
 
9
+ extend DTK::Client::Auxiliary
10
+
9
11
  # This method invokes target context task
10
12
  def self.routeTask(target_context, target_method, target_context_params, conn)
13
+ target_context = target_context.to_s
14
+ target_method = target_method.to_s
11
15
 
12
16
  # Initing required params and invoking target_context.target_method
13
17
  load_command(target_context)
data/lib/core.rb CHANGED
@@ -33,7 +33,7 @@ def top_level_execute(entity_name, method_name, context_params=nil, options_args
33
33
  rescue DTK::Client::DtkLoginRequiredError
34
34
  # re-logging user and repeating request
35
35
  DTK::Client::OsUtil.print("Session expired: re-establishing session & repeating given task", :yellow)
36
- DTK::Client::Session.re_initialize()
36
+ DTK::Client::Session.re_initialize
37
37
  top_level_execute_core(entity_name, method_name, context_params, options_args, shell_execute)
38
38
  end
39
39
  end
@@ -48,7 +48,7 @@ def top_level_execute_core(entity_name, method_name, context_params=nil, options
48
48
 
49
49
  entity_name = entity_name.gsub("-","_")
50
50
  load_command(entity_name)
51
- conn = DTK::Client::Session.get_connection()
51
+ conn = DTK::Client::Session.get_connection
52
52
 
53
53
  # if connection parameters are not set up properly then don't execute any command
54
54
  return if validate_connection(conn)
@@ -63,23 +63,11 @@ def top_level_execute_core(entity_name, method_name, context_params=nil, options
63
63
 
64
64
  response_ruby_obj = entity_class.execute_from_cli(conn,method_name,context_params,options_args,shell_execute)
65
65
 
66
- # this will raise error if found
67
- DTK::Client::ResponseErrorHandler.check(response_ruby_obj)
68
-
69
- # this will find appropriate render adapter and give output, returns boolean
70
- if print = response_ruby_obj.render_data()
71
- print = [print] unless print.kind_of?(Array)
72
- print.each do |el|
73
- if el.kind_of?(String)
74
- el.each_line{|l| STDOUT << l}
75
- else
76
- PP.pp(el,STDOUT)
77
- end
78
- end
79
- end
66
+ # it will raise DTK::Client::Error in case of error response
67
+ print_method_response!(response_ruby_obj)
80
68
 
81
69
  # process/print queued message from server
82
- DTK::Shell::MessageQueue.print_messages()
70
+ DTK::Shell::MessageQueue.print_messages
83
71
 
84
72
  rescue DTK::Client::DtkLoginRequiredError => e
85
73
  # this error is handled in method above
@@ -107,7 +95,25 @@ def top_level_execute_core(entity_name, method_name, context_params=nil, options
107
95
  # this are expected application errors
108
96
  DtkLogger.instance.error_pp(e.message, e.backtrace)
109
97
  rescue Exception => e
110
- DtkLogger.instance.fatal_pp("[INTERNAL ERROR] DTK has encountered an error #{e.class}: #{e.message}", e.backtrace)
98
+ client_internal_error = DTK::Client::DtkError::Client.label()
99
+ DtkLogger.instance.fatal_pp("[#{client_internal_error}] DTK has encountered an error #{e.class}: #{e.message}", e.backtrace)
100
+ end
101
+ end
102
+
103
+ def print_method_response!(response_ruby_obj)
104
+ # this will raise error if found
105
+ DTK::Client::ResponseErrorHandler.check(response_ruby_obj)
106
+
107
+ # this will find appropriate render adapter and give output, returns boolean
108
+ if print = response_ruby_obj.render_data
109
+ print = [print] unless print.kind_of?(Array)
110
+ print.each do |el|
111
+ if el.kind_of?(String)
112
+ el.each_line{|l| STDOUT << l}
113
+ else
114
+ PP.pp(el,STDOUT)
115
+ end
116
+ end
111
117
  end
112
118
  end
113
119
 
@@ -125,6 +131,8 @@ def validate_connection(connection)
125
131
  puts "\nDTK will now exit. Please set up your connection properly and try again."
126
132
  return true
127
133
  end
134
+
135
+ false
128
136
  end
129
137
 
130
138
  # check if .add_direct_access file exists, if not then add direct access and create .add_direct_access file
@@ -133,13 +141,13 @@ def resolve_direct_access(params, config_exists=nil)
133
141
 
134
142
  puts "Processing ..." if config_exists
135
143
  # check to see if catalog credentials are set
136
- conn = DTK::Client::Session.get_connection()
144
+ conn = DTK::Client::Session.get_connection
137
145
  response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/check_catalog_credentials"), {}
138
146
 
139
147
  # set catalog credentails
140
148
  if response.ok? && !response.data['catalog_credentials_set']
141
149
  # setting up catalog credentials
142
- catalog_creds = DTK::Client::Configurator.ask_catalog_credentials()
150
+ catalog_creds = DTK::Client::Configurator.ask_catalog_credentials
143
151
  unless catalog_creds.empty?
144
152
  response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/set_catalog_credentials"), { :username => catalog_creds[:username], :password => catalog_creds[:password], :validate => true}
145
153
  if errors = response['errors']
@@ -149,20 +157,20 @@ def resolve_direct_access(params, config_exists=nil)
149
157
  end
150
158
 
151
159
  # response = DTK::Client::Account.add_access(params[:ssh_key_path])
152
- response, matched_pub_key, matched_username = DTK::Client::Account.add_key(params[:ssh_key_path])
160
+ response, matched_pub_key, matched_username = DTK::Client::Account.add_key(params[:ssh_key_path], true, "#{DTK::Client::Session.connection_username}-client")
153
161
 
154
162
  if !response.ok?
155
163
  DTK::Client::OsUtil.print("We were not able to add access for current user. #{response.error_message}. In order to properly use dtk-shell you will have to add access manually ('dtk account add-ssh-key').\n", :yellow)
156
164
  elsif matched_pub_key
157
165
  # message will be displayed by add key # TODO: Refactor this flow
158
166
  DTK::Client::OsUtil.print("Provided SSH PUB key has already been added.", :yellow)
159
- DTK::Client::Configurator.add_current_user_to_direct_access()
167
+ DTK::Client::Configurator.add_current_user_to_direct_access
160
168
  elsif matched_username
161
169
  DTK::Client::OsUtil.print("User with provided name already exists.", :yellow)
162
170
  else
163
171
  # commented out because 'add_key' method called above will also print the same message
164
172
  # DTK::Client::OsUtil.print("Your SSH PUB key has been successfully added.", :yellow)
165
- DTK::Client::Configurator.add_current_user_to_direct_access()
173
+ DTK::Client::Configurator.add_current_user_to_direct_access
166
174
  end
167
175
 
168
176
  response
@@ -173,10 +181,10 @@ module DTK
173
181
  class ResponseErrorHandler
174
182
  class << self
175
183
 
176
- def check_for_session_expiried(response_ruby_obj)
184
+ def check_for_session_expiried(response)
177
185
  error_code = nil
178
- if response_ruby_obj && response_ruby_obj['errors']
179
- response_ruby_obj['errors'].each do |err|
186
+ if response && response['errors']
187
+ response['errors'].each do |err|
180
188
  error_code = err["code"]||(err["errors"] && err["errors"].first["code"])
181
189
  end
182
190
  end
@@ -184,60 +192,12 @@ module DTK
184
192
  return (error_code == "forbidden")
185
193
  end
186
194
 
187
- def check(response_ruby_obj)
188
- # check for errors in response
189
-
190
- unless response_ruby_obj["errors"].nil?
191
- error_msg = ""
192
- error_internal = nil
193
- error_backtrace = nil
194
- error_code = nil
195
- error_on_server = nil
196
-
197
- #TODO: below just 'captures' first error
198
- response_ruby_obj['errors'].each do |err|
199
- error_msg += err["message"] unless err["message"].nil?
200
- error_msg += err["error"] unless err["error"].nil?
201
- error_on_server = true unless err["on_client"]
202
- error_code = err["code"]||(err["errors"] && err["errors"].first["code"])
203
- error_internal ||= (err["internal"] or error_code == "not_found") #"not_found" code is at Ramaze level; so error_internal not set
204
- error_backtrace ||= err["backtrace"]
205
- end
206
-
207
- # normalize it for display
208
- error_msg = error_msg.empty? ? 'Internal DTK Client error, please try again' : "#{error_msg}"
209
-
210
- # if error_internal.first == true
211
- if error_code == "unauthorized"
212
- raise DTK::Client::DtkError, "[UNAUTHORIZED] Your session has been suspended, please log in again."
213
- elsif error_code == "session_timeout"
214
- raise DTK::Client::DtkError, "[SESSION TIMEOUT] Your session has been suspended, please log in again."
215
- elsif error_code == "broken"
216
- raise DTK::Client::DtkError, "[BROKEN] Unable to connect to the DTK server at host: #{Config[:server_host]}"
217
- elsif error_code == "forbidden"
218
- raise DTK::Client::DtkLoginRequiredError, "[FORBIDDEN] Access not granted, please log in again."
219
- elsif error_code == "timeout"
220
- raise DTK::Client::DtkError, "[TIMEOUT ERROR] Server is taking too long to respond."
221
- elsif error_code == "connection_refused"
222
- raise DTK::Client::DtkError, "[CONNECTION REFUSED] Connection refused by server."
223
- elsif error_code == "resource_not_found"
224
- raise DTK::Client::DtkError, "[RESOURCE NOT FOUND] #{error_msg}"
225
- elsif error_code == "pg_error"
226
- raise DTK::Client::DtkError, "[PG_ERROR] #{error_msg}"
227
- elsif error_internal
228
- where = (error_on_server ? "SERVER" : "CLIENT")
229
- #opts = (error_backtrace ? {:backtrace => error_backtrace} : {})
230
- raise DTK::Client::DtkError.new("[#{where} INTERNAL ERROR] #{error_msg}", :backtrace => error_backtrace)
231
- else
232
- # if usage error occurred, display message to console and display that same message to log
233
- raise DTK::Client::DtkError, "[ERROR] #{error_msg}"
234
- end
235
- end
195
+ def check(response)
196
+ DtkError.raise_if_error?(response)
236
197
  end
237
198
  end
238
199
  end
239
200
 
240
-
241
201
  class Log
242
202
  #TODO Stubs
243
203
  def self.info(msg)
@@ -269,26 +229,26 @@ module DTK
269
229
  Config.instance[k]
270
230
  end
271
231
  private
272
- def initialize()
273
- set_defaults()
274
- load_config_file()
275
- validate()
232
+ def initialize
233
+ set_defaults
234
+ load_config_file
235
+ validate
276
236
  end
277
- def set_defaults()
237
+ def set_defaults
278
238
  self[:server_port] = 80
279
239
  self[:assembly_module_base_location] = 'assemblies'
280
240
  self[:secure_connection] = true
281
241
  self[:secure_connection_server_port] = 443
282
242
  end
283
243
 
284
- def load_config_file()
244
+ def load_config_file
285
245
  parse_key_value_file(CONFIG_FILE).each{|k,v|self[k]=v}
286
246
  end
287
247
 
288
248
  def validate
289
249
  #TODO: need to check for legal values
290
250
  missing_keys = REQUIRED_KEYS - keys
291
- raise DTK::Client::DtkError,"Missing config keys (#{missing_keys.join(",")}). Please check your configuration file #{CONFIG_FILE} for required keys!" unless missing_keys.empty?
251
+ raise DTK::Client::DtkError, "Missing config keys (#{missing_keys.join(",")}). Please check your configuration file #{CONFIG_FILE} for required keys!" unless missing_keys.empty?
292
252
  end
293
253
 
294
254
  end
@@ -303,31 +263,35 @@ module DTK
303
263
 
304
264
  attr_accessor :conn
305
265
 
306
- def initialize()
307
- @conn = DTK::Client::Conn.new()
266
+ def initialize
267
+ @conn = DTK::Client::Conn.new
308
268
  end
309
269
 
310
- def self.get_connection()
270
+ def self.get_connection
311
271
  Session.instance.conn
312
272
  end
313
273
 
314
- def self.re_initialize()
274
+ def self.connection_username
275
+ Session.instance.conn.get_username
276
+ end
277
+
278
+ def self.re_initialize
315
279
  Session.instance.conn = nil
316
- Session.instance.conn = DTK::Client::Conn.new()
280
+ Session.instance.conn = DTK::Client::Conn.new
317
281
  Session.instance.conn.cookies
318
282
  end
319
283
 
320
- def self.logout()
284
+ def self.logout
321
285
  # from this point @conn is not valid, since there are no cookies set
322
- Session.instance.conn.logout()
286
+ Session.instance.conn.logout
323
287
  end
324
288
  end
325
289
 
326
290
  class Conn
327
- def initialize()
291
+ def initialize
328
292
  @cookies = Hash.new
329
293
  @connection_error = nil
330
- login()
294
+ login
331
295
  end
332
296
 
333
297
  VERBOSE_MODE_ON = ::DTK::Configuration.get(:verbose_rest_calls)
@@ -338,7 +302,7 @@ module DTK
338
302
  require 'ap'
339
303
  end
340
304
 
341
- def self.get_timeout()
305
+ def self.get_timeout
342
306
  DefaultRestOpts[:timeout]
343
307
  end
344
308
 
@@ -346,6 +310,9 @@ module DTK
346
310
  DefaultRestOpts[:timeout] = timeout_sec
347
311
  end
348
312
 
313
+ def get_username
314
+ get_credentials[:username]
315
+ end
349
316
 
350
317
  def rest_url(route=nil)
351
318
  protocol, port = "http", Config[:server_port].to_s
@@ -387,7 +354,7 @@ module DTK
387
354
  if ResponseErrorHandler.check_for_session_expiried(response)
388
355
  # re-logging user and repeating request
389
356
  DTK::Client::OsUtil.print("Session expired: re-establishing session & re-trying request ...", :yellow)
390
- @cookies = DTK::Client::Session.re_initialize()
357
+ @cookies = DTK::Client::Session.re_initialize
391
358
  response = rest_method_func.call
392
359
  end
393
360
 
@@ -405,7 +372,7 @@ module DTK
405
372
  return !@connection_error.nil?
406
373
  end
407
374
 
408
- def logout()
375
+ def logout
409
376
  response = get_raw rest_url("user/process_logout")
410
377
 
411
378
  # save cookies - no need to persist them
@@ -439,8 +406,8 @@ module DTK
439
406
 
440
407
  include ParseFile
441
408
 
442
- def login()
443
- creds = get_credentials()
409
+ def login
410
+ creds = get_credentials
444
411
  response = post_raw rest_url("user/process_login"),creds
445
412
  errors = response['errors']
446
413
 
@@ -455,14 +422,19 @@ module DTK
455
422
  end
456
423
  end
457
424
 
458
- def get_credentials()
425
+ def set_credentials(username, password)
426
+ @parsed_credentials = { :username => username, :password => password}
427
+ end
428
+
429
+ def get_credentials
459
430
  unless @parsed_credentials
460
431
  cred_file = Config::CRED_FILE
461
432
  raise DTK::Client::DtkError,"Authorization configuration file (#{cred_file}) does not exist" unless File.exists?(cred_file)
462
433
  ret = parse_key_value_file(cred_file)
463
- [:username,:password].each{ |k| raise DTK::Client::DtkError,"cannot find #{k}" unless ret[k] }
434
+ [:username,:password].each{ |k| raise DTK::Client::DtkError, "cannot find #{k}" unless ret[k] }
464
435
  @parsed_credentials = ret
465
436
  end
437
+
466
438
  @parsed_credentials
467
439
  end
468
440