xtc-ops 0.0.1

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 (5) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.txt +1 -0
  3. data/README.md +6 -0
  4. data/bin/xtc-ops-sync-logs +182 -0
  5. metadata +62 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5795caf4efc0770a5fb89e5da304a5f2b61f756d
4
+ data.tar.gz: f7a2dbb19b8276e1a9b6c21b12453fd6bc97804d
5
+ SHA512:
6
+ metadata.gz: 56e114a07a793e19fc4f2927e47c91686edf86770fa58c73c2e28ee21c43ee20805653158d5efa3fef51d8aee022df22c88d99c2ad9875e36147739308d33c5c
7
+ data.tar.gz: 1f94931f81c0b36ddadbc8e8e3c750c110608f86741c24e0d9095fd3026755afadb6463db845ac3a7f007fdeca2803d0ae9f71fe308e46b0bef65efe9e27c4fd
data/CHANGES.txt ADDED
@@ -0,0 +1 @@
1
+
data/README.md ADDED
@@ -0,0 +1,6 @@
1
+ XTC Ops Tools
2
+ =====================================
3
+
4
+ # Using `xtc-sync-locs`
5
+
6
+ TBD
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'json'
4
+ require 'fileutils'
5
+ require 'uri'
6
+ require 'net/http'
7
+ require 'set'
8
+ require 'open3'
9
+
10
+ unless ENV['XTC_PASSWORD'] && ENV['XTC_USERNAME']
11
+ puts "You must set env var XTC_USERNAME and XTC_PASSWORD or we can't fetch data"
12
+ exit(1)
13
+ end
14
+
15
+ logs ="logfiles"
16
+ FileUtils.mkdir_p logs
17
+
18
+ url_or_app_upload_id = ARGV[0]
19
+
20
+ def find_app_upload_id(input)
21
+ uri = URI(input)
22
+ if uri.scheme == 'https'
23
+ @domain = uri.host
24
+
25
+ if /device.?=(.*)$/ =~ uri.query
26
+ @snapshot = $1
27
+ end
28
+ uri.path.split("/")[3] # ["", "app", "app-id", "app-upload-id"]
29
+ else
30
+ @domain = "testcloud.xamarin.com"
31
+ uri.path
32
+ end
33
+ end
34
+
35
+ def fetch_test_data(app_upload_id)
36
+ uri = URI("https://#{@domain}/admin/api/app_uploads/#{app_upload_id}/status")
37
+ req = Net::HTTP::Get.new(uri)
38
+ req.basic_auth ENV['XTC_USERNAME'], ENV['XTC_PASSWORD']
39
+
40
+ res = Net::HTTP.start(uri.hostname, uri.port,:use_ssl => true) do |http|
41
+ http.request(req)
42
+ end
43
+ JSON.parse(res.body)
44
+ end
45
+
46
+ @app_upload_id = find_app_upload_id url_or_app_upload_id
47
+ test=@test = fetch_test_data @app_upload_id
48
+ if ENV['DEBUG'] == '1'
49
+ puts JSON.pretty_generate(test)
50
+ puts "-"*40
51
+ end
52
+ test_id = @test_id = test['test_id']
53
+ @snapshots = test['device_snapshots']
54
+
55
+ def log_test
56
+ puts ""
57
+ puts "="*40
58
+ puts " Upload id: #{@app_upload_id} "
59
+ puts " Devices: #{@snapshots.count} "
60
+ if @snapshot
61
+ @snapshot_data = @snapshots.find {|s| s['id']==@snapshot}
62
+ puts " Queue: #{@snapshot_data['queue']} " if @snapshot_data
63
+
64
+ end
65
+ puts " Test #{@test['test_class']} "
66
+ puts " Test id: #{@test_id} "
67
+ puts " App: #{@test['app']} "
68
+ puts " App-id: #{@test['app_id']} "
69
+ puts " Owner: #{@test['owner']} "
70
+ puts "="*40
71
+ puts ""
72
+ end
73
+
74
+ execution_hosts = test['execution_hosts']
75
+ log_path = @log_path = File.join(logs,test_id)
76
+
77
+ unless File.directory?(@log_path)
78
+ puts "Sync logs from #{execution_hosts.count} executionhosts to #{logs}"
79
+
80
+ pids = []
81
+ execution_hosts.each do |eh|
82
+ err_log = "#{@app_upload_id}_#{eh['name']}.log"
83
+ puts "-"*40
84
+ puts "Background copy logs from #{eh['name']}:/xamarin/logs/tests/#{test_id}/*. Error log: #{err_log}"
85
+ pid = Process.spawn(%Q[scp -q -r "#{eh['name']}:/xamarin/logs/tests/#{test_id}" #{logs}],:err=> err_log)
86
+ pids << {pid: pid, host: eh['name']}
87
+ puts ""
88
+ end
89
+
90
+ log_test
91
+ set = Set.new(pids)
92
+ i=0
93
+ puts "Waiting for pids/hosts\n#{pids.join("\n")}"
94
+ until set.empty? do
95
+ i += 1
96
+ sleep 1
97
+ $stdout.write('.')
98
+ pids = set.to_a
99
+ if i%6 == 0
100
+ log_test
101
+ puts "\n\nWaiting for pids/hosts\n#{pids.join("\n")}\n\n"
102
+ end
103
+ pids.each do |pid_host|
104
+ pid = pid_host[:pid]
105
+ host = pid_host[:host]
106
+ _, status = Process.waitpid2(pid, Process::WNOHANG | Process::WUNTRACED )
107
+ if status
108
+ puts "\nCopy from host #{host} completed with status: success=#{status.success?}."
109
+ set.delete(pid_host)
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+ puts "Done!"
116
+ puts "Saved to path #{log_path}"
117
+ else
118
+ puts "Logs already fetched for id #{@app_upload_id}"
119
+ end
120
+
121
+ def fetch_devicehost_log(queue_name)
122
+ logs = File.join(@log_path, queue_name)
123
+
124
+ calabash_log = File.join(logs, 'calabash.log')
125
+ mono_log = File.join(logs, 'mono.log')
126
+ log = if File.exist?(calabash_log)
127
+ File.join(logs,'calabash.log')
128
+ elsif File.exist?(mono_log)
129
+ File.join(logs,'mono.log')
130
+ else
131
+ raise "Unable to find calabash/mono log for #{queue_name}"
132
+ end
133
+
134
+ puts "Analyzing log #{log}"
135
+
136
+ device_id = nil
137
+ corr_id = @test_id
138
+ host = nil
139
+ IO.read(log).lines.each do |line|
140
+ if /DeviceID:/.match(line)
141
+ device_id = line.strip.split("DeviceID:").last.strip
142
+ elsif /DeviceHost:/.match(line)
143
+ host = line.strip.split("DeviceHost:").last.strip
144
+ end
145
+ break if host && device_id
146
+ end
147
+
148
+ puts "Snapshot ran on Host: #{host}"
149
+ puts "Snapshot ran on Device: #{device_id}"
150
+
151
+ prefix = "#{logs}/devicehost"
152
+ FileUtils.mkdir_p prefix
153
+ `scp deployer@#{host}:/xamarin/logs/devicehost/#{corr_id}/#{device_id}_* #{prefix}`
154
+ puts "General log stored in: #{@log_path}"
155
+ puts "Device logs stored in #{prefix}"
156
+ puts "Path copied to copy/paste buffer:"
157
+ Open3.capture2("pbcopy", :stdin_data=>logs)
158
+ end
159
+
160
+ if @snapshot_data
161
+ puts "Fetching devicehost logs for #{@snapshot_data['queue']}"
162
+ fetch_devicehost_log(@snapshot_data['queue'])
163
+ else
164
+
165
+ @snapshots.each_with_index do |snapshot, index|
166
+ puts "#{index}\t #{snapshot["queue"]}"
167
+ end
168
+
169
+ puts "Select one:"
170
+ index = STDIN.gets.chomp.to_i
171
+
172
+ selected = @snapshots[index]
173
+ raise "NO NO NO! That's not a thing!" unless selected
174
+
175
+ puts ""
176
+
177
+ puts "Selected: #{selected['queue']}. Fetching..."
178
+ fetch_devicehost_log(selected['queue'])
179
+ end
180
+
181
+
182
+
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xtc-ops
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Karl Krukow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: ' - '
28
+ email:
29
+ - karl@xamarin.com
30
+ executables:
31
+ - xtc-ops-sync-logs
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - bin/xtc-ops-sync-logs
36
+ - README.md
37
+ - CHANGES.txt
38
+ homepage: http://xamarin.com
39
+ licenses: []
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 2.0.2
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Collection of tools for ops in XTC
61
+ test_files: []
62
+ has_rdoc: