cnvrg 0.2 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cnvrg.gemspec +1 -0
- data/lib/cnvrg/api.rb +6 -0
- data/lib/cnvrg/cli.rb +168 -65
- data/lib/cnvrg/datafiles.rb +18 -36
- data/lib/cnvrg/experiment.rb +7 -3
- data/lib/cnvrg/files.rb +71 -34
- data/lib/cnvrg/project.rb +2 -3
- data/lib/cnvrg/version.rb +1 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89388312156199c10f60b2495c05305ea4342a54
|
4
|
+
data.tar.gz: 072a8e7f4bfcba47ec648eb48516f8fc53111541
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed33b00c74cf61f4bfd259fff6656298f6250acd5f7c8668106e0a67974987b101e8d7923d02bd13c98a51d9fd532279f888ce72931abdcb1be336c394a0b1f5
|
7
|
+
data.tar.gz: aeff07a3e9181dbb3a4610206e4852918d9ea24b338ce307a585dea2739bf6260461b9eb64537ec24c4dfac8f1161b8a8b49d5e0376d802152722046f18d5153
|
data/cnvrg.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_runtime_dependency 'sucker_punch', '~> 2.0'
|
36
36
|
spec.add_runtime_dependency 'urlcrypt', '~> 0.1.1'
|
37
37
|
spec.add_runtime_dependency 'parallel', '~> 1.12.0'
|
38
|
+
spec.add_runtime_dependency 'net_http_ssl_fix'
|
38
39
|
|
39
40
|
spec.add_runtime_dependency 'logstash-logger', '~> 0.22.1'
|
40
41
|
spec.add_runtime_dependency 'launchy', '~> 2.4'
|
data/lib/cnvrg/api.rb
CHANGED
@@ -85,8 +85,14 @@ module Cnvrg
|
|
85
85
|
# what if windows?
|
86
86
|
# data[:file] = Faraday::UploadIO.new(data[:absolute_path], content_type)
|
87
87
|
file_base = File.basename(data[:relative_path])
|
88
|
+
begin
|
88
89
|
temp_path = File.expand_path('~')+"/.cnvrg/tmp_files/#{file_base}"
|
89
90
|
FileUtils.touch(temp_path)
|
91
|
+
rescue
|
92
|
+
temp_path ="/tmp/#{file_base}"
|
93
|
+
FileUtils.touch(temp_path)
|
94
|
+
end
|
95
|
+
|
90
96
|
|
91
97
|
|
92
98
|
data[:file] = Faraday::UploadIO.new("#{temp_path}", "plain/text")
|
data/lib/cnvrg/cli.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
require "pty"
|
3
3
|
require 'etc'
|
4
4
|
require 'parallel'
|
5
|
-
require "open4"
|
6
5
|
require 'netrc'
|
7
6
|
require 'net/http'
|
8
7
|
require 'uri'
|
@@ -12,7 +11,6 @@ require 'yaml'
|
|
12
11
|
require 'digest' # sha1up
|
13
12
|
require "highline/import"
|
14
13
|
require 'socket'
|
15
|
-
include Open4
|
16
14
|
require 'cnvrg/helpers'
|
17
15
|
require 'cnvrg/api'
|
18
16
|
require 'cnvrg/auth'
|
@@ -37,6 +35,7 @@ require 'thor'
|
|
37
35
|
require 'pathname'
|
38
36
|
require 'enumerator'
|
39
37
|
require 'ruby-progressbar'
|
38
|
+
require 'open3'
|
40
39
|
|
41
40
|
class Thor
|
42
41
|
module Base
|
@@ -238,7 +237,33 @@ module Cnvrg
|
|
238
237
|
say "Couldn't set default api, contact help@cnvrg.io", Thor::Shell::Color::RED
|
239
238
|
end
|
240
239
|
end
|
240
|
+
desc '', '', :hide => true
|
241
241
|
|
242
|
+
def set_remote_login(current_user,owner,url, email, secret)
|
243
|
+
netrc = Netrc.read
|
244
|
+
netrc[Cnvrg::Helpers.netrc_domain] = email, secret
|
245
|
+
netrc.save
|
246
|
+
home_dir = File.expand_path('~')
|
247
|
+
if !url.end_with? "/api"
|
248
|
+
url = url+"/api"
|
249
|
+
end
|
250
|
+
begin
|
251
|
+
if !File.directory? home_dir+"/.cnvrg"
|
252
|
+
FileUtils.mkdir_p([home_dir+"/.cnvrg", home_dir+"/.cnvrg/tmp"])
|
253
|
+
end
|
254
|
+
if !File.exist?(home_dir+"/.cnvrg/config.yml")
|
255
|
+
FileUtils.touch [home_dir+"/.cnvrg/config.yml"]
|
256
|
+
end
|
257
|
+
config = YAML.load_file(home_dir+"/.cnvrg/config.yml")
|
258
|
+
|
259
|
+
compression_path = "#{home_dir}/.cnvrg/tmp"
|
260
|
+
config = {owner: owner, username: current_user, version_last_check: get_start_day(), api: url, compression_path: compression_path}
|
261
|
+
File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
|
262
|
+
say "Done"
|
263
|
+
rescue
|
264
|
+
say "ERROR", Thor::Shell::Color::RED
|
265
|
+
end
|
266
|
+
end
|
242
267
|
desc '', '', :hide => true
|
243
268
|
|
244
269
|
def set_remote_api_url(owner, current_user, url)
|
@@ -479,6 +504,9 @@ module Cnvrg
|
|
479
504
|
netrc.delete(Cnvrg::Helpers.netrc_domain)
|
480
505
|
netrc.save
|
481
506
|
log_message("Logged out successfully.\n", Thor::Shell::Color::GREEN)
|
507
|
+
rescue => e
|
508
|
+
puts e.message
|
509
|
+
puts e.backtrace
|
482
510
|
rescue SignalException
|
483
511
|
say "\nAborting"
|
484
512
|
exit(1)
|
@@ -1516,6 +1544,7 @@ module Cnvrg
|
|
1516
1544
|
in_thread: ParallelThreads
|
1517
1545
|
}
|
1518
1546
|
begin
|
1547
|
+
is_success = true
|
1519
1548
|
clone_result = Parallel.map((response["result"]["tree"]), parallel_options) do |f|
|
1520
1549
|
|
1521
1550
|
relative_path = f[0].gsub(/^#{@project.local_path}/, "")
|
@@ -1525,6 +1554,7 @@ module Cnvrg
|
|
1525
1554
|
f
|
1526
1555
|
successful_changes << relative_path
|
1527
1556
|
else
|
1557
|
+
is_success =false
|
1528
1558
|
log_message("Could not create directory: #{f[0]}", Thor::Shell::Color::RED)
|
1529
1559
|
raise Parallel::Kill
|
1530
1560
|
end
|
@@ -1535,6 +1565,7 @@ module Cnvrg
|
|
1535
1565
|
f
|
1536
1566
|
successful_changes << relative_path
|
1537
1567
|
else
|
1568
|
+
is_success =false
|
1538
1569
|
log_message("Could not download file: #{f[0]}", Thor::Shell::Color::RED)
|
1539
1570
|
raise Parallel::Kill
|
1540
1571
|
|
@@ -1542,7 +1573,7 @@ module Cnvrg
|
|
1542
1573
|
end
|
1543
1574
|
end
|
1544
1575
|
rescue Interrupt
|
1545
|
-
|
1576
|
+
is_success =false
|
1546
1577
|
log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
|
1547
1578
|
|
1548
1579
|
@files.revoke_download([], response["result"]["tree"])
|
@@ -1552,7 +1583,7 @@ module Cnvrg
|
|
1552
1583
|
|
1553
1584
|
end
|
1554
1585
|
successful_changes = response["result"]["tree"]
|
1555
|
-
if !successful_changes.nil?
|
1586
|
+
if !successful_changes.nil? and is_success
|
1556
1587
|
Project.verify_cnvrgignore_exist(project_name)
|
1557
1588
|
log_message("Done.\nDownloaded #{successful_changes.size}/#{response["result"]["tree"].size} files", Thor::Shell::Color::GREEN)
|
1558
1589
|
else
|
@@ -1575,7 +1606,7 @@ module Cnvrg
|
|
1575
1606
|
|
1576
1607
|
desc 'status', 'Show the working tree status'
|
1577
1608
|
method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
|
1578
|
-
|
1609
|
+
method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
|
1579
1610
|
|
1580
1611
|
def status
|
1581
1612
|
begin
|
@@ -1583,8 +1614,9 @@ module Cnvrg
|
|
1583
1614
|
log_start(__method__, args, options)
|
1584
1615
|
@project = Project.new(get_project_home)
|
1585
1616
|
new_branch = options["new_branch"] || false
|
1617
|
+
force = options["force"] || false
|
1586
1618
|
|
1587
|
-
result = @project.compare_idx(new_branch)["result"]
|
1619
|
+
result = @project.compare_idx(new_branch,force:force)["result"]
|
1588
1620
|
commit = result["commit"]
|
1589
1621
|
result = result["tree"]
|
1590
1622
|
log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE)
|
@@ -1661,6 +1693,7 @@ module Cnvrg
|
|
1661
1693
|
method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
|
1662
1694
|
method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
|
1663
1695
|
method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
|
1696
|
+
method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
|
1664
1697
|
|
1665
1698
|
def upload(link=false, sync=false, direct=false, ignore_list="")
|
1666
1699
|
|
@@ -1672,6 +1705,7 @@ module Cnvrg
|
|
1672
1705
|
|
1673
1706
|
@files = Cnvrg::Files.new(@project.owner, @project.slug)
|
1674
1707
|
ignore = options[:ignore] || ""
|
1708
|
+
force = options[:force] || false
|
1675
1709
|
|
1676
1710
|
if ignore.nil? or ignore.empty?
|
1677
1711
|
ignore = ignore_list
|
@@ -1696,7 +1730,7 @@ module Cnvrg
|
|
1696
1730
|
end
|
1697
1731
|
end
|
1698
1732
|
|
1699
|
-
result = @project.compare_idx(new_branch)
|
1733
|
+
result = @project.compare_idx(new_branch,force:force)
|
1700
1734
|
commit = result["result"]["commit"]
|
1701
1735
|
if !link
|
1702
1736
|
if commit != @project.last_local_commit and !@project.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?
|
@@ -1741,7 +1775,7 @@ module Cnvrg
|
|
1741
1775
|
|
1742
1776
|
end
|
1743
1777
|
# Start commit
|
1744
|
-
commit_sha1 = @files.start_commit(new_branch)["result"]["commit_sha1"]
|
1778
|
+
commit_sha1 = @files.start_commit(new_branch,force:force)["result"]["commit_sha1"]
|
1745
1779
|
|
1746
1780
|
# upload / update
|
1747
1781
|
begin
|
@@ -1868,7 +1902,7 @@ module Cnvrg
|
|
1868
1902
|
end
|
1869
1903
|
|
1870
1904
|
if update_count == update_total
|
1871
|
-
res = @files.end_commit(commit_sha1)
|
1905
|
+
res = @files.end_commit(commit_sha1,force:force)
|
1872
1906
|
if (Cnvrg::CLI.is_response_success(res, false))
|
1873
1907
|
# save idx
|
1874
1908
|
begin
|
@@ -2283,6 +2317,7 @@ module Cnvrg
|
|
2283
2317
|
method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
|
2284
2318
|
method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
|
2285
2319
|
method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :default => ""
|
2320
|
+
method_option :force, :type => :boolean, :aliases => ["-f","--force"], :default => false
|
2286
2321
|
|
2287
2322
|
def sync(direct=true)
|
2288
2323
|
verify_logged_in(true) if direct
|
@@ -2293,7 +2328,7 @@ module Cnvrg
|
|
2293
2328
|
|
2294
2329
|
invoke :download, [], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true
|
2295
2330
|
invoke :upload, [link=false, sync=true, direct=direct], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true,
|
2296
|
-
:ignore => options[:ignore]
|
2331
|
+
:ignore => options[:ignore], :force=> options[:force]
|
2297
2332
|
|
2298
2333
|
|
2299
2334
|
end
|
@@ -2374,7 +2409,6 @@ module Cnvrg
|
|
2374
2409
|
# end
|
2375
2410
|
end
|
2376
2411
|
|
2377
|
-
|
2378
2412
|
desc '', '', :hide => true
|
2379
2413
|
method_option :sync_before, :type => :boolean, :aliases => ["-sb,--sync_before"], :default => true
|
2380
2414
|
method_option :sync_after, :type => :boolean, :aliases => ["-sa,--sync_after"], :default => true
|
@@ -2481,6 +2515,7 @@ module Cnvrg
|
|
2481
2515
|
memory_total = []
|
2482
2516
|
cpu_total = []
|
2483
2517
|
start_loop = Time.now
|
2518
|
+
stdout, stderr = '', ''
|
2484
2519
|
begin
|
2485
2520
|
PTY.spawn(cmd) do |stdout, stdin, pid, stderr|
|
2486
2521
|
begin
|
@@ -2563,7 +2598,7 @@ module Cnvrg
|
|
2563
2598
|
|
2564
2599
|
log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
|
2565
2600
|
log_error(e)
|
2566
|
-
rescue
|
2601
|
+
rescue Open4::ChildExited
|
2567
2602
|
exp_success = false
|
2568
2603
|
log_message("The process exited!", Thor::Shell::Color::RED)
|
2569
2604
|
rescue => e
|
@@ -2574,6 +2609,8 @@ module Cnvrg
|
|
2574
2609
|
exit(0)
|
2575
2610
|
end
|
2576
2611
|
::Process.wait pid
|
2612
|
+
end
|
2613
|
+
|
2577
2614
|
cpu_average = cpu_total.inject(0) { |sum, el| sum + el }.to_f / cpu_total.size
|
2578
2615
|
memory_average = memory_total.inject(0) { |sum, el| sum + el }.to_f / memory_total.size
|
2579
2616
|
exit_status = $?.exitstatus
|
@@ -2614,12 +2651,24 @@ module Cnvrg
|
|
2614
2651
|
res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
|
2615
2652
|
check = Helpers.checkmark()
|
2616
2653
|
log_message("#{check} Done. Experiment's results were updated!", Thor::Shell::Color::GREEN)
|
2617
|
-
end
|
2618
2654
|
rescue => e
|
2619
2655
|
if container
|
2620
2656
|
container.stop()
|
2621
2657
|
end
|
2622
2658
|
log_message("Couldn't run #{cmd}, check your input parameters", Thor::Shell::Color::RED)
|
2659
|
+
if @exp
|
2660
|
+
cur_time = Time.now
|
2661
|
+
real_time= Time.now-real
|
2662
|
+
cur_log = {time: cur_time,
|
2663
|
+
message: "Couldn't run #{cmd}, check your input parameters",
|
2664
|
+
type: "stdout",
|
2665
|
+
real: real_time
|
2666
|
+
|
2667
|
+
}
|
2668
|
+
log << cur_log
|
2669
|
+
res = @exp.end(log, "-1", end_commit, cpu_average, memory_average)
|
2670
|
+
|
2671
|
+
end
|
2623
2672
|
log_error(e)
|
2624
2673
|
|
2625
2674
|
exit(1)
|
@@ -2897,6 +2946,7 @@ module Cnvrg
|
|
2897
2946
|
|
2898
2947
|
end
|
2899
2948
|
project = Project.new(working_dir)
|
2949
|
+
|
2900
2950
|
choose_image = options["image"]
|
2901
2951
|
|
2902
2952
|
if !choose_image.nil? and !choose_image.empty?
|
@@ -3156,7 +3206,7 @@ module Cnvrg
|
|
3156
3206
|
|
3157
3207
|
end
|
3158
3208
|
|
3159
|
-
desc '
|
3209
|
+
desc '', '', :hide=>true
|
3160
3210
|
method_option :notebook_dir, :type => :string, :aliases => ["-n"], :default => "", :desc => "relative path to notebook dir from current directory"
|
3161
3211
|
method_option :machine_type, :type => :string, :default => ""
|
3162
3212
|
method_option :kernel, :type => :string, :aliases => ["--kernel", "-k"], :default => ""
|
@@ -3165,7 +3215,7 @@ module Cnvrg
|
|
3165
3215
|
method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
|
3166
3216
|
|
3167
3217
|
|
3168
|
-
def
|
3218
|
+
def remote_notebook_old()
|
3169
3219
|
verify_logged_in(true)
|
3170
3220
|
log_start(__method__, args, options)
|
3171
3221
|
|
@@ -3260,6 +3310,52 @@ module Cnvrg
|
|
3260
3310
|
exit(1)
|
3261
3311
|
end
|
3262
3312
|
end
|
3313
|
+
desc 'remote_notebook', 'run notebook server on remote server'
|
3314
|
+
method_option :machine_type, :type => :string, :default => ""
|
3315
|
+
method_option :notebook_type, :type => :string, :aliases => ["-n","--notebook_type"], :default => ""
|
3316
|
+
method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
|
3317
|
+
method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
|
3318
|
+
method_option :commit, :type => :string, :aliases => ["--commit"], :default => ""
|
3319
|
+
|
3320
|
+
|
3321
|
+
def remote_notebook()
|
3322
|
+
verify_logged_in(true)
|
3323
|
+
log_start(__method__, args, options)
|
3324
|
+
|
3325
|
+
working_dir = is_cnvrg_dir()
|
3326
|
+
instance_type = options["machine_type"] || nil
|
3327
|
+
data = options["data"]
|
3328
|
+
data_commit = options["data_commit"]
|
3329
|
+
commit = options["commit"]
|
3330
|
+
notebook_type = options["notebook_type"]
|
3331
|
+
|
3332
|
+
|
3333
|
+
begin
|
3334
|
+
project = Project.new(working_dir)
|
3335
|
+
exp = Experiment.new(project.owner, project.slug)
|
3336
|
+
|
3337
|
+
if !notebook_type.nil? and !notebook_type.empty?
|
3338
|
+
notebook_type = "jupyter"
|
3339
|
+
end
|
3340
|
+
invoke :sync, [false], []
|
3341
|
+
slug = ""
|
3342
|
+
res =exp.remote_notebook( instance_type, commit, data, data_commit, notebook_type)
|
3343
|
+
if Cnvrg::CLI.is_response_success(res)
|
3344
|
+
slug = res["result"]["notebook_url"]
|
3345
|
+
log_message("#{Helpers.checkmark} Notebook is ready: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/notebook_sessions/show/#{slug}", Thor::Shell::Color::GREEN)
|
3346
|
+
|
3347
|
+
end
|
3348
|
+
rescue => e
|
3349
|
+
log_message("Error occurred, Aborting", Thor::Shell::Color::RED)
|
3350
|
+
log_error(e)
|
3351
|
+
|
3352
|
+
rescue SignalException
|
3353
|
+
log_message("Aborting", Thor::Shell::Color::BLUE)
|
3354
|
+
notebook_stop(slug) unless slug.nil? or slug.empty?
|
3355
|
+
|
3356
|
+
exit(1)
|
3357
|
+
end
|
3358
|
+
end
|
3263
3359
|
|
3264
3360
|
desc 'search_libraries', 'search if libraries installed', :hide => true
|
3265
3361
|
|
@@ -3560,65 +3656,35 @@ module Cnvrg
|
|
3560
3656
|
method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false, :desc => "run on remote machine"
|
3561
3657
|
method_option :verbose, :type => :boolean, :aliases => ["--v"], :default => false
|
3562
3658
|
|
3563
|
-
def notebook_stop
|
3659
|
+
def notebook_stop(notebook_slug)
|
3564
3660
|
begin
|
3565
3661
|
verify_logged_in(true)
|
3566
3662
|
log_start(__method__, args, options)
|
3567
|
-
remote = options["remote"] || false
|
3568
3663
|
project_dir = is_cnvrg_dir()
|
3569
3664
|
|
3570
3665
|
|
3571
|
-
log_message('Checking for new updates from remote version', Thor::Shell::Color::BLUE, options["verbose"])
|
3572
|
-
invoke :sync, [false], :verbose => options["verbose"]
|
3573
|
-
|
3574
|
-
log_message("Done Syncing", Thor::Shell::Color::BLUE, options["verbose"])
|
3575
|
-
|
3576
|
-
|
3577
3666
|
@project = Project.new(project_dir)
|
3578
3667
|
|
3579
|
-
end_commit = @project.last_local_commit
|
3580
3668
|
|
3581
3669
|
@note = Experiment.new(@project.owner, @project.slug)
|
3670
|
+
log_message("Stoping notebook session: #{notebook_slug}", Thor::Shell::Color::BLUE)
|
3582
3671
|
|
3583
|
-
|
3584
|
-
|
3585
|
-
|
3586
|
-
|
3587
|
-
image = is_project_with_docker(Dir.pwd)
|
3588
|
-
if image and image.is_docker and !remote
|
3589
|
-
container = image.get_container(true)
|
3590
|
-
if !container
|
3591
|
-
check = Helpers.checkmark()
|
3592
|
-
|
3593
|
-
log_message("#{check} Notebook server stopped successfully", Thor::Shell::Color::GREEN)
|
3594
|
-
exit(0)
|
3595
|
-
end
|
3596
|
-
|
3597
|
-
|
3598
|
-
log_message("Stopping notebook server...", Thor::Shell::Color::BLUE)
|
3599
|
-
|
3672
|
+
res = @note.end_notebook_session(notebook_slug)
|
3673
|
+
if res
|
3600
3674
|
check = Helpers.checkmark()
|
3601
|
-
|
3602
|
-
container.stop()
|
3603
|
-
|
3604
|
-
log_message("#{check} Notebook server stopped successfully", Thor::Shell::Color::GREEN)
|
3675
|
+
log_message("#{check} Notebook session has stopped successfully", Thor::Shell::Color::GREEN)
|
3605
3676
|
|
3606
3677
|
exit(0)
|
3607
|
-
|
3608
|
-
log_message("Stopping notebook server...", Thor::Shell::Color::BLUE)
|
3609
|
-
check = Helpers.checkmark()
|
3678
|
+
else
|
3610
3679
|
|
3611
|
-
log_message("
|
3612
|
-
exit(
|
3680
|
+
log_message("Couldn't stop notebook session, try stopping via cnvrg web", Thor::Shell::Color::RED)
|
3681
|
+
exit(1)
|
3613
3682
|
end
|
3614
3683
|
rescue => e
|
3615
3684
|
log_message("Error occurd, aborting", Thor::Shell::Color::RED)
|
3616
3685
|
log_error(e)
|
3617
|
-
if container
|
3618
|
-
container.stop()
|
3619
|
-
end
|
3620
3686
|
rescue SignalException
|
3621
|
-
|
3687
|
+
log_message("Aborting", Thor::Shell::Color::BLUE)
|
3622
3688
|
exit(1)
|
3623
3689
|
end
|
3624
3690
|
|
@@ -4413,19 +4479,25 @@ module Cnvrg
|
|
4413
4479
|
|
4414
4480
|
desc '', '', :hide => true
|
4415
4481
|
|
4416
|
-
def upload_cnvrg_image(image_name)
|
4482
|
+
def upload_cnvrg_image(image_path,image_name,secret)
|
4483
|
+
begin
|
4417
4484
|
verify_logged_in(false)
|
4418
|
-
log_start(__method__, args, options)
|
4419
|
-
owner = Cnvrg::CLI.get_owner()
|
4420
4485
|
|
4421
|
-
path = File.expand_path('~')+"/.cnvrg/tmp/#{image_name}.zip"
|
4422
4486
|
@files = Cnvrg::Files.new("", "")
|
4423
|
-
|
4424
|
-
|
4425
|
-
|
4426
|
-
|
4427
|
-
|
4428
|
-
|
4487
|
+
say "Uploading cnvrg image file", Thor::Shell::Color::BLUE
|
4488
|
+
|
4489
|
+
res = @files.upload_cnvrg_image(image_path, image_name, secret)
|
4490
|
+
if res
|
4491
|
+
say "Successfully uploaded cnvrg image file", Thor::Shell::Color::GREEN
|
4492
|
+
|
4493
|
+
else
|
4494
|
+
say "Couldn't upload cnvrg image file", Thor::Shell::Color::RED
|
4495
|
+
end
|
4496
|
+
rescue => e
|
4497
|
+
puts e
|
4498
|
+
puts e.backtrace
|
4499
|
+
end
|
4500
|
+
|
4429
4501
|
|
4430
4502
|
end
|
4431
4503
|
|
@@ -4515,7 +4587,32 @@ module Cnvrg
|
|
4515
4587
|
end
|
4516
4588
|
end
|
4517
4589
|
end
|
4590
|
+
desc '', '', :hide => true
|
4591
|
+
def download_cnvrg_image(image_name, secret)
|
4592
|
+
verify_logged_in(false)
|
4593
|
+
|
4594
|
+
begin
|
4595
|
+
@files = Cnvrg::Files.new("", "")
|
4596
|
+
|
4597
|
+
say "Downloading image file", Thor::Shell::Color::BLUE
|
4598
|
+
begin
|
4599
|
+
if @files.download_cnvrg_image(image_name, secret)
|
4600
|
+
|
4601
|
+
say "Successfully downloaded image #{image_name}", Thor::Shell::Color::GREEN
|
4518
4602
|
|
4603
|
+
else
|
4604
|
+
say "Couldn't download image #{image_name}", Thor::Shell::Color::RED
|
4605
|
+
return false
|
4606
|
+
end
|
4607
|
+
rescue Interrupt
|
4608
|
+
say "The user has exited to process, aborting", Thor::Shell::Color::BLUE
|
4609
|
+
exit(1)
|
4610
|
+
end
|
4611
|
+
rescue SignalException
|
4612
|
+
say "\nAborting"
|
4613
|
+
exit(1)
|
4614
|
+
end
|
4615
|
+
end
|
4519
4616
|
|
4520
4617
|
desc 'list_images', 'lists all custom images you can pull'
|
4521
4618
|
|
@@ -4855,7 +4952,7 @@ module Cnvrg
|
|
4855
4952
|
end
|
4856
4953
|
|
4857
4954
|
rescue => e
|
4858
|
-
puts e
|
4955
|
+
puts e.backtrace
|
4859
4956
|
end
|
4860
4957
|
end
|
4861
4958
|
|
@@ -4885,6 +4982,7 @@ module Cnvrg
|
|
4885
4982
|
end
|
4886
4983
|
|
4887
4984
|
def self.is_response_success(response, should_exit=true)
|
4985
|
+
begin
|
4888
4986
|
if response.nil?
|
4889
4987
|
if !Cnvrg::Helpers.internet_connection?
|
4890
4988
|
say("<%= color('Error:You seems to be offline', RED) %>")
|
@@ -4913,6 +5011,11 @@ module Cnvrg
|
|
4913
5011
|
end
|
4914
5012
|
end
|
4915
5013
|
return true
|
5014
|
+
rescue => e
|
5015
|
+
puts e.message
|
5016
|
+
puts e.backtrace
|
5017
|
+
end
|
5018
|
+
|
4916
5019
|
end
|
4917
5020
|
|
4918
5021
|
def self.get_owner
|
data/lib/cnvrg/datafiles.rb
CHANGED
@@ -201,44 +201,25 @@ module Cnvrg
|
|
201
201
|
|
202
202
|
end
|
203
203
|
|
204
|
-
def upload_cnvrg_image(absolute_path, image_name,
|
205
|
-
file_name = File.basename
|
204
|
+
def upload_cnvrg_image(absolute_path, image_name,secret)
|
205
|
+
file_name = File.basename relative_path
|
206
206
|
file_size = File.size(absolute_path).to_f
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
dpkg: dpkg,
|
221
|
-
libraries: libraries,
|
222
|
-
bash_history: bash,
|
223
|
-
commit_message: message,
|
224
|
-
is_base: is_base})
|
225
|
-
# puts upload_resp
|
226
|
-
if Cnvrg::CLI.is_response_success(upload_resp, false)
|
227
|
-
path = upload_resp["result"]["path"]
|
228
|
-
s3_res = upload_small_files_s3(path, absolute_path, content_type)
|
229
|
-
if s3_res
|
230
|
-
commit_resp = Cnvrg::API.request("users/#{owner}/images/#{upload_resp["result"]["id"]}/" + "commit", 'GET')
|
231
|
-
if Cnvrg::CLI.is_response_success(commit_resp, false)
|
232
|
-
return commit_resp["result"]["image"]
|
233
|
-
else
|
234
|
-
return false
|
235
|
-
end
|
236
|
-
|
237
|
-
end
|
207
|
+
mime_type = MimeMagic.by_path(absolute_path)
|
208
|
+
content_type = !(mime_type.nil? or mime_type.text?) ? mime_type.type : "text/plain"
|
209
|
+
upload_resp = Cnvrg::API.request("images/#{image_name}/upload_file", 'POST_FILE', {absolute_path: absolute_path, relative_path: absolute_path,
|
210
|
+
file_name: file_name,
|
211
|
+
file_size: file_size, file_content_type: content_type,
|
212
|
+
secret: secret})
|
213
|
+
if Cnvrg::CLI.is_response_success(upload_resp, false)
|
214
|
+
path = upload_resp["result"]["path"]
|
215
|
+
s3_res = upload_large_files_s3(upload_resp, absolute_path)
|
216
|
+
if s3_res
|
217
|
+
Cnvrg::API.request(@base_resource + "update_s3", 'POST', {path: path, commit_id: upload_resp["result"]["commit_id"],
|
218
|
+
blob_id: upload_resp["result"]["id"]})
|
219
|
+
return true
|
238
220
|
end
|
239
|
-
return false
|
240
|
-
rescue => e
|
241
221
|
end
|
222
|
+
return false
|
242
223
|
|
243
224
|
end
|
244
225
|
|
@@ -309,7 +290,7 @@ module Cnvrg
|
|
309
290
|
|
310
291
|
resp = s3.bucket(bucket).
|
311
292
|
object(upload_resp["result"]["path"]+"/"+File.basename(file_path)).
|
312
|
-
upload_file(file_path, {:use_accelerate_endpoint => true})
|
293
|
+
upload_file(file_path, {:use_accelerate_endpoint => true,:server_side_encryption => 'AES256'})
|
313
294
|
# s4cmd_path = upload_resp["result"]["path_s4cmd"]
|
314
295
|
#
|
315
296
|
# s4cmd_uri = URI.parse(s4cmd_path)
|
@@ -399,6 +380,7 @@ module Cnvrg
|
|
399
380
|
|
400
381
|
def create_dir(absolute_path, relative_path, commit_sha1)
|
401
382
|
response = Cnvrg::API.request(@base_resource + "create_dir", 'POST', {absolute_path: absolute_path, relative_path: relative_path, commit_sha1: commit_sha1})
|
383
|
+
puts response
|
402
384
|
return Cnvrg::CLI.is_response_success(response, false)
|
403
385
|
end
|
404
386
|
|
data/lib/cnvrg/experiment.rb
CHANGED
@@ -34,9 +34,8 @@ module Cnvrg
|
|
34
34
|
|
35
35
|
end
|
36
36
|
|
37
|
-
def end_notebook_session(notebook_slug
|
38
|
-
res = Cnvrg::API.request(@base_resource + "notebook/
|
39
|
-
{notebook_slug: notebook_slug, end_commit: end_commit})
|
37
|
+
def end_notebook_session(notebook_slug)
|
38
|
+
res = Cnvrg::API.request(@base_resource + "notebook/#{notebook_slug}/stop", 'GET')
|
40
39
|
Cnvrg::CLI.is_response_success(res,false)
|
41
40
|
|
42
41
|
return res
|
@@ -89,6 +88,11 @@ module Cnvrg
|
|
89
88
|
dataset_commit: data_commit})
|
90
89
|
return response
|
91
90
|
end
|
91
|
+
def remote_notebook(instance_type, commit, data, data_commit, notebook_type)
|
92
|
+
response = Cnvrg::API.request("users/#{@owner}/projects/#{@project_slug}/notebook/remote", 'POST', {instance_type: instance_type,dataset_slug:data,
|
93
|
+
dataset_commit: data_commit,commit:commit,notebook_type:notebook_type})
|
94
|
+
return response
|
95
|
+
end
|
92
96
|
|
93
97
|
def upload_temp_log(temp_log, cpu_average, memory_average)
|
94
98
|
response = Cnvrg::API.request(@base_resource + "experiment/upload_temp_log", 'POST', {output: temp_log,
|
data/lib/cnvrg/files.rb
CHANGED
@@ -3,7 +3,6 @@ require 'aws-sdk'
|
|
3
3
|
require 'URLcrypt'
|
4
4
|
require 'tempfile'
|
5
5
|
require 'net/http'
|
6
|
-
|
7
6
|
module Cnvrg
|
8
7
|
class Files
|
9
8
|
|
@@ -149,44 +148,32 @@ module Cnvrg
|
|
149
148
|
|
150
149
|
end
|
151
150
|
|
152
|
-
def upload_cnvrg_image(absolute_path, image_name,
|
151
|
+
def upload_cnvrg_image(absolute_path, image_name,secret)
|
153
152
|
file_name = File.basename absolute_path
|
154
153
|
file_size = File.size(absolute_path).to_f
|
155
|
-
|
156
|
-
|
157
|
-
content_type = "application/zip"
|
158
|
-
else
|
159
|
-
content_type = "application/gzip"
|
160
|
-
end
|
154
|
+
content_type = MimeMagic.by_path(absolute_path)
|
161
155
|
begin
|
162
|
-
upload_resp = Cnvrg::API.request("
|
156
|
+
upload_resp = Cnvrg::API.request("images/#{image_name}/upload", 'POST_FILE', {relative_path: absolute_path,
|
163
157
|
file_name: file_name,
|
164
|
-
image_name: image_name,
|
165
158
|
file_size: file_size,
|
166
159
|
file_content_type: content_type,
|
167
|
-
|
168
|
-
|
169
|
-
libraries: libraries,
|
170
|
-
bash_history: bash,
|
171
|
-
commit_message: message,
|
172
|
-
is_base: is_base})
|
160
|
+
secret:secret
|
161
|
+
})
|
173
162
|
# puts upload_resp
|
174
163
|
if Cnvrg::CLI.is_response_success(upload_resp, false)
|
175
|
-
|
176
|
-
s3_res = upload_small_files_s3(path, absolute_path, content_type)
|
164
|
+
s3_res = upload_large_files_s3(upload_resp, absolute_path)
|
177
165
|
if s3_res
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
else
|
182
|
-
return false
|
183
|
-
end
|
184
|
-
|
166
|
+
return true
|
167
|
+
else
|
168
|
+
return false
|
185
169
|
end
|
170
|
+
|
186
171
|
end
|
187
|
-
return false
|
188
172
|
rescue => e
|
173
|
+
return false
|
189
174
|
end
|
175
|
+
return false
|
176
|
+
|
190
177
|
|
191
178
|
end
|
192
179
|
|
@@ -213,6 +200,56 @@ module Cnvrg
|
|
213
200
|
end
|
214
201
|
|
215
202
|
|
203
|
+
end
|
204
|
+
def download_cnvrg_image(image_name, secret)
|
205
|
+
res =Cnvrg::API.request("images/#{image_name}/" + "download", 'POST', {secret:secret},true)
|
206
|
+
Cnvrg::CLI.is_response_success(res, true)
|
207
|
+
if res["result"]
|
208
|
+
download_resp = res
|
209
|
+
sts_path = download_resp["result"]["path_sts"]
|
210
|
+
uri = URI.parse(sts_path)
|
211
|
+
http_object = Net::HTTP.new(uri.host, uri.port)
|
212
|
+
http_object.use_ssl = true if uri.scheme == 'https'
|
213
|
+
request = Net::HTTP::Get.new(sts_path)
|
214
|
+
body = ""
|
215
|
+
http_object.start do |http|
|
216
|
+
response = http.request request
|
217
|
+
body = response.read_body
|
218
|
+
end
|
219
|
+
split = body.split("\n")
|
220
|
+
key = split[0]
|
221
|
+
iv = split[1]
|
222
|
+
|
223
|
+
access = Cnvrg::Helpers.decrypt(key, iv, download_resp["result"]["sts_a"])
|
224
|
+
|
225
|
+
secret = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["sts_s"])
|
226
|
+
|
227
|
+
session = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["sts_st"])
|
228
|
+
region = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["region"])
|
229
|
+
|
230
|
+
bucket = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["bucket"])
|
231
|
+
key = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["key"])
|
232
|
+
|
233
|
+
client = Aws::S3::Client.new(
|
234
|
+
:access_key_id =>access,
|
235
|
+
:secret_access_key => secret,
|
236
|
+
:session_token => session,
|
237
|
+
:region => region,
|
238
|
+
:http_open_timeout => 60, :retry_limit => 20
|
239
|
+
)
|
240
|
+
|
241
|
+
File.open("/tmp/#{image_name}.tar", 'w+') do |file|
|
242
|
+
resp = client.get_object({bucket:bucket,
|
243
|
+
key:key}, target: file)
|
244
|
+
end
|
245
|
+
return true
|
246
|
+
end
|
247
|
+
|
248
|
+
rescue => e
|
249
|
+
puts e
|
250
|
+
return false
|
251
|
+
|
252
|
+
|
216
253
|
end
|
217
254
|
|
218
255
|
def upload_large_files_s3(upload_resp, file_path)
|
@@ -284,7 +321,7 @@ module Cnvrg
|
|
284
321
|
s3 = Aws::S3::Resource.new(client: client)
|
285
322
|
resp = s3.bucket(bucket).
|
286
323
|
object(upload_resp["result"]["path"]+"/"+File.basename(file_path)).
|
287
|
-
upload_file(file_path, {:use_accelerate_endpoint => true})
|
324
|
+
upload_file(file_path, {:use_accelerate_endpoint => true, :server_side_encryption => 'AES256'})
|
288
325
|
|
289
326
|
return resp
|
290
327
|
|
@@ -349,6 +386,7 @@ module Cnvrg
|
|
349
386
|
begin
|
350
387
|
res = Cnvrg::API.request(@base_resource + "download_file", 'POST', {absolute_path: absolute_path, relative_path: relative_path,
|
351
388
|
commit_sha1: commit_sha1,new_version:true})
|
389
|
+
|
352
390
|
Cnvrg::CLI.is_response_success(res, false)
|
353
391
|
if res["result"]
|
354
392
|
download_resp = res
|
@@ -387,7 +425,6 @@ module Cnvrg
|
|
387
425
|
:region => region,
|
388
426
|
:http_open_timeout => 60, :retry_limit => 20
|
389
427
|
)
|
390
|
-
|
391
428
|
File.open(project_home+"/"+absolute_path, 'w+') do |file|
|
392
429
|
resp = client.get_object({bucket:bucket,
|
393
430
|
key:key}, target: file)
|
@@ -468,18 +505,18 @@ module Cnvrg
|
|
468
505
|
return true
|
469
506
|
|
470
507
|
end
|
471
|
-
def start_commit(new_branch)
|
508
|
+
def start_commit(new_branch,force:false)
|
472
509
|
|
473
|
-
response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {project_slug: @project_slug, new_branch: new_branch,
|
510
|
+
response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {project_slug: @project_slug, new_branch: new_branch,force:force,
|
474
511
|
username: @owner})
|
475
512
|
Cnvrg::CLI.is_response_success(response,false)
|
476
513
|
return response
|
477
514
|
end
|
478
515
|
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
516
|
+
def end_commit(commit_sha1,force:false)
|
517
|
+
response = Cnvrg::API.request("#{base_resource}/commit/end", 'POST', {commit_sha1: commit_sha1,force:force})
|
518
|
+
return response
|
519
|
+
end
|
483
520
|
|
484
521
|
def rollback_commit(commit_sha1)
|
485
522
|
response = Cnvrg::API.request("#{base_resource}/commit/rollback", 'POST', {commit_sha1: commit_sha1})
|
data/lib/cnvrg/project.rb
CHANGED
@@ -351,12 +351,11 @@ module Cnvrg
|
|
351
351
|
return response
|
352
352
|
end
|
353
353
|
|
354
|
-
def compare_idx(new_branch, commit
|
355
|
-
|
354
|
+
def compare_idx(new_branch, commit:last_local_commit,force:false)
|
356
355
|
local_idx = self.generate_idx
|
357
356
|
ignore_list = self.send_ignore_list()
|
358
357
|
response = Cnvrg::API.request("users/#{self.owner}/projects/#{self.slug}/status", 'POST', {idx: local_idx, new_branch: new_branch,
|
359
|
-
current_commit: commit,ignore:ignore_list})
|
358
|
+
current_commit: commit,ignore:ignore_list, force:force})
|
360
359
|
CLI.is_response_success(response,false)
|
361
360
|
return response
|
362
361
|
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:
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yochay Ettun
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-11-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -259,6 +259,20 @@ dependencies:
|
|
259
259
|
- - "~>"
|
260
260
|
- !ruby/object:Gem::Version
|
261
261
|
version: 1.12.0
|
262
|
+
- !ruby/object:Gem::Dependency
|
263
|
+
name: net_http_ssl_fix
|
264
|
+
requirement: !ruby/object:Gem::Requirement
|
265
|
+
requirements:
|
266
|
+
- - ">="
|
267
|
+
- !ruby/object:Gem::Version
|
268
|
+
version: '0'
|
269
|
+
type: :runtime
|
270
|
+
prerelease: false
|
271
|
+
version_requirements: !ruby/object:Gem::Requirement
|
272
|
+
requirements:
|
273
|
+
- - ">="
|
274
|
+
- !ruby/object:Gem::Version
|
275
|
+
version: '0'
|
262
276
|
- !ruby/object:Gem::Dependency
|
263
277
|
name: logstash-logger
|
264
278
|
requirement: !ruby/object:Gem::Requirement
|
@@ -402,7 +416,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
402
416
|
version: '0'
|
403
417
|
requirements: []
|
404
418
|
rubyforge_project:
|
405
|
-
rubygems_version: 2.6.
|
419
|
+
rubygems_version: 2.6.12
|
406
420
|
signing_key:
|
407
421
|
specification_version: 4
|
408
422
|
summary: A CLI tool for interacting with cnvrg.io.
|