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.
- checksums.yaml +4 -4
- data/bin/dtk +10 -3
- data/bin/dtk-shell +1 -1
- data/lib/command_helpers/git_repo.rb +26 -20
- data/lib/command_helpers/jenkins_client.rb +4 -3
- data/lib/command_helpers/service_importer.rb +37 -25
- data/lib/commands.rb +2 -2
- data/lib/commands/common/thor/assembly_workspace.rb +185 -173
- data/lib/commands/common/thor/base_command_helper.rb +42 -0
- data/lib/commands/common/thor/clone.rb +1 -1
- data/lib/commands/common/thor/module.rb +37 -58
- data/lib/commands/common/thor/module/import.rb +1 -1
- data/lib/commands/common/thor/pull_from_remote.rb +7 -12
- data/lib/commands/common/thor/purge_clone.rb +1 -1
- data/lib/commands/common/thor/push_clone_changes.rb +3 -1
- data/lib/commands/common/thor/task_status.rb +52 -75
- data/lib/commands/common/thor/task_status/refresh_mode.rb +56 -0
- data/lib/commands/common/thor/task_status/snapshot_mode.rb +11 -0
- data/lib/commands/common/thor/task_status/stream_mode.rb +31 -0
- data/lib/commands/common/thor/task_status/stream_mode/element.rb +90 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/no_results.rb +10 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/render.rb +88 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/stage.rb +13 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/task_end.rb +10 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/task_start.rb +10 -0
- data/lib/commands/thor/account.rb +10 -8
- data/lib/commands/thor/assembly.rb +9 -2
- data/lib/commands/thor/component_module.rb +0 -52
- data/lib/commands/thor/library.rb +1 -0
- data/lib/commands/thor/node.rb +1 -36
- data/lib/commands/thor/node_template.rb +4 -47
- data/lib/commands/thor/service.rb +57 -46
- data/lib/commands/thor/service_module.rb +2 -49
- data/lib/commands/thor/target.rb +7 -7
- data/lib/commands/thor/workspace.rb +44 -27
- data/lib/context_router.rb +4 -0
- data/lib/core.rb +71 -99
- data/lib/domain/response.rb +9 -0
- data/lib/domain/response/error_handler.rb +61 -0
- data/lib/dtk-client/version.rb +1 -1
- data/lib/dtk_client.rb +14 -0
- data/lib/dtk_error.rb +91 -0
- data/lib/error.rb +3 -9
- data/lib/execute/cli_pure/cli_rerouter.rb +82 -0
- data/lib/parser/adapters/thor.rb +3 -0
- data/lib/shell.rb +2 -1
- data/lib/shell/domain/context_params.rb +2 -0
- data/lib/util/console.rb +1 -1
- data/lib/util/os_util.rb +1 -0
- data/lib/util/remote_dependency_util.rb +20 -3
- data/lib/view_processor/table_print.rb +7 -25
- metadata +17 -5
- data/lib/commands/common/thor/test_action_agent.rb +0 -39
- data/lib/commands/thor/repo.rb +0 -35
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            module DTK::Client
         | 
| 2 | 
            +
              class BaseCommandHelper
         | 
| 3 | 
            +
                def initialize(command,context_params=nil)
         | 
| 4 | 
            +
                  @command        = command
         | 
| 5 | 
            +
                  @context_params = context_params
         | 
| 6 | 
            +
                  @options        = command.options
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def print_external_dependencies(external_dependencies, location)
         | 
| 10 | 
            +
                  ambiguous        = external_dependencies["ambiguous"]||[]
         | 
| 11 | 
            +
                  amb_sorted       = ambiguous.map { |k,v| "#{k.split('/').last} (#{v.join(', ')})" }
         | 
| 12 | 
            +
                  inconsistent     = external_dependencies["inconsistent"]||[]
         | 
| 13 | 
            +
                  possibly_missing = external_dependencies["possibly_missing"]||[]
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  OsUtil.print("There are inconsistent module dependencies mentioned #{location}: #{inconsistent.join(', ')}", :red) unless inconsistent.empty?
         | 
| 16 | 
            +
                  OsUtil.print("There are missing module dependencies mentioned #{location}: #{possibly_missing.join(', ')}", :yellow) unless possibly_missing.empty?
         | 
| 17 | 
            +
                  OsUtil.print("There are ambiguous module dependencies mentioned #{location}: '#{amb_sorted.join(', ')}'. One of the namespaces should be selected by editing the module_refs file", :yellow) if ambiguous && !ambiguous.empty?
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
               private
         | 
| 21 | 
            +
                def context_params()
         | 
| 22 | 
            +
                  @context_params ||  raise(DtkError, "[ERROR] @context_params is nil")
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def retrieve_arguments(mapping, method_info = nil)
         | 
| 26 | 
            +
                  context_params.retrieve_arguments(mapping, method_info || @command.method_argument_names)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def get_namespace_and_name(*args)
         | 
| 30 | 
            +
                  @command.get_namespace_and_name(*args)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def rest_url(*args)
         | 
| 34 | 
            +
                  @command.rest_url(*args)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def post(*args)
         | 
| 38 | 
            +
                  @command.post(*args)
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -21,36 +21,9 @@ DEFAULT_COMMIT_MSG = "Initial commit." | |
| 21 21 | 
             
            PULL_CATALOGS = ["dtkn"]
         | 
| 22 22 |  | 
| 23 23 | 
             
            module DTK::Client
         | 
| 24 | 
            +
              dtk_require_common_commands('thor/base_command_helper')
         | 
| 24 25 | 
             
              class CommonModule
         | 
| 25 26 | 
             
                dtk_require_common_commands('thor/module/import')
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                def initialize(command,context_params)
         | 
| 28 | 
            -
                  @command        = command
         | 
| 29 | 
            -
                  @context_params = context_params
         | 
| 30 | 
            -
                  @options        = command.options
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                def print_external_dependencies(external_dependencies, location)
         | 
| 34 | 
            -
                  ambiguous        = external_dependencies["ambiguous"]||[]
         | 
| 35 | 
            -
                  amb_sorted       = ambiguous.map { |k,v| "#{k.split('/').last} (#{v.join(', ')})" }
         | 
| 36 | 
            -
                  inconsistent     = external_dependencies["inconsistent"]||[]
         | 
| 37 | 
            -
                  possibly_missing = external_dependencies["possibly_missing"]||[]
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                  OsUtil.print("There are inconsistent module dependencies mentioned #{location}: #{inconsistent.join(', ')}", :red) unless inconsistent.empty?
         | 
| 40 | 
            -
                  OsUtil.print("There are missing module dependencies mentioned #{location}: #{possibly_missing.join(', ')}", :yellow) unless possibly_missing.empty?
         | 
| 41 | 
            -
                  OsUtil.print("There are ambiguous module dependencies mentioned #{location}: '#{amb_sorted.join(', ')}'. One of the namespaces should be selected by editing the module_refs file", :yellow) if ambiguous && !ambiguous.empty?
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
               private
         | 
| 45 | 
            -
                # TODO: when we do this for other areas we can move these things up and use as common classes
         | 
| 46 | 
            -
                # helpers
         | 
| 47 | 
            -
                def retrieve_arguments(mapping, method_info = nil)
         | 
| 48 | 
            -
                  @context_params.retrieve_arguments(mapping, method_info || @command.method_argument_names)
         | 
| 49 | 
            -
                end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                def get_namespace_and_name(*args)
         | 
| 52 | 
            -
                  @command.get_namespace_and_name(*args)
         | 
| 53 | 
            -
                end
         | 
| 54 27 | 
             
              end
         | 
| 55 28 |  | 
| 56 29 | 
             
              module ModuleMixin
         | 
| @@ -157,7 +130,7 @@ module DTK::Client | |
| 157 130 | 
             
                  unless method_opts[:no_error_msg]
         | 
| 158 131 | 
             
                    msg = "Module '#{module_name}' "
         | 
| 159 132 | 
             
                    if version then msg << "version #{version} has been deleted"
         | 
| 160 | 
            -
                    else | 
| 133 | 
            +
                    else msg << "has been deleted"; end
         | 
| 161 134 | 
             
                    OsUtil.print(msg, :yellow)
         | 
| 162 135 | 
             
                  end
         | 
| 163 136 |  | 
| @@ -166,9 +139,9 @@ module DTK::Client | |
| 166 139 |  | 
| 167 140 | 
             
                def set_attribute_module_aux(context_params)
         | 
| 168 141 | 
             
                  if context_params.is_there_identifier?(:attribute)
         | 
| 169 | 
            -
                    mapping = [REQ_MODULE_ID | 
| 142 | 
            +
                    mapping = [REQ_MODULE_ID, :attribute_id!, :option_1]
         | 
| 170 143 | 
             
                  else
         | 
| 171 | 
            -
                    mapping = [REQ_MODULE_ID | 
| 144 | 
            +
                    mapping = [REQ_MODULE_ID, :option_1!, :option_2]
         | 
| 172 145 | 
             
                  end
         | 
| 173 146 |  | 
| 174 147 | 
             
                  module_id, attribute_id, value = context_params.retrieve_arguments(mapping, method_argument_names)
         | 
| @@ -181,13 +154,13 @@ module DTK::Client | |
| 181 154 | 
             
                    "#{module_type}_id".to_sym => module_id
         | 
| 182 155 | 
             
                  }
         | 
| 183 156 |  | 
| 184 | 
            -
                  post rest_url( | 
| 157 | 
            +
                  post rest_url('attribute/set'), post_body
         | 
| 185 158 | 
             
                end
         | 
| 186 159 |  | 
| 187 | 
            -
                def push_module_aux(context_params, internal_trigger=false, opts={})
         | 
| 160 | 
            +
                def push_module_aux(context_params, internal_trigger = false, opts = {})
         | 
| 188 161 | 
             
                  module_type = get_module_type(context_params)
         | 
| 189 | 
            -
                  module_id, module_name = context_params.retrieve_arguments([REQ_MODULE_ID, "#{module_type}_name".to_sym],method_argument_names)
         | 
| 190 | 
            -
                  version = options[ | 
| 162 | 
            +
                  module_id, module_name = context_params.retrieve_arguments([REQ_MODULE_ID, "#{module_type}_name".to_sym], method_argument_names)
         | 
| 163 | 
            +
                  version = options['version']
         | 
| 191 164 |  | 
| 192 165 | 
             
                  module_location = OsUtil.module_location(module_type, module_name, version)
         | 
| 193 166 |  | 
| @@ -196,8 +169,8 @@ module DTK::Client | |
| 196 169 | 
             
                  opts.merge!(:force => options.force?)
         | 
| 197 170 |  | 
| 198 171 | 
             
                  reparse_aux(module_location)
         | 
| 199 | 
            -
                  push_clone_changes_aux(module_type.to_sym, module_id, version, options[ | 
| 200 | 
            -
             | 
| 172 | 
            +
                  push_clone_changes_aux(module_type.to_sym, module_id, version, options['message'] || DEFAULT_COMMIT_MSG, internal_trigger, opts)
         | 
| 173 | 
            +
                end
         | 
| 201 174 |  | 
| 202 175 | 
             
                def create_test_module_aux(context_params)
         | 
| 203 176 | 
             
                  test_module_name = context_params.retrieve_arguments([:option_1!], method_argument_names)
         | 
| @@ -209,10 +182,10 @@ module DTK::Client | |
| 209 182 | 
             
                  create_response = import(context_params)
         | 
| 210 183 |  | 
| 211 184 | 
             
                  unless create_response.ok?
         | 
| 212 | 
            -
                    error_msg = create_response['errors'].select { |er| er['message'].include?  | 
| 185 | 
            +
                    error_msg = create_response['errors'].select { |er| er['message'].include? 'cannot be created since it exists already' }
         | 
| 213 186 | 
             
                    if error_msg.empty?
         | 
| 214 187 | 
             
                      # If server response is not ok and module does not exist on server, delete cloned module, invoke delete method
         | 
| 215 | 
            -
                      delete(context_params | 
| 188 | 
            +
                      delete(context_params, :force_delete => true, :no_error_msg => true)
         | 
| 216 189 | 
             
                    end
         | 
| 217 190 |  | 
| 218 191 | 
             
                    # remove temp directory
         | 
| @@ -227,13 +200,13 @@ module DTK::Client | |
| 227 200 | 
             
                end
         | 
| 228 201 |  | 
| 229 202 | 
             
                def import_module_aux(context_params)
         | 
| 230 | 
            -
                  CommonModule::Import.new(self,context_params).from_file()
         | 
| 203 | 
            +
                  CommonModule::Import.new(self, context_params).from_file()
         | 
| 231 204 | 
             
                end
         | 
| 232 205 |  | 
| 233 206 | 
             
                def install_module_aux(context_params)
         | 
| 234 207 | 
             
                  create_missing_clone_dirs()
         | 
| 235 208 | 
             
                  resolve_direct_access(::DTK::Client::Configurator.check_direct_access)
         | 
| 236 | 
            -
                  remote_module_name, version = context_params.retrieve_arguments([:option_1!, :option_2],method_argument_names)
         | 
| 209 | 
            +
                  remote_module_name, version = context_params.retrieve_arguments([:option_1!, :option_2], method_argument_names)
         | 
| 237 210 | 
             
                  # in case of auto-import via service import, we skip cloning to speed up a process
         | 
| 238 211 | 
             
                  skip_cloning = context_params.get_forwarded_options()['skip_cloning'] if context_params.get_forwarded_options()
         | 
| 239 212 | 
             
                  do_not_raise = context_params.get_forwarded_options()[:do_not_raise] if context_params.get_forwarded_options()
         | 
| @@ -241,40 +214,44 @@ module DTK::Client | |
| 241 214 | 
             
                  module_type  = get_module_type(context_params)
         | 
| 242 215 |  | 
| 243 216 | 
             
                  # ignore_component_error = context_params.get_forwarded_options()[:ignore_component_error]||options.ignore? if context_params.get_forwarded_options()
         | 
| 244 | 
            -
                  ignore_component_error = context_params.get_forwarded_options() ? context_params.get_forwarded_options()[:ignore_component_error] | 
| 217 | 
            +
                  ignore_component_error = context_params.get_forwarded_options().empty? ? options.ignore? : context_params.get_forwarded_options()[:ignore_component_error]
         | 
| 245 218 | 
             
                  additional_message     = context_params.get_forwarded_options()[:additional_message] if context_params.get_forwarded_options()
         | 
| 246 219 |  | 
| 247 | 
            -
                  remote_namespace, local_module_name = get_namespace_and_name(remote_module_name,':')
         | 
| 220 | 
            +
                  remote_namespace, local_module_name = get_namespace_and_name(remote_module_name, ':')
         | 
| 248 221 |  | 
| 249 222 | 
             
                  if clone_dir = Helper(:git_repo).local_clone_dir_exists?(module_type.to_sym, local_module_name, :namespace => remote_namespace, :version => version)
         | 
| 250 | 
            -
                    message = "Module's directory (#{clone_dir}) exists on client. To install this needs to be renamed or removed"
         | 
| 251 | 
            -
                    message +=  | 
| 223 | 
            +
                    message = "Module's directory (#{clone_dir}) exists on client. To install this needs to be renamed or removed."
         | 
| 224 | 
            +
                    # message += '. To ignore this conflict and use existing component module please use -i switch (install REMOTE-SERVICE-NAME -i).' if additional_message
         | 
| 252 225 |  | 
| 253 226 | 
             
                    raise DtkError, message unless ignore_component_error
         | 
| 254 227 | 
             
                  end
         | 
| 255 228 |  | 
| 256 229 | 
             
                  post_body = {
         | 
| 257 | 
            -
                    :remote_module_name => remote_module_name.sub(':','/'),
         | 
| 230 | 
            +
                    :remote_module_name => remote_module_name.sub(':', '/'),
         | 
| 258 231 | 
             
                    :local_module_name => local_module_name,
         | 
| 259 232 | 
             
                    :rsa_pub_key => SSHUtil.rsa_pub_key_content()
         | 
| 260 233 | 
             
                  }
         | 
| 261 234 | 
             
                  post_body.merge!(:do_not_raise => do_not_raise) if do_not_raise
         | 
| 262 235 | 
             
                  post_body.merge!(:ignore_component_error => ignore_component_error) if ignore_component_error
         | 
| 263 236 | 
             
                  post_body.merge!(:additional_message => additional_message) if additional_message
         | 
| 237 | 
            +
                  post_body.merge!(:skip_auto_install => skip_ainstall) if skip_ainstall
         | 
| 264 238 |  | 
| 265 239 | 
             
                  response = post rest_url("#{module_type}/import"), post_body
         | 
| 266 | 
            -
             | 
| 240 | 
            +
             | 
| 241 | 
            +
                  # print permission warnings and then check for other warnings
         | 
| 242 | 
            +
                  are_there_warnings = RemoteDependencyUtil.check_permission_warnings(response)
         | 
| 243 | 
            +
                  are_there_warnings ||= RemoteDependencyUtil.print_dependency_warnings(response, nil, :ignore_permission_warnings => true)
         | 
| 267 244 |  | 
| 268 245 | 
             
                  # prompt to see if user is ready to continue with warnings/errors
         | 
| 269 246 | 
             
                  if are_there_warnings
         | 
| 270 | 
            -
                    return false unless Console.confirmation_prompt( | 
| 247 | 
            +
                    return false unless Console.confirmation_prompt('Do you still want to proceed with import' + '?')
         | 
| 271 248 | 
             
                  end
         | 
| 272 249 |  | 
| 273 250 | 
             
                  # case when we need to import additional components
         | 
| 274 | 
            -
                  if  | 
| 251 | 
            +
                  if response.ok? && !skip_ainstall && (missing_components = response.data(:missing_module_components))
         | 
| 275 252 | 
             
                    required_components = response.data(:required_modules)
         | 
| 276 | 
            -
                    opts = {:do_not_raise=>true}
         | 
| 277 | 
            -
                    module_opts = ignore_component_error ? opts.merge(:ignore_component_error => true) : opts.merge(:additional_message=>true)
         | 
| 253 | 
            +
                    opts = { :do_not_raise => true }
         | 
| 254 | 
            +
                    module_opts = ignore_component_error ? opts.merge(:ignore_component_error => true) : opts.merge(:additional_message => true)
         | 
| 278 255 | 
             
                    module_opts.merge!(:update_none => true) if options.update_none?
         | 
| 279 256 |  | 
| 280 257 | 
             
                    continue = trigger_module_auto_import(missing_components, required_components, module_opts)
         | 
| @@ -286,11 +263,10 @@ module DTK::Client | |
| 286 263 | 
             
                    response = post rest_url("#{module_type}/import"), post_body
         | 
| 287 264 |  | 
| 288 265 | 
             
                    # we set skip cloning since it is already done by import
         | 
| 289 | 
            -
                    puts  | 
| 266 | 
            +
                    puts ' Done'
         | 
| 290 267 | 
             
                  end
         | 
| 291 268 |  | 
| 292 | 
            -
                  return response if | 
| 293 | 
            -
                  # module_name,repo_url,branch,version = response.data(:module_name, :repo_url, :workspace_branch, :version)
         | 
| 269 | 
            +
                  return response if !response.ok? || response.data(:does_not_exist)
         | 
| 294 270 | 
             
                  module_id, module_name, namespace, repo_url, branch, version = response.data(:module_id, :module_name, :namespace, :repo_url, :workspace_branch, :version)
         | 
| 295 271 |  | 
| 296 272 | 
             
                  if error = response.data(:dsl_parse_error)
         | 
| @@ -309,13 +285,13 @@ module DTK::Client | |
| 309 285 |  | 
| 310 286 | 
             
                def delete_from_catalog_aux(context_params)
         | 
| 311 287 | 
             
                  module_type        = get_module_type(context_params)
         | 
| 312 | 
            -
                  remote_module_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
         | 
| 288 | 
            +
                  remote_module_name = context_params.retrieve_arguments([:option_1!], method_argument_names)
         | 
| 313 289 |  | 
| 314 290 | 
             
                  # remote_module_name can be namespace:name or namespace/name
         | 
| 315 291 | 
             
                  remote_namespace, remote_module_name = get_namespace_and_name(remote_module_name, ':')
         | 
| 316 292 |  | 
| 317 293 | 
             
                  unless options.force? || options.confirmed?
         | 
| 318 | 
            -
                    return unless Console.confirmation_prompt("Are you sure you want to delete remote #{module_type} '#{remote_namespace.nil? ? '' : remote_namespace+'/'}#{remote_module_name}' and all items contained in it"+'?')
         | 
| 294 | 
            +
                    return unless Console.confirmation_prompt("Are you sure you want to delete remote #{module_type} '#{remote_namespace.nil? ? '' : remote_namespace + '/'}#{remote_module_name}' and all items contained in it" + '?')
         | 
| 319 295 | 
             
                  end
         | 
| 320 296 |  | 
| 321 297 | 
             
                  post_body = {
         | 
| @@ -330,7 +306,7 @@ module DTK::Client | |
| 330 306 |  | 
| 331 307 | 
             
                def publish_module_aux(context_params)
         | 
| 332 308 | 
             
                  module_type  = get_module_type(context_params)
         | 
| 333 | 
            -
                  module_id, input_remote_name = context_params.retrieve_arguments([REQ_MODULE_ID, :option_1],method_argument_names)
         | 
| 309 | 
            +
                  module_id, input_remote_name = context_params.retrieve_arguments([REQ_MODULE_ID, :option_1], method_argument_names)
         | 
| 334 310 |  | 
| 335 311 | 
             
                  post_body = {
         | 
| 336 312 | 
             
                    "#{module_type}_id".to_sym => module_id,
         | 
| @@ -354,6 +330,7 @@ module DTK::Client | |
| 354 330 | 
             
                  version      = options.version
         | 
| 355 331 | 
             
                  module_type  = get_module_type(context_params)
         | 
| 356 332 | 
             
                  skip_recursive_pull = context_params.get_forwarded_options()[:skip_recursive_pull]
         | 
| 333 | 
            +
                  ignore_dependency_merge_conflict = context_params.get_forwarded_options()[:skip_recursive_pull]
         | 
| 357 334 |  | 
| 358 335 | 
             
                  raise DtkValidationError, "You have to provide valid catalog to pull changes from! Valid catalogs: #{PULL_CATALOGS}" unless catalog
         | 
| 359 336 |  | 
| @@ -365,9 +342,11 @@ module DTK::Client | |
| 365 342 | 
             
                      :force               => options.force?,
         | 
| 366 343 | 
             
                      :version             => version,
         | 
| 367 344 | 
             
                      :remote_namespace    => options.namespace,
         | 
| 368 | 
            -
                      :skip_recursive_pull => skip_recursive_pull
         | 
| 345 | 
            +
                      :skip_recursive_pull => skip_recursive_pull,
         | 
| 346 | 
            +
                      :ignore_dependency_merge_conflict => ignore_dependency_merge_conflict
         | 
| 369 347 | 
             
                    }
         | 
| 370 348 |  | 
| 349 | 
            +
                    opts.merge!(:do_not_raise => true) if (context_params.get_forwarded_options()||{})[:do_not_raise]
         | 
| 371 350 | 
             
                    response = pull_from_remote_aux(module_type.to_sym, module_id, opts)
         | 
| 372 351 | 
             
                    return response unless response.ok?
         | 
| 373 352 |  | 
| @@ -34,7 +34,7 @@ module DTK::Client | |
| 34 34 | 
             
                    unless rsa_pub_key
         | 
| 35 35 | 
             
                      raise DtkError,"No File found at (#{path_to_key}). Path is wrong or it is necessary to generate the public rsa key (e.g., run ssh-keygen -t rsa)"
         | 
| 36 36 | 
             
                    end
         | 
| 37 | 
            -
                    opts_perform_locally = remote_params.merge(:full_module_name => full_module_name, :force => opts[:force])
         | 
| 37 | 
            +
                    opts_perform_locally = remote_params.merge(:full_module_name => full_module_name, :force => opts[:force], :do_not_raise => opts[:do_not_raise], :ignore_dependency_merge_conflict => opts[:ignore_dependency_merge_conflict])
         | 
| 38 38 | 
             
                    PullFromRemote.perform_locally(self,module_type,module_id,module_name,opts_perform_locally)
         | 
| 39 39 | 
             
                  else
         | 
| 40 40 | 
             
                    # TODO: see if this works correctly
         | 
| @@ -47,10 +47,11 @@ module DTK::Client | |
| 47 47 | 
             
                ##
         | 
| 48 48 | 
             
                #
         | 
| 49 49 | 
             
                # module_type: will be :component_module or :service_module
         | 
| 50 | 
            -
                def import_module_component_dependencies(module_type, module_id, remote_namespace=nil)
         | 
| 50 | 
            +
                def import_module_component_dependencies(module_type, module_id, remote_namespace = nil)
         | 
| 51 51 | 
             
                  response = resolve_pull_from_remote_on_server(module_type, module_id, remote_namespace)
         | 
| 52 52 |  | 
| 53 53 | 
             
                  print "Resolving dependencies please wait ... "
         | 
| 54 | 
            +
                  RemoteDependencyUtil.check_permission_warnings(response)
         | 
| 54 55 |  | 
| 55 56 | 
             
                  # install them all!
         | 
| 56 57 | 
             
                  if (response.ok? && !(missing_components = response.data(:missing_modules)).empty?)
         | 
| @@ -91,21 +92,15 @@ module DTK::Client | |
| 91 92 | 
             
                    response = cmd_obj.Helper(:git_repo).pull_changes(module_type,module_name,opts)
         | 
| 92 93 |  | 
| 93 94 | 
             
                    # return response unless response.ok?
         | 
| 94 | 
            -
                    if  | 
| 95 | 
            -
                      puts  | 
| 95 | 
            +
                    if custom_message = response.data[:custom_message]
         | 
| 96 | 
            +
                      puts custom_message
         | 
| 97 | 
            +
                    elsif (response.data[:diffs].nil? || response.data[:diffs].empty?)
         | 
| 98 | 
            +
                      puts "No changes to pull from remote." unless response['errors']
         | 
| 96 99 | 
             
                    else
         | 
| 97 100 | 
             
                      puts "Changes pulled from remote"
         | 
| 98 101 | 
             
                    end
         | 
| 99 102 |  | 
| 100 103 | 
             
                    return response
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                    # removing this for now, because we will use push-clone-changes as part of pull-from-remote command
         | 
| 103 | 
            -
                    # post_body = {
         | 
| 104 | 
            -
                    #   id_field(module_type) => module_id,
         | 
| 105 | 
            -
                    #   :commit_sha => response.data[:commit_sha],
         | 
| 106 | 
            -
                    #   :json_diffs => JSON.generate(response.data[:diffs])
         | 
| 107 | 
            -
                    # }
         | 
| 108 | 
            -
                    # post rest_url("#{module_type}/update_model_from_clone"), post_body
         | 
| 109 104 | 
             
                  end
         | 
| 110 105 |  | 
| 111 106 | 
             
                  def self.perform_on_server(cmd_obj,module_type,module_id,module_name,remote_params)
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module DTK::Client
         | 
| 2 2 | 
             
              module PurgeCloneMixin
         | 
| 3 | 
            -
                def purge_clone_aux(module_type,opts={})
         | 
| 3 | 
            +
                def purge_clone_aux(module_type, opts = {})
         | 
| 4 4 | 
             
                  module_name = opts[:module_name]
         | 
| 5 5 | 
             
                  version = opts[:version]
         | 
| 6 6 | 
             
                  opts_module_loc = (opts[:assembly_module] ? {:assembly_module => opts[:assembly_module]} : Hash.new)
         | 
| @@ -16,7 +16,7 @@ module DTK::Client | |
| 16 16 |  | 
| 17 17 | 
             
                  unless File.directory?(module_location)
         | 
| 18 18 | 
             
                    return if opts[:skip_cloning]
         | 
| 19 | 
            -
                    if Console.confirmation_prompt("Push not possible, module '#{module_name}#{version && "-#{version}"}' has not been cloned. Would you like to clone module now"+'?')
         | 
| 19 | 
            +
                    if opts[:force_clone] || Console.confirmation_prompt("Push not possible, module '#{module_name}#{version && "-#{version}"}' has not been cloned. Would you like to clone module now"+'?')
         | 
| 20 20 | 
             
                      clone_aux(module_type, module_id, version, true, true, opts)
         | 
| 21 21 | 
             
                    else
         | 
| 22 22 | 
             
                      return
         | 
| @@ -32,12 +32,14 @@ module DTK::Client | |
| 32 32 | 
             
                  repo_obj   = response.data(:repo_obj)
         | 
| 33 33 | 
             
                  json_diffs = JSON.generate(response.data(:diffs))
         | 
| 34 34 | 
             
                  post_body  = get_workspace_branch_info_post_body(module_type, module_id, version, opts).merge(:json_diffs => json_diffs, :commit_sha => commit_sha)
         | 
| 35 | 
            +
             | 
| 35 36 | 
             
                  post_body.merge!(:modification_type => opts[:modification_type]) if opts[:modification_type]
         | 
| 36 37 | 
             
                  post_body.merge!(:force_parse => true) if options['force-parse'] || opts[:force_parse]
         | 
| 37 38 | 
             
                  post_body.merge!(:update_from_includes => true) if opts[:update_from_includes]
         | 
| 38 39 | 
             
                  post_body.merge!(:service_instance_module => true) if opts[:service_instance_module]
         | 
| 39 40 | 
             
                  post_body.merge!(:current_branch_sha => opts[:current_branch_sha]) if opts[:current_branch_sha]
         | 
| 40 41 | 
             
                  post_body.merge!(:force => opts[:force]) if opts[:force]
         | 
| 42 | 
            +
                  post_body.merge!(:task_action => opts[:task_action]) if opts[:task_action]
         | 
| 41 43 |  | 
| 42 44 | 
             
                  if opts[:set_parsed_false]
         | 
| 43 45 | 
             
                    post_body.merge!(:set_parsed_false => true)
         | 
| @@ -1,86 +1,63 @@ | |
| 1 1 | 
             
            module DTK::Client
         | 
| 2 2 | 
             
              module TaskStatusMixin
         | 
| 3 | 
            -
                def task_status_aux( | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
                       | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                          # stop pulling when top level task succeds, fails or timeout
         | 
| 13 | 
            -
                          if response and response.data and response.data.first
         | 
| 14 | 
            -
                            #TODO: may fix in server, but now top can have non executing state but a concurrent branch can execute; so
         | 
| 15 | 
            -
                            #chanding bloew for time being
         | 
| 16 | 
            -
                            #break unless response.data.first["status"].eql? "executing"
         | 
| 17 | 
            -
                            # TODO: There is bug where we do not see executing status on start so we have to wait until at 
         | 
| 18 | 
            -
                            # least one 'successed' has been found
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                            top_task_failed = response.data.first['status'].eql?('failed')
         | 
| 21 | 
            -
                            is_pending   = (response.data.select {|r|r["status"].nil? }).size > 0
         | 
| 22 | 
            -
                            is_executing = (response.data.select {|r|r["status"].eql? "executing"}).size > 0
         | 
| 23 | 
            -
                            is_failed    = (response.data.select {|r|r["status"].eql? "failed"}).size > 0
         | 
| 24 | 
            -
                            is_cancelled = response.data.first["status"].eql?("cancelled")
         | 
| 25 | 
            -
                            
         | 
| 26 | 
            -
                            # commented out because of DTK-1804
         | 
| 27 | 
            -
                            # when some of the converge tasks fail, stop task-status --wait and set task status to '' for remaining tasks which are not executed
         | 
| 28 | 
            -
                            # if is_failed
         | 
| 29 | 
            -
                              # response.data.each {|r| (r["status"] = "") if r["status"].eql?("executing")}
         | 
| 30 | 
            -
                              # is_cancelled = true
         | 
| 31 | 
            -
                            # end
         | 
| 32 | 
            -
                            is_cancelled = true if top_task_failed
         | 
| 33 | 
            -
                            
         | 
| 34 | 
            -
                            unless (is_executing || is_pending) && !is_cancelled
         | 
| 35 | 
            -
                              system('clear')
         | 
| 36 | 
            -
                              response.print_error_table = true
         | 
| 37 | 
            -
                              response.render_table(:task_status)
         | 
| 38 | 
            -
                              return response
         | 
| 39 | 
            -
                            end
         | 
| 40 | 
            -
                          end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                          response.render_table(:task_status)
         | 
| 43 | 
            -
                          system('clear')
         | 
| 44 | 
            -
                          response.render_data(true)
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                          Console.wait_animation("Watching '#{type}' task status [ #{DEBUG_SLEEP_TIME} seconds refresh ] ",DEBUG_SLEEP_TIME)
         | 
| 47 | 
            -
                        end
         | 
| 48 | 
            -
                      rescue Interrupt => e
         | 
| 49 | 
            -
                        puts ""
         | 
| 50 | 
            -
                        # this tells rest of the flow to skip rendering of this response
         | 
| 51 | 
            -
                        response.skip_render = true unless response.nil?
         | 
| 52 | 
            -
                      end
         | 
| 3 | 
            +
                def task_status_aux(mode, object_id, object_type, opts={})
         | 
| 4 | 
            +
                  case mode
         | 
| 5 | 
            +
                    when :refresh
         | 
| 6 | 
            +
                      TaskStatus::RefreshMode.new(self,mode,object_id,object_type).task_status(opts)
         | 
| 7 | 
            +
                    when :snapshot 
         | 
| 8 | 
            +
                      TaskStatus::SnapshotMode.new(self,mode,object_id,object_type).task_status(opts)
         | 
| 9 | 
            +
                    when :stream  
         | 
| 10 | 
            +
                      assembly_or_workspace_id = object_id
         | 
| 11 | 
            +
                      task_status_stream(assembly_or_workspace_id)
         | 
| 53 12 | 
             
                    else
         | 
| 54 | 
            -
                       | 
| 55 | 
            -
                       | 
| 56 | 
            -
                      response.render_table(:task_status)
         | 
| 57 | 
            -
                    end
         | 
| 13 | 
            +
                      legal_modes = [:refresh,:snapshot,:stream]
         | 
| 14 | 
            +
                      raise DtkError::Usage.new("Illegal mode '#{mode}'; legal modes are: #{legal_modes.join(', ')}")
         | 
| 58 15 | 
             
                  end
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def task_status_stream(assembly_or_workspace_id)
         | 
| 19 | 
            +
                  TaskStatus::StreamMode.new(self,:stream,assembly_or_workspace_id,:assembly).get_and_render()
         | 
| 20 | 
            +
                end
         | 
| 59 21 |  | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
                      :format => :list
         | 
| 65 | 
            -
                    }
         | 
| 66 | 
            -
                    response = post rest_url("#{type}/task_status"), post_body
         | 
| 67 | 
            -
                    
         | 
| 68 | 
            -
                    raise DTK::Client::DtkError, "[SERVER ERROR] #{response['errors'].first['message']}." if response["status"].eql?('notok')
         | 
| 69 | 
            -
                       
         | 
| 70 | 
            -
                    response.override_command_class("list_task")
         | 
| 71 | 
            -
                    puts response.render_data
         | 
| 22 | 
            +
                def list_task_info_aux(object_type, object_id)
         | 
| 23 | 
            +
                  response = TaskStatus.new(self,object_id,object_type).post_call(:form => :list)
         | 
| 24 | 
            +
                  unless response.ok?
         | 
| 25 | 
            +
                    DtkError.raise_error(response)
         | 
| 72 26 | 
             
                  end
         | 
| 27 | 
            +
                  response.override_command_class("list_task")
         | 
| 28 | 
            +
                  puts response.render_data
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              dtk_require_common_commands('thor/base_command_helper')
         | 
| 33 | 
            +
              class TaskStatus < BaseCommandHelper
         | 
| 34 | 
            +
                require File.expand_path('task_status/snapshot_mode',File.dirname(__FILE__))
         | 
| 35 | 
            +
                require File.expand_path('task_status/refresh_mode',File.dirname(__FILE__))
         | 
| 36 | 
            +
                require File.expand_path('task_status/stream_mode',File.dirname(__FILE__))
         | 
| 73 37 |  | 
| 74 | 
            -
             | 
| 75 | 
            -
                   | 
| 76 | 
            -
                     | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 38 | 
            +
                def initialize(command,mode,object_id,object_type)
         | 
| 39 | 
            +
                  super(command)
         | 
| 40 | 
            +
                  @mode        = mode
         | 
| 41 | 
            +
                  @object_id   = object_id
         | 
| 42 | 
            +
                  @object_type = object_type
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                private
         | 
| 46 | 
            +
                def post_body(opts={})
         | 
| 47 | 
            +
                  id_field = "#{@object_type}_id".to_sym
         | 
| 48 | 
            +
                  PostBody.new(
         | 
| 49 | 
            +
                    id_field                => @object_id,
         | 
| 50 | 
            +
                    :form?                  => opts[:form],
         | 
| 51 | 
            +
                    :summarize_node_groups? => opts[:summarize]
         | 
| 52 | 
            +
                 )
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
                def post_call(opts={})
         | 
| 55 | 
            +
                  response = post rest_url("#{@object_type}/task_status"), post_body(opts)
         | 
| 56 | 
            +
                  unless response.ok?
         | 
| 57 | 
            +
                    DtkError.raise_error(response)
         | 
| 83 58 | 
             
                  end
         | 
| 59 | 
            +
                  response
         | 
| 84 60 | 
             
                end
         | 
| 85 61 |  | 
| 62 | 
            +
              end
         | 
| 86 63 | 
             
            end
         |