dtk-client 0.5.14 → 0.5.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ODg5ZmJhZjg4YWIxZGY3YmQ5OWY5OTE4NDFiYmFmOWMzNWQ2ODk3NQ==
5
- data.tar.gz: !binary |-
6
- OTQ3MGVkMDQ1NzY2YWJmNmNiZjJmZjFkMmVlYTA1Yjg4MzU5MzEzNg==
2
+ SHA1:
3
+ metadata.gz: 988f4e6645da4af4e3907fe6ed38d8f457cd5d9c
4
+ data.tar.gz: ec2260330f913cf07d40f3ed455c8bb28003db04
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ODdkYWU3NGJlZWFjNDgyOWJhODZkY2I2ZmFlNWMzYzYyODAwNzY4NDAxMjk4
10
- MWFkMzc3ODdlYjJkZTI3ZWUxZGE5ZWVmZTk4NmZiODU0NGYzNWFjNzBmMTUx
11
- MzRhZjJjNmIzODRhNmE1NjhkZTE5YjM4NjM1NzFmMWMzNGJkNjI=
12
- data.tar.gz: !binary |-
13
- MDVmOTQ4MDZiNjVjOWQxODg5M2Y4YzFiODMzY2VmN2Q1YzZlYWIxMDk5MjNl
14
- YjhmNTRkNzRmMjQ2NGQ3NjcyOWIwZDNhNjVjZDVmNjQ4NmI4YmNlNzIzNzU4
15
- MGE0YTk2MzI0MDYwMDFiODUxOTQzODlhYzkzMDIyOWZhMzQzMzE=
6
+ metadata.gz: 96f830afde5b005ffa1f1998f4cb206dcda17a1e1c227f44405110976ae9cbc5d181a3094ab7f9d744b178fa9de8184f32cfa750f56cc02ad83ba972c3b219f5
7
+ data.tar.gz: 880b7ab10bbba7a5c2d9e33a43a9cc0a5056c48c92b15659cf5de44649bdea9659ca3795f6f26789deb00b88bcd4f1bed4395ba12c8f49a9e52b30982b23d14e
@@ -817,6 +817,101 @@ module DTK::Client
817
817
  end
818
818
  end
819
819
 
820
+ def execute_tests_v2_aux(context_params)
821
+ assembly_or_workspace_id,node_id = context_params.retrieve_arguments([REQ_ASSEMBLY_OR_WS_ID,:node_id],method_argument_names)
822
+
823
+ execute_test_tries = 30
824
+ execute_test_sleep = 1
825
+
826
+ if !options['timeout'].nil?
827
+ begin
828
+ execute_test_tries = Integer(options['timeout'])
829
+ rescue
830
+ raise DTK::Client::DtkValidationError, "Timeout value is not valid"
831
+ end
832
+ end
833
+
834
+ #Get list of components on particular node
835
+ post_body = {
836
+ :assembly_id => assembly_or_workspace_id,
837
+ :node_id => node_id,
838
+ :subtype => "instance",
839
+ :about => "components"
840
+ }
841
+
842
+ response = post(rest_url("assembly/info_about"),post_body)
843
+
844
+ components = []
845
+ if !response['data'].nil?
846
+ response['data'].each do |c|
847
+ components << c['display_name']
848
+ end
849
+ end
850
+
851
+ #Filter out request per specific component
852
+ #Filter works for two types of component notation provided: node/component and component
853
+ if !options["component"].nil?
854
+ components.reject! do |c|
855
+ if options["component"].include? "/"
856
+ c != options["component"]
857
+ else
858
+ c.split("/").last != options["component"]
859
+ end
860
+ end
861
+ end
862
+ components = nil if components.empty?
863
+
864
+ post_body = {
865
+ :assembly_id => assembly_or_workspace_id,
866
+ :node_id => node_id,
867
+ :components => components
868
+ }
869
+
870
+ response = post(rest_url("assembly/initiate_execute_tests_v2"),post_body)
871
+
872
+ raise DTK::Client::DtkValidationError, response.data(:errors).first if response.data(:errors)
873
+ return response unless response.ok?
874
+
875
+ action_results_id = response.data(:action_results_id)
876
+ end_loop, response, count, ret_only_if_complete = false, nil, 0, true
877
+
878
+ until end_loop do
879
+ post_body = {
880
+ :action_results_id => action_results_id,
881
+ :return_only_if_complete => ret_only_if_complete,
882
+ :disable_post_processing => false,
883
+ :sort_key => "module_name"
884
+ }
885
+ response = post(rest_url("assembly/get_action_results"),post_body)
886
+ count += 1
887
+ if count > execute_test_tries or response.data(:is_complete)
888
+ error_msg = ""
889
+ response.data(:results).each do |k,v|
890
+ unless v.nil?
891
+ error_msg << v['test_error'] if v.to_s.include?('test_error')
892
+ end
893
+ end
894
+ raise DTK::Client::DtkError, "Error while executing test script:\n" + error_msg + "Please fix test script with edit-component-module command and try again." unless error_msg.empty?
895
+ end_loop = true
896
+ else
897
+ #last time in loop return whetever is there
898
+ if count == execute_test_tries
899
+ ret_only_if_complete = false
900
+ end
901
+ sleep execute_test_sleep
902
+ end
903
+ end
904
+
905
+ if (response.data(:results).empty? && options['timeout'].nil?)
906
+ raise DTK::Client::DtkValidationError, "Could not finish execution of tests in default timeframe (#{execute_test_tries} seconds). Try again with passing --timeout TIMEOUT parameter"
907
+ elsif (response.data(:results).empty? && !options['timeout'].nil?)
908
+ raise DTK::Client::DtkValidationError, "Could not finish execution of tests in set timeframe (#{execute_test_tries} seconds). Try again with increasing --timeout TIMEOUT parameter"
909
+ else
910
+ response.set_data(*response.data(:results))
911
+ response.render_table(:execute_tests_data_v2)
912
+ end
913
+ end
914
+
820
915
  def get_ps_aux(context_params)
821
916
  get_ps_tries = 6
822
917
  get_ps_sleep = 0.5
@@ -2,7 +2,7 @@ module DTK::Client
2
2
  module CommonMixin
3
3
  private
4
4
  #returns module_name,repo_url,branch,not_ok_response( only if error)
5
- def workspace_branch_info(module_type,module_id,version,opts={})
5
+ def workspace_branch_info(module_type, module_id, version, opts={})
6
6
  if info = opts[:workspace_branch_info]
7
7
  [info[:module_name],info[:repo_url],info[:branch]]
8
8
  else
@@ -16,7 +16,7 @@ module DTK::Client
16
16
  end
17
17
  end
18
18
 
19
- def get_workspace_branch_info_post_body(module_type,module_id,version_explicit,opts={})
19
+ def get_workspace_branch_info_post_body(module_type, module_id, version_explicit, opts={})
20
20
  id_field = "#{module_type}_id"
21
21
  post_body = {
22
22
  id_field => module_id
@@ -31,7 +31,7 @@ module DTK::Client
31
31
  post_body
32
32
  end
33
33
 
34
- def get_remote_module_info_aux(module_type,module_id,remote_namespace,version=nil)
34
+ def get_remote_module_info_aux(module_type, module_id, remote_namespace, version=nil, module_refs_content=nil)
35
35
  id_field = "#{module_type}_id"
36
36
  rsa_pub_value = SSHUtil.rsa_pub_key_content()
37
37
 
@@ -43,8 +43,11 @@ module DTK::Client
43
43
  }
44
44
  post_body.merge!(:version => version) if version
45
45
  post_body.merge!(:remote_namespace => remote_namespace) if remote_namespace
46
+ post_body.merge!(:module_ref_content => module_refs_content) if module_refs_content && !module_refs_content.empty?
46
47
 
47
- post(rest_url("#{module_type}/get_remote_module_info"),post_body)
48
+ response = post(rest_url("#{module_type}/get_remote_module_info"),post_body)
49
+ RemoteDependencyUtil.print_dependency_warnings(response)
50
+ response
48
51
  end
49
52
 
50
53
  end
@@ -80,7 +80,7 @@ module DTK::Client
80
80
  if file_to_edit
81
81
  "Would you like to commit changes to the file?"
82
82
  else
83
- "Would you like to commit and push ALL the changes?"
83
+ "Would you like to commit ALL the changes?"
84
84
  end
85
85
  confirmed_ok = Console.confirmation_prompt(confirm_msg)
86
86
  end
@@ -0,0 +1,78 @@
1
+ dtk_require_from_base('configurator')
2
+ module DTK::Client
3
+ module InventoryParserMixin
4
+ private
5
+
6
+ def parse_inventory_file(file_path)
7
+ ssh_creds_path = ::DTK::Client::Configurator::NODE_SSH_CREDENTIALS
8
+ ssh_creds_data = parse_ssh_credentials_file(ssh_creds_path)
9
+
10
+ hash = validate_inventory_data(file_path)
11
+
12
+ ret = Hash.new
13
+ defaults = hash["defaults"]
14
+
15
+ hash["nodes"].each do |node_name, data|
16
+ display_name = data["name"]||node_name
17
+ ssh_credentials = data["ssh_credentials"]||defaults["ssh_credentials"]
18
+
19
+ raise DtkValidationError, "Credentials for '#{ssh_credentials}' does not exist in credentials file '#{ssh_creds_path}'" unless ssh_creds_data.include?(ssh_credentials)
20
+
21
+ ref = "physical--#{display_name}"
22
+ ret[ref] = {
23
+ :display_name => display_name,
24
+ :os_type => data["os_type"]||defaults["os_type"],
25
+ :managed => false,
26
+ :external_ref => {:type => "physical", :routable_host_address => node_name, :ssh_credentials => ssh_creds_data["#{ssh_credentials}"]}
27
+ }
28
+ end
29
+
30
+ ret
31
+ end
32
+
33
+ def parse_ssh_credentials_file(file_path)
34
+ begin
35
+ data = YAML.load_file(file_path)
36
+ rescue SyntaxError => e
37
+ raise DSLParsing::YAMLParsing.new("YAML parsing error #{e.message} in file", file_path)
38
+ end
39
+
40
+ data.each do |k,v|
41
+ raise DtkValidationError, "File: '#{file_path}'. Ssh credentials '#{k}' missing required field 'ssh_user'." unless v['ssh_user']
42
+ raise DtkValidationError, "File: '#{file_path}'. Ssh credentials '#{k}' should contain 'ssh_password' or 'sudo_password'." unless (v['ssh_password'] || v['sudo_password'])
43
+ end
44
+
45
+ data
46
+ end
47
+
48
+ def validate_inventory_data(file_path)
49
+ begin
50
+ data = YAML.load_file(file_path)
51
+ rescue SyntaxError => e
52
+ raise DSLParsing::YAMLParsing.new("YAML parsing error #{e.message} in file", file_path)
53
+ end
54
+
55
+ defaults = data['defaults']||[]
56
+ nodes = data['nodes']||[]
57
+
58
+ nodes.each do |k,v|
59
+ os_type = v['os_type']||defaults['os_type']
60
+ ssh_credentials = v['ssh_credentials']||defaults['ssh_credentials']
61
+
62
+ # os_type is required field and should be set through node specific fields or used from defaults
63
+ raise DtkValidationError, "Missing required field 'os_type' for node '#{k}'." unless os_type
64
+
65
+ # ssh_credentials is required field and should be set through node specific fields or used from defaults
66
+ raise DtkValidationError, "Missing required field 'ssh_credentials' for node '#{k}'." unless ssh_credentials
67
+
68
+ # currently we support 'ubuntu', 'centos, 'redhat' and 'debian' as os types and should be set through node specific field
69
+ # or used from defaults
70
+ raise DtkValidationError, "Os_type '#{os_type}' is not valid for node '#{k}'. Valid os types: #{ValidOsTypes}." unless ValidOsTypes.include?(os_type)
71
+ end
72
+
73
+ data
74
+ end
75
+ ValidOsTypes = ['ubuntu', 'centos', 'redhat', 'debian']
76
+
77
+ end
78
+ end
@@ -15,7 +15,7 @@ module DTK::Client
15
15
  :remote_namespace? => remote_namespace,
16
16
  :rsa_pub_key? => rsa_pub_key
17
17
  )
18
- response = post(rest_url("#{module_type}/get_remote_module_info"),post_body)
18
+ response = post(rest_url("#{module_type}/get_remote_module_info"),post_body)
19
19
  return response unless response.ok?
20
20
  module_name = response.data(:module_name)
21
21
  remote_params = response.data_hash_form(:remote_repo_url,:remote_repo,:remote_branch)
@@ -23,7 +23,7 @@ module DTK::Client
23
23
 
24
24
  # check and import component module dependencies before importing service itself
25
25
  if (module_type == :service_module)
26
- import_module_component_dependencies(module_id,remote_namespace)
26
+ import_module_component_dependencies(module_id,remote_namespace)
27
27
  end
28
28
  # check whether a local module exists to determine whether pull from local clone or try to pull from server
29
29
  if Helper(:git_repo).local_clone_exists?(module_type,module_name,version)
@@ -44,12 +44,13 @@ module DTK::Client
44
44
  def import_module_component_dependencies(module_id,remote_namespace=nil)
45
45
  post_body = PostBody.new(
46
46
  :service_module_id => module_id,
47
- :remote_namespace? => remote_namespace
47
+ :remote_namespace? => remote_namespace,
48
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content()
48
49
  )
49
50
  response = post(rest_url("service_module/resolve_pull_from_remote"),post_body)
50
51
 
51
52
  print "Resolving dependencies please wait ... "
52
-
53
+
53
54
  if (response.ok? && !(missing_components = response.data(:missing_modules)).empty?)
54
55
  puts " New dependencies found, Installing."
55
56
 
@@ -58,9 +59,12 @@ module DTK::Client
58
59
  else
59
60
  puts 'Done.'
60
61
  end
62
+
63
+ RemoteDependencyUtil.print_dependency_warnings(response)
64
+ nil
61
65
  end
62
66
 
63
- module PullFromRemote
67
+ module PullFromRemote
64
68
  extend CommandBase
65
69
  def self.perform_locally(cmd_obj,module_type,module_id,module_name,remote_params)
66
70
  opts = remote_params
@@ -71,8 +75,8 @@ module DTK::Client
71
75
  end
72
76
 
73
77
  return response
74
-
75
- # removing this for now, because we will use push-clone-changes as part of pull-from-remote command
78
+
79
+ # removing this for now, because we will use push-clone-changes as part of pull-from-remote command
76
80
  # post_body = {
77
81
  # id_field(module_type) => module_id,
78
82
  # :commit_sha => response.data[:commit_sha],
@@ -91,12 +95,12 @@ module DTK::Client
91
95
  }
92
96
  post_body.merge!(:version => remote_params[:version]) if remote_params[:version]
93
97
  response = post rest_url("#{module_type}/pull_from_remote"), post_body
94
-
95
-
98
+
99
+
96
100
  puts "You have successfully pulled code on server instance." if response.ok?
97
101
  response
98
102
  end
99
-
103
+
100
104
  def self.id_field(module_type)
101
105
  "#{module_type}_id"
102
106
  end
@@ -2,28 +2,7 @@ dtk_require_common_commands('thor/common')
2
2
  module DTK::Client
3
3
  module PushToRemoteMixin
4
4
 
5
- ##
6
- #
7
- # module_type: will be :component_module or :service_module
8
- # def push_to_remote_aux(module_type,module_id, module_name,remote_namespace,version=nil)
9
5
  def push_to_remote_aux(remote_module_info, module_type)
10
- # commented out, because we perform this check before calling 'push_to_remote_aux' from service-module/component-module
11
- # id_field = "#{module_type}_id"
12
-
13
- # rsa_pub_value = SSHUtil.rsa_pub_key_content()
14
-
15
- # post_body = {
16
- # id_field => module_id,
17
- # :rsa_pub_key => rsa_pub_value,
18
- # :access_rights => "rw",
19
- # :action => "push"
20
- # }
21
- # post_body.merge!(:version => version) if version
22
- # post_body.merge!(:remote_namespace => remote_namespace) if remote_namespace
23
-
24
- # response = post(rest_url("#{module_type}/get_remote_module_info"),post_body)
25
- # return response unless response.ok?
26
-
27
6
  returned_module_name = remote_module_info.data(:module_name)
28
7
  version = remote_module_info.data(:version)
29
8
 
@@ -69,7 +69,7 @@ module DTK::Client
69
69
  desc "set-password", "Change password for your dtk user account"
70
70
  def set_password(context_params)
71
71
  old_pass_prompt, old_pass, new_pass_prompt, confirm_pass_prompt = nil
72
- cred_file = ::DTK::Client::Configurator.CRED_FILE
72
+ cred_file = ::DTK::Client::Configurator::CRED_FILE
73
73
  old_pass = parse_key_value_file(cred_file)[:password]
74
74
  username = parse_key_value_file(cred_file)[:username]
75
75
 
@@ -105,7 +105,7 @@ module DTK::Client
105
105
 
106
106
  desc "list-ssh-keys", "Show list of key pairs that your account profile has saved"
107
107
  def list_ssh_keys(context_params)
108
- username = parse_key_value_file(::DTK::Client::Configurator.CRED_FILE)[:username]
108
+ username = parse_key_value_file(::DTK::Client::Configurator::CRED_FILE)[:username]
109
109
  post_body = {:username => username}
110
110
 
111
111
  response = post rest_url("account/list_ssh_keys"), post_body