cnvrg 2.0.6 → 2.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +30 -1
- data/lib/cnvrg/api.rb +2 -0
- data/lib/cnvrg/api_v2.rb +1 -0
- data/lib/cnvrg/auth.rb +4 -1
- data/lib/cnvrg/cli/library_cli.rb +2 -2
- data/lib/cnvrg/cli.rb +115 -42
- data/lib/cnvrg/project.rb +5 -1
- data/lib/cnvrg/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c04990b9e466d74e4ba90092109234a5488f1845db38bac6e3c121d8e6a7508
|
4
|
+
data.tar.gz: 253358287a518824c5d22aeda7f4b9c2a9197e57d14177c8757806470258021a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df209c738e03b869cc5ccc50694a2ce705fe3c9ba2459a1ddbbeb64b9ab433fdf8bd880bbd4f1d24ce2420ebbf0180b53c87b564e89d3b41df86c55a3b6a5ede
|
7
|
+
data.tar.gz: 9bcd79dafb0d9b00626df5b873e8c787731afe2e297292bb184c2e2250062e4ccf5766539a9600d1c078568e2db8c13e9e88842dc6262c8a0c40cc75c80ab07a
|
data/Readme.md
CHANGED
@@ -39,4 +39,33 @@
|
|
39
39
|
* DEV-10189 - Bug: CLI Sync -file/folder with broken symlink will cause sync to fail
|
40
40
|
## Version v2.0.6
|
41
41
|
2021-07-18
|
42
|
-
* DEV-10209 - Bug: some experiments in grid failed on cnvrg-cli commands (docker container id was missing)
|
42
|
+
* DEV-10209 - Bug: some experiments in grid failed on cnvrg-cli commands (docker container id was missing)
|
43
|
+
## Version v2.0.7
|
44
|
+
2021-07-27
|
45
|
+
* DEV-10186 - Bug: CLI/run an experiment with --local tag giver server error
|
46
|
+
## Version v2.0.8
|
47
|
+
2021-09-06
|
48
|
+
* DEV-10697 - Bug: Tensorboard not starting in workspace and experiment.
|
49
|
+
## Version v2.0.9
|
50
|
+
2021-09-12
|
51
|
+
* DEV-10502 - Bug: Periodic sync stuck
|
52
|
+
## Version v2.0.10
|
53
|
+
2021-09-12
|
54
|
+
* DEV-10502 - Bug: Periodic sync stuck
|
55
|
+
## Version v2.0.11
|
56
|
+
2021-10-21
|
57
|
+
## Version v2.0.12
|
58
|
+
2021-10-25
|
59
|
+
* DEV-11544 - Sub-bug: local experiment is failing to run
|
60
|
+
## Version v2.0.13
|
61
|
+
2021-10-27
|
62
|
+
* DEV-11054 - Task: Create organization and user by default
|
63
|
+
## Version v2.0.14
|
64
|
+
2021-11-11
|
65
|
+
* DEV-11834 - Sub-task: add device name to hpu metrics
|
66
|
+
## Version v2.0.15
|
67
|
+
2021-12-12
|
68
|
+
* DEV-12316 - Improvement: cli login should identify saas users automatically
|
69
|
+
## Version v2.0.16
|
70
|
+
2021-12-16
|
71
|
+
* DEV-12316 - Improvement: cli login should identify saas users automatically
|
data/lib/cnvrg/api.rb
CHANGED
@@ -57,6 +57,7 @@ module Cnvrg
|
|
57
57
|
conn = Faraday.new "#{endpoint_uri}"
|
58
58
|
end
|
59
59
|
conn.headers['Auth-Token'] = @pass
|
60
|
+
conn.headers['Authorization'] = "CAPI #{@pass}"
|
60
61
|
conn.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
|
61
62
|
conn.options.timeout = 420
|
62
63
|
conn.options.open_timeout=180
|
@@ -169,6 +170,7 @@ module Cnvrg
|
|
169
170
|
when 'POST_FILE'
|
170
171
|
conn = Faraday.new do |fr|
|
171
172
|
fr.headers['Auth-Token'] = @pass
|
173
|
+
fr.headers['Authorization'] = "CAPI #{@pass}"
|
172
174
|
fr.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
|
173
175
|
fr.headers["Content-Type"] = "multipart/form-data"
|
174
176
|
if !Helpers.is_verify_ssl
|
data/lib/cnvrg/api_v2.rb
CHANGED
@@ -22,6 +22,7 @@ module Cnvrg
|
|
22
22
|
|
23
23
|
conn = Faraday.new endpoint_uri, :ssl => {:verify => !!Helpers.is_verify_ssl}
|
24
24
|
conn.headers['Auth-Token'] = pass
|
25
|
+
conn.headers['Authorization'] = "CAPI #{pass}"
|
25
26
|
conn.headers['User-Agent'] = Cnvrg::API::USER_AGENT
|
26
27
|
conn.headers['Content-Type'] = "application/json"
|
27
28
|
conn.options.timeout = 420
|
data/lib/cnvrg/auth.rb
CHANGED
@@ -44,7 +44,7 @@ module Cnvrg
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def sign_in(email, password)
|
47
|
+
def sign_in(email, password, token: nil)
|
48
48
|
url = Cnvrg::API.endpoint_uri()
|
49
49
|
url = URI.parse(url+ "/users/sign_in")
|
50
50
|
http = Net::HTTP.new(url.host, url.port)
|
@@ -61,6 +61,9 @@ module Cnvrg
|
|
61
61
|
|
62
62
|
req.add_field("EMAIL", email)
|
63
63
|
req.add_field("PASSWORD", password)
|
64
|
+
if token.present?
|
65
|
+
req.add_field("Authorization", "CAPI #{token}")
|
66
|
+
end
|
64
67
|
|
65
68
|
response = http.request(req)
|
66
69
|
|
data/lib/cnvrg/cli.rb
CHANGED
@@ -496,8 +496,10 @@ module Cnvrg
|
|
496
496
|
|
497
497
|
|
498
498
|
desc 'login', 'Authenticate with cnvrg.io platform'
|
499
|
+
method_option :sso, :type => :boolean, :aliases => ["-s", "--sso"], :default => false
|
499
500
|
|
500
501
|
def login
|
502
|
+
use_token = options["sso"]
|
501
503
|
begin
|
502
504
|
log_handler()
|
503
505
|
log_start(__method__, args, options)
|
@@ -515,12 +517,23 @@ module Cnvrg
|
|
515
517
|
exit(0)
|
516
518
|
end
|
517
519
|
@email = ask("Enter your email:")
|
518
|
-
|
519
|
-
|
520
|
+
url = Cnvrg::API.endpoint_uri()
|
521
|
+
use_token = true if url.include?("cloud.cnvrg.io")
|
522
|
+
if use_token
|
523
|
+
@token = cmd.ask("Enter your token (hidden):") {|q| q.echo = "*"}
|
524
|
+
netrc[Cnvrg::Helpers.netrc_domain] = @email, @token
|
525
|
+
netrc.save
|
526
|
+
password = ""
|
527
|
+
else
|
528
|
+
password = cmd.ask("Enter your password (hidden):") {|q| q.echo = "*"}
|
529
|
+
end
|
530
|
+
result = @auth.sign_in(@email, password, token: @token)
|
520
531
|
|
521
532
|
if !result["token"].nil?
|
522
|
-
|
523
|
-
|
533
|
+
unless use_token
|
534
|
+
netrc[Cnvrg::Helpers.netrc_domain] = @email, result["token"]
|
535
|
+
netrc.save
|
536
|
+
end
|
524
537
|
|
525
538
|
log_message("Authenticated successfully as #{@email}", Thor::Shell::Color::GREEN)
|
526
539
|
|
@@ -3147,7 +3160,7 @@ module Cnvrg
|
|
3147
3160
|
invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
|
3148
3161
|
:log => log, :email_notification => email_notification, :upload_output => upload_output,
|
3149
3162
|
:commit => commit, :image => image, :data => data, :data_commit => data_commit,
|
3150
|
-
:ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
|
3163
|
+
:ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query, :local => local
|
3151
3164
|
return
|
3152
3165
|
end
|
3153
3166
|
else
|
@@ -3204,6 +3217,7 @@ module Cnvrg
|
|
3204
3217
|
method_option :data_query, :type => :string, :aliases => ["-q", "--query"], :default => nil
|
3205
3218
|
method_option :use_bash, :type => :boolean, :aliases => ["-b", "--use_bash"], :default => false
|
3206
3219
|
method_option :docker_stats, :type => :boolean, :aliases => ["--docker_stats"], :default => true
|
3220
|
+
method_option :local, :type => :boolean, :aliases => ["-l", "--local"], :default => false
|
3207
3221
|
|
3208
3222
|
def exec(*cmd)
|
3209
3223
|
log = []
|
@@ -3228,6 +3242,7 @@ module Cnvrg
|
|
3228
3242
|
project_home = get_project_home
|
3229
3243
|
data_query = options["data_query"]
|
3230
3244
|
docker_stats = options["docker_stats"]
|
3245
|
+
local = options[:local] || false
|
3231
3246
|
@project = Project.new(project_home)
|
3232
3247
|
if @project.is_git
|
3233
3248
|
sync_before = false
|
@@ -3323,43 +3338,49 @@ module Cnvrg
|
|
3323
3338
|
if @exp.get_cmd.present?
|
3324
3339
|
cmd = @exp.get_cmd
|
3325
3340
|
end
|
3326
|
-
|
3327
|
-
|
3328
|
-
|
3329
|
-
|
3330
|
-
|
3331
|
-
|
3332
|
-
|
3333
|
-
|
3334
|
-
|
3335
|
-
|
3336
|
-
|
3337
|
-
|
3338
|
-
|
3339
|
-
|
3340
|
-
|
3341
|
-
|
3342
|
-
|
3343
|
-
|
3344
|
-
|
3345
|
-
|
3346
|
-
|
3347
|
-
|
3348
|
-
|
3349
|
-
|
3350
|
-
|
3351
|
-
|
3352
|
-
|
3353
|
-
|
3354
|
-
|
3355
|
-
|
3356
|
-
|
3357
|
-
|
3358
|
-
log
|
3359
|
-
|
3341
|
+
|
3342
|
+
if local
|
3343
|
+
exec_local(cmd, print_log, start_commit, real, start_time)
|
3344
|
+
exit_status = $?.exitstatus
|
3345
|
+
|
3346
|
+
else
|
3347
|
+
command_slug = (0...18).map { (65 + rand(26)).chr }.join
|
3348
|
+
result_file = "/conf/result-#{command_slug}"
|
3349
|
+
data = {cmd: cmd, async: true, format: true, file_name: result_file, use_script: true, use_bash: options["use_bash"]}
|
3350
|
+
conn = Cnvrg::Helpers::Executer.get_main_conn
|
3351
|
+
response = conn.post('command', data.to_json)
|
3352
|
+
if response.to_hash[:status].to_i != 200
|
3353
|
+
exit_status = 129
|
3354
|
+
raise StandardError.new("Cant send command to slave")
|
3355
|
+
end
|
3356
|
+
t = FileWatch::Tail.new
|
3357
|
+
filename = result_file
|
3358
|
+
lines = []
|
3359
|
+
t.tail(filename)
|
3360
|
+
t.subscribe do |path, line|
|
3361
|
+
begin
|
3362
|
+
cur_log = JSON.parse(line)
|
3363
|
+
if cur_log["type"] == "endMessage"
|
3364
|
+
exit_status = cur_log["real"].to_i
|
3365
|
+
break
|
3366
|
+
else
|
3367
|
+
puts(cur_log.to_json)
|
3368
|
+
STDOUT.flush
|
3369
|
+
cur_log["time"] = Time.parse(cur_log["timestamp"])
|
3370
|
+
cur_log["message"] = cur_log["message"].to_s + "\r\n"
|
3371
|
+
log << cur_log
|
3372
|
+
end
|
3373
|
+
if log.size >= 10
|
3374
|
+
@exp.upload_temp_log(log)
|
3375
|
+
log = []
|
3376
|
+
elsif (start_time + 15.seconds) <= Time.now
|
3377
|
+
@exp.upload_temp_log(log) unless log.empty?
|
3378
|
+
log = []
|
3379
|
+
start_time = Time.now
|
3380
|
+
end
|
3381
|
+
rescue => e
|
3382
|
+
log_error(e)
|
3360
3383
|
end
|
3361
|
-
rescue => e
|
3362
|
-
log_error(e)
|
3363
3384
|
end
|
3364
3385
|
end
|
3365
3386
|
end_time = Time.now
|
@@ -4692,6 +4713,7 @@ module Cnvrg
|
|
4692
4713
|
data_result.each_with_index do |res, i|
|
4693
4714
|
timestamp, value = res["value"]
|
4694
4715
|
uuid = res["metric"]["UUID"].presence || i
|
4716
|
+
uuid = res["metric"]["device"] if query_name == "gaudi"
|
4695
4717
|
stat_value = value.present? ? ("%.2f" % value) : 0 # converting 34.685929244444445 to 34.69
|
4696
4718
|
stat_value = stat_value.to_i == stat_value.to_f ? stat_value.to_i : stat_value.to_f # converting 34.00 to 34
|
4697
4719
|
if query_name.include? 'block'
|
@@ -5007,7 +5029,7 @@ module Cnvrg
|
|
5007
5029
|
end
|
5008
5030
|
end
|
5009
5031
|
|
5010
|
-
desc 'experiments', 'List project experiments'
|
5032
|
+
desc 'experiments', 'List project experiments', :hide => true
|
5011
5033
|
method_option :id, :type => :string, :aliases => ["--id"], :desc => "Get info for specific experiments", :default => ""
|
5012
5034
|
method_option :tag, :type => :string, :aliases => ["-t"], :desc => "Get info for specific experiment tag", :default => ""
|
5013
5035
|
|
@@ -5876,6 +5898,57 @@ module Cnvrg
|
|
5876
5898
|
end
|
5877
5899
|
end
|
5878
5900
|
|
5901
|
+
def exec_local(cmd , print_log, start_commit, real, start_time)
|
5902
|
+
log = []
|
5903
|
+
PTY.spawn(@exp.as_env, cmd) do |stdout, stdin, pid, stderr|
|
5904
|
+
begin
|
5905
|
+
stdout.each do |line|
|
5906
|
+
cur_time = Time.now
|
5907
|
+
real_time = Time.now - real
|
5908
|
+
cur_log = {time: cur_time,
|
5909
|
+
message: line,
|
5910
|
+
type: "stdout",
|
5911
|
+
real: real_time
|
5912
|
+
}
|
5913
|
+
if print_log
|
5914
|
+
puts({log: line, timestamp: Time.now, exp_logs: true}.to_json)
|
5915
|
+
end
|
5916
|
+
log << cur_log
|
5917
|
+
if log.size >= 10
|
5918
|
+
@exp.upload_temp_log(log) unless log.empty?
|
5919
|
+
log = []
|
5920
|
+
elsif (start_time + 15.seconds) <= Time.now
|
5921
|
+
@exp.upload_temp_log(log) unless log.empty?
|
5922
|
+
log = []
|
5923
|
+
start_time = Time.now
|
5924
|
+
end
|
5925
|
+
end
|
5926
|
+
if stderr
|
5927
|
+
stderr.each do |err|
|
5928
|
+
log << {time: Time.now, message: err, type: "stderr"}
|
5929
|
+
end
|
5930
|
+
end
|
5931
|
+
rescue Errno::EIO => e
|
5932
|
+
log_error(e)
|
5933
|
+
if !log.empty?
|
5934
|
+
temp_log = log
|
5935
|
+
@exp.upload_temp_log(temp_log) unless temp_log.empty?
|
5936
|
+
log -= temp_log
|
5937
|
+
end
|
5938
|
+
rescue Errno::ENOENT => e
|
5939
|
+
exp_success = false
|
5940
|
+
log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
|
5941
|
+
log_error(e)
|
5942
|
+
rescue => e
|
5943
|
+
res = @exp.end(log, 1, start_commit, 0, 0)
|
5944
|
+
log_message("Error occurred,aborting", Thor::Shell::Color::RED)
|
5945
|
+
log_error(e)
|
5946
|
+
exit(0)
|
5947
|
+
end
|
5948
|
+
::Process.wait pid
|
5949
|
+
end
|
5950
|
+
end
|
5951
|
+
|
5879
5952
|
end
|
5880
5953
|
end
|
5881
5954
|
|
data/lib/cnvrg/project.rb
CHANGED
@@ -661,7 +661,11 @@ module Cnvrg
|
|
661
661
|
|
662
662
|
def fetch_webapp_slugs(webapp_slug, slugs: nil)
|
663
663
|
response = Cnvrg::API_V2.request("#{self.owner}/projects/#{self.slug}/webapps/#{webapp_slug}" , 'GET')
|
664
|
-
|
664
|
+
|
665
|
+
if response.key?("experiments")
|
666
|
+
return response["experiments"]
|
667
|
+
end
|
668
|
+
return response["data"]["attributes"]["experiments"]
|
665
669
|
rescue
|
666
670
|
slugs
|
667
671
|
end
|
data/lib/cnvrg/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cnvrg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yochay Ettun
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-12-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -488,7 +488,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
488
488
|
- !ruby/object:Gem::Version
|
489
489
|
version: '0'
|
490
490
|
requirements: []
|
491
|
-
rubygems_version: 3.2.
|
491
|
+
rubygems_version: 3.2.32
|
492
492
|
signing_key:
|
493
493
|
specification_version: 4
|
494
494
|
summary: A CLI tool for interacting with cnvrg.io.
|