cnvrg 0.0.15 → 0.0.140

Sign up to get free protection for your applications and to get access to all the features.
data/lib/cnvrg/cli.rb CHANGED
@@ -7,7 +7,7 @@ require 'uri'
7
7
  require 'open-uri'
8
8
  require 'json'
9
9
  require 'yaml'
10
- require 'digest' # sha1up
10
+ require 'digest' # sha1
11
11
  require "highline/import"
12
12
  require 'socket'
13
13
  include Open4
@@ -18,10 +18,6 @@ require 'cnvrg/project'
18
18
  require 'cnvrg/files'
19
19
  require 'cnvrg/experiment'
20
20
  require 'cnvrg/Images'
21
- require 'cnvrg/dataset'
22
- require 'cnvrg/datafiles'
23
- require 'cnvrg/data'
24
- require 'cnvrg/ssh'
25
21
  require 'etc'
26
22
  require 'logstash-logger'
27
23
  require 'cnvrg/job'
@@ -33,116 +29,28 @@ require 'fileutils'
33
29
  require 'zip'
34
30
  require 'active_support/all'
35
31
  require 'thor'
36
- require 'pathname'
37
- require 'enumerator'
38
-
39
- class Thor
40
- module Base
41
- def initialize(args = [], local_options = {}, config = {})
42
- parse_options = Thor.class_options
43
-
44
- # The start method splits inbound arguments at the first argument
45
- # that looks like an option (starts with - or --). It then calls
46
- # new, passing in the two halves of the arguments Array as the
47
- # first two parameters.
48
-
49
- command_options = config.delete(:command_options) # hook for start
50
- parse_options = parse_options.merge(command_options) if command_options
51
- if local_options.is_a?(Array)
52
- array_options = local_options
53
- hash_options = {}
54
- else
55
- # Handle the case where the class was explicitly instantiated
56
- # with pre-parsed options.
57
- array_options = []
58
- hash_options = local_options
59
-
60
- end
61
-
62
- # Let Thor::Options parse the options first, so it can remove
63
- # declared options from the array. This will leave us with
64
- # a list of arguments that weren't declared.
65
- stop_on_unknown = Thor.stop_on_unknown_option? config[:current_command]
66
- opts = Thor::Options.new(parse_options, hash_options, stop_on_unknown)
67
- real_options = []
68
-
69
- real_args = [].replace(array_options)
70
- if local_options.is_a? (Array) and !local_options.empty? and args.empty?
71
- array_options.each_with_index do |p, i|
72
- opt = p
73
- if p.include? "="
74
- opt = p.split("=")[0]
75
- end
76
- option = is_option(parse_options.values, opt)
77
- if !option
78
- break
79
- else
80
- real_options << p
81
- real_args.delete(p)
82
- if !p.include? "=" and option.type != :boolean
83
- if i+1< array_options.size
84
- real_options << array_options[i+1]
85
- real_args.delete(array_options[i+1])
86
- end
87
- end
88
-
89
- end
90
-
91
- end
92
-
93
- args = real_args
94
- else
95
- if !args.empty? and local_options.is_a? Array and !local_options.empty?
96
- args = args + local_options
97
- else
98
- args = args.flatten()
99
- end
100
-
101
- end
102
-
103
-
104
- self.options = opts.parse(real_options)
105
- self.options = config[:class_options].merge(options) if config[:class_options]
106
-
107
- # If unknown options are disallowed, make sure that none of the
108
- # remaining arguments looks like an option.
109
- opts.check_unknown! if Thor.check_unknown_options?(config)
110
-
111
- # Add the remaining arguments from the options parser to the
112
- # arguments passed in to initialize. Then remove any positional
113
- # arguments declared using #argument (this is primarily used
114
- # by Thor::Group). Tis will leave us with the remaining
115
- # positional arguments.
116
- to_parse = args
117
- to_parse += opts.remaining unless self.class.strict_args_position?(config)
118
- thor_args = Thor::Arguments.new(self.class.arguments)
119
- thor_args.parse(to_parse).each { |k, v| __send__("#{k}=", v) }
120
- @args = thor_args.remaining
121
- end
122
-
123
- def is_option (options, p)
124
- options.each do |o|
125
- if !o.aliases.nil?
126
- if (o.aliases.is_a? Array and o.aliases.include? p) or (o.aliases.is_a? Array and o.aliases.size ==1 and o.aliases[0].split(",").include? p) or o.switch_name.eql? p
127
- return o
128
- end
129
- end
130
-
131
- end
132
- return false
133
- end
134
-
135
- end
136
- end
137
-
32
+ require 'pry'
138
33
 
34
+ # DEV VERSION
35
+ #
139
36
  module Cnvrg
140
-
141
37
  class CLI < Thor
142
38
 
143
39
  INSTALLATION_URLS = {docker: "https://docs.docker.com/engine/installation/", jupyter: "http://jupyter.readthedocs.io/en/latest/install.html"}
144
40
  IP="localhost"
145
41
  PORT=7654
42
+ desc '', ''
43
+
44
+ def printable_commands(all = true, subcommand = false)
45
+ (all ? all_commands : commands).map do |_, command|
46
+ next if command.hidden? or (command.description.empty? and command.usage.empty?)
47
+ item = []
48
+ item << banner(command, false, subcommand)
49
+ item << (command.description ? "# #{command.description.gsub(/\s+/m, ' ')}" : "")
50
+ item
51
+ end.compact
52
+ end
53
+
146
54
  class << self
147
55
  # Hackery.Take the run method away from Thor so that we can redefine it.
148
56
  def is_thor_reserved_word?(word, type)
@@ -150,10 +58,9 @@ module Cnvrg
150
58
  super
151
59
  end
152
60
  end
153
- desc "data", "upload and manage datasets", :hide => true
154
- subcommand "data", Data
155
61
 
156
- desc "", "", :hide => true
62
+ desc "", ""
63
+ method_option :schedule, :type => :string, :aliases => ["--s", "-s"], :default => "leahs"
157
64
 
158
65
  def test
159
66
  # image_settings = {
@@ -171,10 +78,11 @@ module Cnvrg
171
78
  # },
172
79
  # },
173
80
  # }
174
- # container = Docker::Container.get('b4d64bf83f41')
175
- # s = "/leah/1/2/3/4/5"
176
- # command = ["/bin/bash","-lc","sed -i 's#c.NotebookApp.base_url = .*#c.NotebookApp.base_url = \"#{s}\"#' /home/ds/.jupyter/jupyter_notebook_config.py"]
177
- # puts container.exec(command, tty: true)
81
+ container = Docker::Container.get('b4d64bf83f41')
82
+ s = "/leah/1/2/3/4/5"
83
+ command = ["/bin/bash","-lc","sed -i 's#c.NotebookApp.base_url = .*#c.NotebookApp.base_url = \"#{s}\"#' /home/ds/.jupyter/jupyter_notebook_config.py"]
84
+ puts container.exec(command, tty: true)
85
+
178
86
  end
179
87
 
180
88
 
@@ -187,7 +95,7 @@ module Cnvrg
187
95
 
188
96
  map %w(-v --version) => :version
189
97
 
190
- desc 'api', 'set api url, e.g cnvrg --api "https://cnvrg.io/api"'
98
+ desc 'set api url', 'set api url'
191
99
 
192
100
  def set_api_url(url)
193
101
  home_dir = File.expand_path('~')
@@ -203,19 +111,15 @@ module Cnvrg
203
111
  end
204
112
  config = YAML.load_file(home_dir+"/.cnvrg/config.yml")
205
113
  owner = config.to_h[:owner]
206
- compression_path = "#{File.expand_path('~')}/.cnvrg/tmp"
207
114
 
208
115
  say "Setting default api to be: #{url}", Thor::Shell::Color::BLUE
209
116
  if config.empty?
210
- config = {owner: "", username: "", version_last_check: get_start_day(), api: url,compression_path: compression_path }
117
+ config = {owner: "", username: "", version_last_check: get_start_day(), api: url}
211
118
  else
212
- if !config.to_h[:compression_path].nil?
213
- compression_path = config.to_h[:compression_path]
214
- end
215
- config = {owner: config.to_h[:owner], username: config.to_h[:username], version_last_check: config.to_h[:version_last_check], api: url, compression_path: compression_path}
119
+ config = {owner: config.to_h[:owner], username: config.to_h[:username], version_last_check: config.to_h[:version_last_check], api: url}
216
120
  end
217
121
  res = Cnvrg::API.request("/users/#{owner}/custom_api", 'POST', {custom_api: url})
218
- if Cnvrg::CLI.is_response_success(res,false)
122
+ if Cnvrg::CLI.is_response_success(res)
219
123
 
220
124
  checks = Helpers.checkmark
221
125
 
@@ -233,7 +137,7 @@ module Cnvrg
233
137
  end
234
138
  end
235
139
 
236
- desc '', '', :hide => true
140
+ desc '', ''
237
141
 
238
142
  def set_remote_api_url(owner, current_user, url)
239
143
  home_dir = File.expand_path('~')
@@ -248,9 +152,7 @@ module Cnvrg
248
152
  FileUtils.touch [home_dir+"/.cnvrg/config.yml"]
249
153
  end
250
154
  config = YAML.load_file(home_dir+"/.cnvrg/config.yml")
251
-
252
- compression_path = "#{home_dir}/.cnvrg/tmp"
253
- config = {owner: owner, username: current_user, version_last_check: get_start_day(), api: url,compression_path:compression_path}
155
+ config = {owner: owner, username: current_user, version_last_check: get_start_day(), api: url}
254
156
  File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
255
157
  say "Done"
256
158
  rescue
@@ -260,108 +162,57 @@ module Cnvrg
260
162
 
261
163
  map %w(-api --api) => :set_api_url
262
164
 
263
- desc 'set_default_owner', 'set default owner'
165
+ desc 'set default owner', 'set default owner'
264
166
 
265
167
  def set_default_owner
266
- begin
267
- path = File.expand_path('~')+"/.cnvrg/config.yml"
268
- if !File.exist?(path)
269
- say "Couldn't find ~/.cnvrg/config.yml file, please logout and login again", Thor::Shell::Color::RED
270
-
271
- exit(0)
272
- end
273
- config = YAML.load_file(path)
274
168
 
275
- username = config.to_h[:username]
276
- res = Cnvrg::API.request("/users/#{username}/get_possible_owners", 'GET')
277
- if Cnvrg::CLI.is_response_success(res)
278
- owner = username
279
- result = res["result"]
280
- owners = result["owners"]
281
- urls = result["urls"]
282
- choose_owner = result["username"]
283
- if owners.empty?
284
- else
285
- owners << choose_owner
286
- chosen = false
287
- while !chosen
288
- owners_id = owners.each_with_index.map { |x, i| "#{i+1}. #{x}" }
289
- choose_owner = ask("Choose default owner:\n"+owners_id.join("\n")+"\n")
290
-
291
- if choose_owner =~ /[[:digit:]]/
292
- ow_index = choose_owner.to_i-1
293
- if ow_index<0 or ow_index >= owners.size
294
- say "No such owner, please choose again", Thor::Shell::Color::BLUE
295
- chosen = false
296
- next
297
- end
298
- choose_owner = owners[choose_owner.to_i-1]
299
- chosen = true
169
+ path = File.expand_path('~')+"/.cnvrg/config.yml"
170
+ if !File.exist?(path)
171
+ say "Couldn't find ~/.cnvrg/config.yml file, please logout and login again", Thor::Shell::Color::RED
300
172
 
301
- else
173
+ exit(0)
174
+ end
175
+ config = YAML.load_file(path)
302
176
 
303
- owners_lower = owners.map { |o| o.downcase }
304
- ow_index = owners_lower.index(choose_owner.downcase)
305
- if ow_index.nil?
306
- say "Could not find owner named #{choose_owner}", Thor::Shell::Color::RED
307
- else
308
- chosen = true
309
- end
310
- end
177
+ username = config.to_h[:username]
178
+ res = Cnvrg::API.request("/users/#{username}/get_possible_owners", 'GET')
179
+ if Cnvrg::CLI.is_response_success(res)
180
+ owner = username
181
+ result = res["result"]
182
+ owners = result["owners"]
183
+ urls = result["urls"]
184
+ choose_owner = result["username"]
311
185
 
186
+ if owners.empty?
187
+ else
188
+ owners << choose_owner
189
+ chosen = false
190
+ while !chosen
191
+ choose_owner = ask("Choose default owner:\n"+owners.join("\n")+"\n")
192
+
193
+ owners_lower = owners.map { |o| o.downcase }
194
+ ow_index = owners_lower.index(choose_owner.downcase)
195
+ if ow_index.nil?
196
+ say "Could not find owner named #{choose_owner}", Thor::Shell::Color::RED
197
+ else
198
+ chosen = true
312
199
  end
313
-
314
-
315
- end
316
- if set_owner(choose_owner, result["username"], urls[ow_index])
317
- say "Setting default owner: #{choose_owner}", Thor::Shell::Color::GREEN
318
- else
319
- say "Setting default owenr has failed, try to run cnvrg --config-default-owner", Thor::Shell::Color::RED
320
200
  end
321
- end
322
- rescue SignalException
323
- say "\nAborting"
324
- exit(1)
325
- end
326
- end
327
201
 
328
- desc 'set_compression_path', 'set compression path'
329
- method_option :reset, :type => :boolean, :aliases => ["-r","--reset"], :default => false
330
202
 
331
- def set_compression_path(*compression_path)
332
- begin
333
- if (compression_path.nil? or compression_path.empty?) and options["reset"]
334
- compression_path = ["#{File.expand_path('~')}/.cnvrg/tmp"]
335
203
  end
336
- compression_path = compression_path.join(" ")
337
- if !Dir.exist? compression_path
338
- say "Couldn't find #{compression_path}, please make sure it exist", Thor::Shell::Color::RED
339
- exit(0)
340
- end
341
-
342
- home_dir = File.expand_path('~')
343
- path = "#{home_dir}/.cnvrg/config.yml"
344
- if !File.exist?(path)
345
- say "Couldn't find ~/.cnvrg/config.yml file, please logout and login again", Thor::Shell::Color::RED
346
-
347
- exit(0)
204
+ if set_owner(owner, username,urls[ow_index])
205
+ say "Setting default owner: #{owner}", Thor::Shell::Color::GREEN
206
+ else
207
+ say "Setting default owenr has failed, try to run cnvrg --config-default-owner", Thor::Shell::Color::RED
348
208
  end
349
- config = YAML.load_file(path)
350
- config_new = {owner: config.to_h[:owner], username: config.to_h[:username],
351
- version_last_check: config.to_h[:version_last_check], api: config.to_h[:api], compression_path: compression_path}
352
- File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config_new.to_yaml }
353
- checks = Helpers.checkmark
354
- say "#{checks} Done", Thor::Shell::Color::GREEN
355
-
356
- rescue SignalException
357
- say "\nAborting"
358
- exit(1)
359
209
  end
360
210
  end
361
211
 
212
+ map %w(--set-default-owner) => :set_default_owner
362
213
 
363
214
 
364
- desc 'login', 'Authenticate with cnvrg.io platform'
215
+ desc 'login', 'Authenticate with cnvrg.io and store credentials'
365
216
 
366
217
  def login
367
218
  begin
@@ -389,46 +240,25 @@ module Cnvrg
389
240
  owners = result["owners"]
390
241
  urls = result["urls"]
391
242
  choose_owner = result["username"]
392
- ow_index = 0
243
+
393
244
  if owners.empty?
394
- choose_owner = result["username"]
395
245
  else
396
- choose_owner = owners[0]
397
- end
246
+ owners << choose_owner
247
+ chosen = false
248
+ while !chosen
249
+ choose_owner = ask("Choose default owner:\n"+owners.join("\n")+"\n")
398
250
 
399
- # if owners.empty?
400
- # else
401
- # owners << choose_owner
402
- # chosen = false
403
- # while !chosen
404
- # owners_id = owners.each_with_index.map { |x, i| "#{i+1}. #{x}" }
405
- # choose_owner = ask("Choose default owner:\n"+owners_id.join("\n")+"\n")
406
- #
407
- # if choose_owner =~ /[[:digit:]]/
408
- # ow_index = choose_owner.to_i-1
409
- # if ow_index<0 or ow_index >= owners.size
410
- # say "No such owner, please choose again", Thor::Shell::Color::BLUE
411
- # chosen = false
412
- # next
413
- # end
414
- # choose_owner = owners[choose_owner.to_i-1]
415
- # chosen = true
416
- #
417
- # else
418
- #
419
- # owners_lower = owners.map { |o| o.downcase }
420
- # ow_index = owners_lower.index(choose_owner.downcase)
421
- # if ow_index.nil?
422
- # say "Could not find owner named #{choose_owner}", Thor::Shell::Color::RED
423
- # else
424
- # chosen = true
425
- # end
426
- # end
427
- #
428
- # end
251
+ owners_lower = owners.map { |o| o.downcase }
252
+ ow_index = owners_lower.index(choose_owner.downcase)
253
+ if ow_index.nil?
254
+ say "Could not find owner named #{choose_owner}", Thor::Shell::Color::RED
255
+ else
256
+ chosen = true
257
+ end
258
+ end
429
259
 
430
260
 
431
- # end
261
+ end
432
262
 
433
263
  if set_owner(choose_owner, result["username"], urls[ow_index])
434
264
  say "Setting default owner: #{choose_owner}", Thor::Shell::Color::GREEN
@@ -444,11 +274,6 @@ module Cnvrg
444
274
 
445
275
  exit(1)
446
276
  end
447
- rescue
448
-
449
- say "Error Occurred, aborting", Thor::Shell::Color::RED
450
- logout()
451
- exit(1)
452
277
  rescue SignalException
453
278
 
454
279
  say "\nAborting"
@@ -478,6 +303,7 @@ module Cnvrg
478
303
 
479
304
  def me()
480
305
  begin
306
+
481
307
  verify_logged_in(false)
482
308
  log_start(__method__, args, options)
483
309
  auth = Cnvrg::Auth.new
@@ -488,7 +314,6 @@ module Cnvrg
488
314
  end
489
315
 
490
316
  log_end(0)
491
-
492
317
  rescue SignalException
493
318
  log_end(-1)
494
319
 
@@ -499,8 +324,8 @@ module Cnvrg
499
324
 
500
325
  ## Projects
501
326
  desc 'new', 'Create a new cnvrg project'
502
- method_option :clean, :type => :boolean, :aliases => ["-c"], :default => false
503
- method_option :docker_image, :type => :string, :aliases => ["-d"], :default => ""
327
+ method_option :clean, :type => :boolean, :aliases => ["-c", "--c"], :default => false
328
+ method_option :docker_image, :type => :string, :aliases => ["-d", "--d"], :default => ""
504
329
 
505
330
  def new(project_name)
506
331
  begin
@@ -568,8 +393,8 @@ module Cnvrg
568
393
  say "created project successfully", Thor::Shell::Color::GREEN
569
394
  say "Linked directory to\t#{@project.url}", Thor::Shell::Color::GREEN
570
395
  rescue => e
571
- log_end(-1, e.message)
572
- say "Error occurred, aborting", Thor::Shell::Color::RED
396
+ puts e
397
+ log_end(-1)
573
398
  if Dir.exist? working_dir
574
399
 
575
400
  @project.revert(working_dir)
@@ -587,7 +412,6 @@ module Cnvrg
587
412
  exit(1)
588
413
  end
589
414
  end
590
-
591
415
  desc 'set_image', 'set_image for a project'
592
416
 
593
417
  def set_image(docker_image)
@@ -624,10 +448,9 @@ module Cnvrg
624
448
  @image.update_image_activity(nil, nil)
625
449
 
626
450
  end
627
-
628
- desc 'link', 'Link current directory to a new cnvrg project'
629
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
630
- method_option :docker_image, :type => :string, :aliases => ["-d"], :default => ""
451
+ desc 'link', 'Link current directory to a cnvrg project'
452
+ method_option :sync, :type => :boolean, :aliases => ["-s", "--s"], :default => true
453
+ method_option :docker_image, :type => :string, :aliases => ["-d", "--d"], :default => ""
631
454
 
632
455
  def link
633
456
  begin
@@ -651,7 +474,7 @@ module Cnvrg
651
474
  end
652
475
  working_dir = Dir.getwd
653
476
  owner = CLI.get_owner
654
- if Project.link(owner, project_name, docker)
477
+ if Project.link(owner,project_name, docker)
655
478
  path = Dir.pwd
656
479
  @project = Project.new(path)
657
480
  @project.generate_idx()
@@ -708,834 +531,143 @@ module Cnvrg
708
531
  exit(1)
709
532
  end
710
533
  end
711
-
712
- desc 'data init', 'Init dataset directory'
713
- method_option :public, :type => :boolean, :aliases => ["-p", "--public"], :default => false
714
-
715
- def init_data(public)
716
- begin
717
- verify_logged_in(false)
718
- log_start(__method__, args, options)
719
- dataset_name =File.basename(Dir.getwd)
720
- if File.directory?(Dir.getwd+"/.cnvrg")
721
- config = YAML.load_file("#{Dir.getwd}/.cnvrg/config.yml")
722
- say "Directory is already linked to #{config[:dataset_slug]}", Thor::Shell::Color::RED
723
-
724
- exit(0)
725
- end
726
- say "Init dataset: #{dataset_name}", Thor::Shell::Color::BLUE
727
-
728
- working_dir = Dir.getwd
729
- owner = CLI.get_owner
730
- if Dataset.init(owner, dataset_name, options["public"])
731
- path = Dir.pwd
732
- @dataset = Dataset.new(path)
733
-
734
- url = @dataset.url
735
- check = Helpers.checkmark
736
- say "#{check} Link finished successfully", Thor::Shell::Color::GREEN
737
- say "#{dataset_name}'s location is: #{url}\n", Thor::Shell::Color::GREEN
738
- log_end(0)
739
-
740
- else
741
- log_end(1, "can't create dataset")
742
- @dataset.revert(working_dir) unless @dataset.nil?
743
- say "Error creating dataset, please contact support.", Thor::Shell::Color::RED
744
- exit(0)
745
- end
746
- rescue SignalException
747
- log_end(-1)
748
-
749
- say "\nAborting"
750
- exit(1)
751
- end
534
+ desc 'unlink','Unlink a porject'
535
+ def unlink
536
+ verify_logged_in(false)
537
+ log_start(__method__, args, options)
538
+ working_dir = is_cnvrg_dir()
539
+ list_to_del = [working_dir+"/.cnvrgignore",working_dir+"/.cnvrg"]
540
+ FileUtils.rm_rf list_to_del
752
541
  end
753
542
 
754
- desc 'data clone', 'Clone dataset'
755
- method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :default => ""
543
+ desc 'clone', 'Clone a project'
544
+ method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false
545
+ method_option :commit, :type => :string, :aliases => ["-c", "--c"], :default => nil
756
546
 
757
- def clone_data(dataset_url)
547
+ def clone(project_url)
758
548
  begin
759
549
  verify_logged_in(false)
760
550
  log_start(__method__, args, options)
761
- url_parts = dataset_url.split("/")
762
- project_index = Cnvrg::Helpers.look_for_in_path(dataset_url, "datasets")
551
+ url_parts = project_url.split("/")
552
+ project_index = Cnvrg::Helpers.look_for_in_path(project_url, "projects")
763
553
  slug = url_parts[project_index+1]
764
554
  owner = url_parts[project_index-1]
765
- response = Cnvrg::API.request("users/#{owner}/datasets/#{slug}/clone", 'GET')
766
-
555
+ remote = options["remote"] || false
556
+ response = Cnvrg::API.request("users/#{owner}/projects/#{slug}/get_project", 'GET')
767
557
  Cnvrg::CLI.is_response_success(response)
768
- dataset_name = response["result"]["name"]
769
- if (Dir.exists? dataset_name)
770
- say "Error: Conflict with dir #{dataset_name}", Thor::Shell::Color::RED
771
- if no? "Sync to repository anyway? (current data might lost)", Thor::Shell::Color::YELLOW
772
- say "Remove dir in order to clone #{dataset_name}", Thor::Shell::Color::RED
773
- log_end(1, "conflict with dir #{dataset_name}")
558
+ response = JSON.parse response["result"]
559
+ project_name = response["title"]
560
+ commit_to_clone = options["commit"] || nil
561
+
562
+ say "Cloning #{project_name}", Thor::Shell::Color::BLUE
563
+ clone_resp = false
564
+ if remote
565
+ clone_resp = Project.clone_dir_remote(slug, owner, project_name)
566
+ project_home = Dir.pwd
567
+ else
568
+ if (Dir.exists? project_name)
569
+ say "Error: Conflict with dir #{project_name}", Thor::Shell::Color::RED
570
+ if no? "Sync to repository anyway? (current data might lost)", Thor::Shell::Color::YELLOW
571
+ say "Remove dir in order to clone #{project_name}", Thor::Shell::Color::RED
572
+ log_end(1, "conflict with dir #{project_name}")
573
+
574
+ exit(1)
575
+ end
774
576
 
775
- exit(1)
776
577
  end
578
+ clone_resp = Project.clone_dir(slug, owner, project_name)
579
+ project_home = Dir.pwd+"/"+project_name
580
+
777
581
 
778
582
  end
779
- if Dataset.clone(owner, dataset_name, slug)
780
- say "Cloning #{dataset_name}", Thor::Shell::Color::BLUE
781
583
 
782
- commit_to_clone = options["commit"] || nil
783
- working_dir = "#{Dir.pwd}/#{dataset_name}"
784
- @dataset = Dataset.new(working_dir)
785
- @dataset.generate_idx()
786
- say "Downloading data", Thor::Shell::Color::BLUE
584
+ if clone_resp
585
+ @project = Project.new(project_home)
586
+ @files = Cnvrg::Files.new(@project.owner, slug)
587
+ response = @project.clone(remote, commit_to_clone)
588
+ Cnvrg::CLI.is_response_success response
589
+ working_dir = project_home
590
+ docker_image = response["result"]["image"]
591
+ idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
592
+ File.open(working_dir + "/.cnvrg/idx.yml", "w+") { |f| f.write idx.to_yaml }
593
+ if !docker_image.nil? and !docker_image.empty? and !remote
594
+ local_images = Docker::Image.all
595
+ docker_image_local = local_images.map { |x| x.info["RepoTags"] }.flatten.select { |y| y.eql? "#{docker_image}:latest" }.flatten
596
+ if docker_image_local.size == 0
597
+ if yes? "Image wasn't found locally, pull image from cnvrg repository?", Thor::Shell::Color::YELLOW
598
+ image = pull(docker_image)
599
+ if image
600
+ say "downloaded image: #{docker_image}"
601
+ @image = Images.new(working_dir, docker_image)
602
+ else
603
+ say "Could not create a new project with docker, image was not found", Thor::Shell::Color::RED
604
+ @project.revert(working_dir)
605
+ exit(1)
606
+ end
607
+ end
787
608
 
609
+ elsif docker_image_local.size == 1
610
+ say "found image: #{docker_image_local[0]}, setting it up..", Thor::Shell::Color::BLUE
611
+ @image = Images.new(working_dir, docker_image_local[0])
612
+ elsif docker_image_local.size >1
613
+ say "found #{docker_image_local.size} images, choose the image name you want to use", Thor::Shell::Color::BLUE
614
+ image_name = ask "#{docker_image_local.join("\n")}\n", Thor::Shell::Color::BLUE
615
+ @image = Images.new(working_dir, image_name)
616
+ end
788
617
 
789
- download_data(false, false, path = working_dir, in_dir=false)
618
+ end
790
619
 
620
+ successful_changes = []
621
+ say "Downloading files", Thor::Shell::Color::BLUE
622
+ if !response["result"]["tree"].nil?
623
+ response["result"]["tree"].each do |f|
624
+ relative_path = f[0].gsub(/^#{@project.local_path}/, "")
625
+ if f[0].end_with? "/"
626
+ # dir
627
+ if @files.download_dir(f[0], relative_path, project_home)
628
+ successful_changes << relative_path
629
+ end
630
+ else
631
+ # blob
632
+ if @files.download_file_s3(f[0], relative_path, project_home)
633
+ successful_changes << relative_path
634
+ end
635
+ end
636
+ end
637
+ end
791
638
 
792
- check = Helpers.checkmark
793
- say "#{check} Clone finished successfully", Thor::Shell::Color::GREEN
639
+ say "Done.\nDownloaded total of #{successful_changes.size} files", Thor::Shell::Color::GREEN
794
640
  log_end(0)
795
-
796
641
  else
797
- log_end(1, "can't create dataset")
798
- @dataset.revert(working_dir) unless @dataset.nil?
799
- say "Error creating dataset, please contact support.", Thor::Shell::Color::RED
800
- exit(0)
642
+ log_end(1, "can't create directory")
643
+
644
+ say "Error: Couldn't create directory: #{project_name}", Thor::Shell::Color::RED
645
+ exit(1)
801
646
  end
802
647
  rescue SignalException
803
648
  log_end(-1)
804
-
805
649
  say "\nAborting"
806
650
  exit(1)
807
651
  end
652
+
808
653
  end
809
654
 
810
- desc 'init_data_container', 'Init dataset directory', :hide => true
811
- method_option :login_content, :type => :string, :aliases => ["-l"], :default => ""
812
655
 
813
- def init_data_container(container)
656
+ desc 'status', 'Show the working tree status'
657
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
658
+
659
+
660
+ def status
814
661
  begin
815
- login_content = options["login_content"]
816
-
817
- container = Docker::Container.get(container)
818
- command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
819
- container.exec(command, tty: true)
820
- command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg"]
821
- container.exec(command, tty: true)
822
- command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg/tmp"]
823
- container.exec(command, tty: true)
824
- command = ["/bin/bash", "-lc", "sudo chown -R ds /home/ds/.cnvrg /home/ds/.netrc"]
825
- container.exec(command, tty: true)
826
- command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
827
- container.exec(command, tty: true)
828
-
829
- rescue SignalException
830
- log_end(-1)
831
-
832
- say "\nAborting"
833
- exit(1)
834
- end
835
- end
836
-
837
- desc 'data_snap', 'Init dataset directory', :hide => true
838
- method_option :public, :type => :boolean, :aliases => ["-p", "--public"], :default => false
839
-
840
- def snap_data
841
- begin
842
- verify_logged_in(false)
843
- log_start(__method__, args, options)
844
-
845
- owner = CLI.get_owner
846
- path = Dir.pwd
847
- @dataset = Dataset.new(path)
848
-
849
- log_end(0)
850
-
851
- rescue SignalException
852
- log_end(-1)
853
-
854
- say "\nAborting"
855
- exit(1)
856
- end
857
- end
858
-
859
- desc 'data_snap', 'Init dataset directory', :hide => true
860
-
861
- def data_init_container(owner, dataset_slug, dataset_name)
862
-
863
- if Dataset.init_container(owner, dataset_slug, dataset_name)
864
-
865
- say "init finished successfully", Thor::Shell::Color::GREEN
866
- log_end(0)
867
-
868
- else
869
- log_end(1, "can't create dataset")
870
- say "error creating dataset, please contact support.", Thor::Shell::Color::RED
871
- exit(0)
872
- end
873
- end
874
-
875
- desc 'data download', 'pull data'
876
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
877
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
878
-
879
- def download_data(verbose, sync, path=Dir.pwd, in_dir=true)
880
- begin
881
- verify_logged_in(in_dir)
882
- log_start(__method__, args, options)
883
- if path.nil? or path.empty?
884
- path = Dir.pwd
885
- end
886
- dataset_dir = is_cnvrg_dir(path)
887
- @dataset = Dataset.new(dataset_dir)
888
-
889
- @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
890
- new_branch = options["new_branch"] || false
891
-
892
- res = @dataset.compare_idx(new_branch)["result"]
893
-
894
- result = res["tree"]
895
-
896
- commit = res["commit"]
897
- if result["updated_on_server"].empty? and result["conflicts"].empty? and result["deleted"].empty?
898
- say "Project is up to date", Thor::Shell::Color::GREEN unless (options["sync"] or sync)
899
- log_end(0)
900
- return true
901
- end
902
- result = @dataset.downlowd_updated_data(@dataset.last_local_commit)
903
-
904
- delete = result["result"]["delete"]
905
- commits = result["result"]["commits"]
906
- updated_idx = result["result"]["idx"]
907
- commits.each do |c|
908
- file_name = @files.download_data_file(c, dataset_dir)
909
-
910
- if file_name.eql? false or file_name.nil?
911
- ##RETRY
912
- next
913
- end
914
- file_path = "#{dataset_dir}/#{file_name}"
915
- success = extarct_tar(file_path, dataset_dir)
916
- if !success
917
- #TODO: ?
918
- end
919
-
920
- FileUtils.rm_rf([file_path])
921
-
922
- end
923
- to_delete = []
924
- delete.each do |d|
925
- to_delete << "#{dataset_dir}/#{d}"
926
- end
927
- FileUtils.rm_rf(to_delete)
928
-
929
- @dataset.update_idx(updated_idx)
930
-
931
-
932
- # result["conflicts"].each do |f|
933
- # relative_path = f.gsub(/^#{@dataset.local_path}/, "")
934
- # if @files.download_file_s3(f, relative_path, dataset_dir, conflict=true)
935
- # successful_changes << relative_path
936
- # end
937
- #
938
- # end
939
- # update idx with latest commit
940
- # @dataset.update_idx_with_commit!(commit)
941
- check = Helpers.checkmark()
942
- say "#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN
943
-
944
-
945
- log_end(0)
946
- end
947
- rescue
948
- log_end(-1)
949
-
950
- say "Error occurd, \nAborting", Thor::Shell::Color::BLUE
951
- exit(1)
952
- rescue SignalException
953
- log_end(-1)
954
- say "\nAborting", Thor::Shell::Color::BLUE
955
- exit(1)
956
- end
957
-
958
-
959
- desc 'upload_data', 'Upload data files', :hide => true
960
- method_option :ignore, :type => :array, :aliases => ["-i", "--i"], :desc => "ignore following files"
961
- method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
962
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
963
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
964
-
965
- def upload_data(sync=false, direct=false)
966
-
967
- begin
968
- verify_logged_in(true)
969
- log_start(__method__, args, options)
970
- dataset_dir = is_cnvrg_dir(Dir.pwd)
971
- @dataset = Dataset.new(dataset_dir)
972
-
973
- @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
974
- ignore = options[:ignore] || []
975
- if !@dataset.update_ignore_list(ignore)
976
- say "Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW
977
- end
978
- result = @dataset.compare_idx(false)
979
-
980
- commit = result["result"]["commit"]
981
- if commit != @dataset.last_local_commit and !@dataset.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?
982
- log_end(0)
983
-
984
- say "Remote server has an updated version, please run `cnvrg download` first, or alternatively: `cnvrg sync`", Thor::Shell::Color::YELLOW
985
- exit(1)
986
- end
987
-
988
- say "Comparing local changes with remote version:", Thor::Shell::Color::BLUE if options["verbose"]
989
- result = result["result"]["tree"]
990
- # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
991
- # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
992
- # if all.size == 1
993
- # num = "conflict"
994
- # else
995
- # num = "conflicts"
996
- # end
997
- # say "Project contains #{all.size} #{num}:", Thor::Shell::Color::RED
998
- # say "#{all.join("\n")}"
999
- # say "Please fix #{num}, and retry", Thor::Shell::Color::RED
1000
- # exit(1)
1001
- #
1002
- # end
1003
- check = Helpers.checkmark()
1004
-
1005
- if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
1006
- log_end(0)
1007
- say "#{check} Dataset is up to date", Thor::Shell::Color::GREEN unless ((options["sync"] or sync) and !direct)
1008
- return true
1009
- end
1010
- update_count = 0
1011
- update_total = result["added"].size + result["updated_on_local"].size + result["deleted"].size
1012
- successful_updates = []
1013
- successful_deletions = []
1014
- if options["verbose"]
1015
- if update_total == 1
1016
- say "Updating #{update_total} file", Thor::Shell::Color::BLUE
1017
- else
1018
- say "Updating #{update_total} files", Thor::Shell::Color::BLUE
1019
- end
1020
- else
1021
- say "Syncing files", Thor::Shell::Color::BLUE unless (options["sync"] or sync)
1022
-
1023
- end
1024
-
1025
- # Start commit
1026
-
1027
- commit_sha1 = @files.start_commit(false)["result"]["commit_sha1"]
1028
- # upload / update
1029
- begin
1030
- (result["added"] + result["updated_on_local"]).each do |f|
1031
- absolute_path = "#{@dataset.local_path}/#{f}"
1032
- relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
1033
- if File.directory?(absolute_path)
1034
- resDir = @files.create_dir(absolute_path, relative_path, commit_sha1)
1035
- if resDir
1036
- update_count += 1
1037
- successful_updates<< relative_path
1038
- end
1039
- else
1040
- res = @files.upload_file(absolute_path, relative_path, commit_sha1)
1041
-
1042
- if res
1043
- update_count += 1
1044
- successful_updates<< relative_path
1045
- else
1046
- @files.rollback_commit(commit_sha1)
1047
- log_end(1, "can't upload, Rolling Back all changes")
1048
- say "Couldn't upload, Rolling Back all changes.", Thor::Shell::Color::RED
1049
- exit(0)
1050
- end
1051
- end
1052
- end
1053
-
1054
- # delete
1055
- deleted = update_deleted(result["deleted"])
1056
- deleted.each do |f|
1057
- relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
1058
- if relative_path.end_with?("/")
1059
- if @files.delete_dir(f, relative_path, commit_sha1)
1060
- # update_count += 1
1061
- successful_updates<< relative_path
1062
- end
1063
- else
1064
- if @files.delete_file(f, relative_path, commit_sha1)
1065
- # update_count += 1
1066
- successful_updates<< relative_path
1067
- end
1068
- end
1069
- end
1070
-
1071
- rescue SignalException
1072
- log_end(-1)
1073
- @files.rollback_commit(commit_sha1)
1074
- say "User aborted, Rolling Back all changes.", Thor::Shell::Color::RED
1075
- exit(0)
1076
- rescue => e
1077
- log_end(-1, e.message)
1078
- @files.rollback_commit(commit_sha1)
1079
- say "Exception while trying to upload, Rolling back", Thor::Shell::Color::RED
1080
- exit(0)
1081
- end
1082
- if !result["deleted"].nil? and !result["deleted"].empty?
1083
- update_count += result["deleted"].size
1084
- end
1085
- if update_count == update_total
1086
- res = @files.end_commit(commit_sha1)
1087
- if (Cnvrg::CLI.is_response_success(res, false))
1088
- # save idx
1089
- begin
1090
- @dataset.update_idx_with_files_commits!((successful_deletions+successful_updates), res["result"]["commit_time"])
1091
-
1092
- @dataset.update_idx_with_commit!(commit_sha1)
1093
- rescue => e
1094
- log_end(-1, e.message)
1095
- @files.rollback_commit(commit_sha1)
1096
- say "Couldn't commit updates, Rolling Back all changes.", Thor::Shell::Color::RED
1097
- exit(1)
1098
-
1099
- end
1100
- if options["verbose"]
1101
- say "#{check} Done", Thor::Shell::Color::BLUE
1102
- if successful_updates.size >0
1103
- say "Updated:", Thor::Shell::Color::GREEN
1104
- suc = successful_updates.map { |x| x=Helpers.checkmark() +" "+x }
1105
- say suc.join("\n"), Thor::Shell::Color::GREEN
1106
- end
1107
- if successful_deletions.size >0
1108
- say "Deleted:", Thor::Shell::Color::GREEN
1109
- del = successful_updates.map { |x| x=Helpers.checkmark() +" "+x }
1110
- say del.join("\n"), Thor::Shell::Color::GREEN
1111
- end
1112
- say "Total of #{update_count} / #{update_total} files.", Thor::Shell::Color::GREEN
1113
- else
1114
- if (options["sync"] or sync) and direct
1115
- say "#{check} Syncing dataset completed successfully", Thor::Shell::Color::GREEN
1116
-
1117
- else
1118
- say "#{check} Changes were updated successfully", Thor::Shell::Color::GREEN
1119
-
1120
- end
1121
-
1122
- end
1123
-
1124
- log_end(0)
1125
- else
1126
- @files.rollback_commit(commit_sha1)
1127
- log_end(1, "error. Rolling Back all changes")
1128
- say "Error. Rolling Back all changes.", Thor::Shell::Color::RED
1129
- end
1130
- else
1131
- log_end(1, "error. Rolling Back all changes")
1132
- say "Error occurd, \nRolling back", Thor::Shell::Color::RED
1133
-
1134
- @files.rollback_commit(commit_sha1)
1135
- end
1136
- rescue => e
1137
-
1138
- log_end(-1)
1139
-
1140
- say "Error occurd, \nAborting", Thor::Shell::Color::RED
1141
- @files.rollback_commit(commit_sha1)
1142
- exit(1)
1143
- rescue SignalException
1144
- log_end(-1)
1145
-
1146
- say "\nAborting", Thor::Shell::Color::BLUE
1147
- say "\nRolling back all changes", Thor::Shell::Color::BLUE
1148
- @files.rollback_commit(commit_sha1)
1149
- exit(1)
1150
- end
1151
-
1152
- end
1153
-
1154
- desc 'data upload', 'push data'
1155
- method_option :ignore, :type => :array, :aliases => ["-i", "--i"], :desc => "ignore following files"
1156
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1157
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
1158
- method_option :no_compression, :type => :boolean, :aliases => ["-nc", "--no_compression"], :default => false
1159
-
1160
- def upload_data_tar(ignore, verbose, sync,no_compression)
1161
-
1162
- begin
1163
- verify_logged_in(true)
1164
- log_start(__method__, args, options)
1165
- dataset_dir = is_cnvrg_dir(Dir.pwd)
1166
-
1167
- @dataset = Dataset.new(dataset_dir)
1168
-
1169
- @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
1170
- if !@dataset.update_ignore_list(ignore)
1171
- say "Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::RED
1172
- exit(1)
1173
- end
1174
- say "Checking dataset", Thor::Shell::Color::BLUE
1175
- local_idx = @dataset.generate_idx
1176
- result = @dataset.compare_idx(false, commit=@dataset.last_local_commit, local_idx= local_idx)
1177
-
1178
-
1179
- commit = result["result"]["commit"]
1180
- if commit != @dataset.last_local_commit and !@dataset.last_local_commit.nil? and !result["result"]["tree"]["updated_on_server"].empty?
1181
- log_end(0)
1182
-
1183
- say "Remote server has an updated version, please run `cnvrg data download` first", Thor::Shell::Color::YELLOW
1184
- exit(1)
1185
- end
1186
-
1187
- say "Comparing local changes with remote version:", Thor::Shell::Color::BLUE if verbose
1188
- result = result["result"]["tree"]
1189
- check = Helpers.checkmark()
1190
-
1191
- if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
1192
- log_end(0)
1193
- say "#{check} Dataset is up to date", Thor::Shell::Color::GREEN unless (sync)
1194
- return true
1195
- end
1196
- update_count = 0
1197
- update_total = result["added"].size + result["updated_on_local"].size + result["deleted"].size
1198
- successful_updates = []
1199
- successful_deletions = []
1200
-
1201
- # Start commit
1202
- res = @files.start_commit(false)["result"]
1203
- commit_sha1 =res["commit_sha1"]
1204
- commit_time = res["commit_time"]
1205
- # upload / update
1206
- begin
1207
- (result["added"] + result["updated_on_local"]).each do |f|
1208
- relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
1209
- successful_updates<< relative_path
1210
- update_count += 1
1211
- end
1212
-
1213
- # delete
1214
- deleted = update_deleted(result["deleted"])
1215
- deleted.each do |f|
1216
- relative_path = f.gsub(/^#{@dataset.local_path + "/"}/, "")
1217
- successful_updates<< relative_path
1218
- end
1219
- @dataset.update_idx_with_files_commits!((successful_deletions+successful_updates), commit_time)
1220
-
1221
- @dataset.update_idx_with_commit!(commit_sha1)
1222
- say "Compressing data", Thor::Shell::Color::BLUE
1223
-
1224
- home_dir = File.expand_path('~')
1225
- compression_path = get_compression_path
1226
- tar_path = "#{compression_path}#{@dataset.slug}_#{commit_sha1}.tar.gz"
1227
- tar_files_path = "#{home_dir}/.cnvrg/tmp/#{@dataset.slug}_#{commit_sha1}.txt"
1228
- tar_files = (result["added"] + result["updated_on_local"]).join("\n")
1229
- File.open(tar_files_path, 'w') { |f| f.write tar_files }
1230
- is_tar = create_tar(dataset_dir, tar_path, tar_files_path,no_compression)
1231
- if !is_tar
1232
- say "ERROR: Couldn't compress data", Thor::Shell::Color::RED
1233
- FileUtils.rm_rf([tar_path]) if File.exist? tar_path
1234
- FileUtils.rm_rf([tar_files_path]) if File.exist? tar_files_path
1235
- @files.rollback_commit(commit_sha1)
1236
- say "Rolling Back all changes.", Thor::Shell::Color::RED
1237
- exit(1)
1238
- end
1239
- say "Uploading data", Thor::Shell::Color::BLUE
1240
- res = false
1241
- res = @files.upload_tar_file(tar_path, tar_path, commit_sha1)
1242
-
1243
- if res
1244
- say "Commiting data", Thor::Shell::Color::BLUE
1245
-
1246
- cur_idx = @dataset.get_idx.to_h
1247
-
1248
- res = @files.end_commit_tar(commit_sha1, cur_idx)
1249
- if !Cnvrg::CLI.is_response_success(res, false)
1250
- FileUtils.rm_rf([tar_files_path]) if File.exist? tar_files_path
1251
- FileUtils.rm_rf([tar_path]) if File.exist? tar_path
1252
-
1253
-
1254
- @files.rollback_commit(commit_sha1)
1255
- say "Can't commit, Rolling Back all changes.", Thor::Shell::Color::RED
1256
- exit(1)
1257
- end
1258
-
1259
- else
1260
- FileUtils.rm_rf([tar_files_path]) if File.exist? tar_files_path
1261
- FileUtils.rm_rf([tar_path]) if File.exist? tar_path
1262
-
1263
-
1264
- @files.rollback_commit(commit_sha1)
1265
- say "Can't upload, Rolling Back all changes.", Thor::Shell::Color::RED
1266
- exit(1)
1267
- end
1268
-
1269
-
1270
- # delete
1271
- FileUtils.rm_rf([tar_path, tar_files_path])
1272
-
1273
- rescue SignalException
1274
- log_end(-1)
1275
- FileUtils.rm_rf([tar_files_path]) if File.exist? tar_files_path
1276
- FileUtils.rm_rf([tar_path]) if File.exist? tar_path
1277
-
1278
-
1279
- @files.rollback_commit(commit_sha1)
1280
- say "User aborted, Rolling Back all changes.", Thor::Shell::Color::RED
1281
- exit(0)
1282
- rescue => e
1283
- puts e.message
1284
- if !Cnvrg::Helpers.internet_connection?
1285
- say "Seems there is no internet connection", Thor::Shell::Color::RED
1286
-
1287
- end
1288
- FileUtils.rm_rf([tar_files_path]) if File.exist? tar_files_path
1289
- FileUtils.rm_rf([tar_path]) if File.exist? tar_path
1290
-
1291
- log_end(-1, e.message)
1292
- @files.rollback_commit(commit_sha1)
1293
- say "Exception while trying to upload, Rolling back", Thor::Shell::Color::RED
1294
- exit(0)
1295
- end
1296
- if verbose
1297
- say "#{check} Done", Thor::Shell::Color::BLUE
1298
- if successful_updates.size >0
1299
- say "Updated:", Thor::Shell::Color::GREEN
1300
- suc = successful_updates.map { |x| x=Helpers.checkmark() +" "+x }
1301
- say suc.join("\n"), Thor::Shell::Color::GREEN
1302
- end
1303
- if successful_deletions.size >0
1304
- say "Deleted:", Thor::Shell::Color::GREEN
1305
- del = successful_updates.map { |x| x=Helpers.checkmark() +" "+x }
1306
- say del.join("\n"), Thor::Shell::Color::GREEN
1307
- end
1308
-
1309
-
1310
- say "Total of #{update_count} / #{update_total} files.", Thor::Shell::Color::GREEN
1311
- else
1312
- say "#{check} Changes were updated successfully", Thor::Shell::Color::GREEN
1313
-
1314
- end
1315
-
1316
-
1317
- rescue => e
1318
- log_end(-1, e.message)
1319
-
1320
-
1321
- say "Error occurd, \nAborting", Thor::Shell::Color::RED
1322
- @files.rollback_commit(commit_sha1)
1323
- exit(1)
1324
- rescue SignalException
1325
- log_end(-1)
1326
-
1327
- say "\nAborting", Thor::Shell::Color::BLUE
1328
- say "\nRolling back all changes", Thor::Shell::Color::BLUE
1329
- @files.rollback_commit(commit_sha1)
1330
- exit(1)
1331
- end
1332
-
1333
- log_end(0)
1334
-
1335
- end
1336
-
1337
-
1338
- desc 'unlink', 'Unlink a project from current directory', :hide => true
1339
-
1340
- def create_volume
1341
- verify_logged_in(false)
1342
- log_start(__method__, args, options)
1343
- dataset_dir = is_cnvrg_dir(Dir.pwd)
1344
- @dataset = Dataset.new(dataset_dir)
1345
- @dataset.create_volume()
1346
-
1347
- end
1348
-
1349
- desc 'data list', 'List all dataset you currently have'
1350
-
1351
- def list_dataset
1352
- verify_logged_in(false)
1353
- log_start(__method__, args, options)
1354
- dataset_dir = is_cnvrg_dir(Dir.pwd)
1355
- @dataset = Dataset.new(dataset_dir)
1356
- owner = @dataset.owner
1357
- if owner.nil? or owner.empty?
1358
- owner = CLI.get_owner()
1359
- end
1360
- result = @dataset.list(owner)
1361
- list = result["result"]["list"]
1362
-
1363
- print_table(list)
1364
-
1365
- end
1366
-
1367
- desc 'data commits', 'List all commits for a specific dataset'
1368
-
1369
- def list_dataset_commits()
1370
- verify_logged_in(true)
1371
- log_start(__method__, args, options)
1372
-
1373
- dataset_dir = is_cnvrg_dir(Dir.pwd)
1374
- @dataset = Dataset.new(dataset_dir)
1375
- result = @dataset.list_commits()
1376
- list = result["result"]["list"]
1377
-
1378
- print_table(list)
1379
-
1380
- end
1381
-
1382
- desc 'commits', 'List all commits for a specific dataset'
1383
-
1384
- def list_commits()
1385
- verify_logged_in(true)
1386
- log_start(__method__, args, options)
1387
-
1388
- project_dir = is_cnvrg_dir(Dir.pwd)
1389
- @project = Project.new(project_dir)
1390
- result = @project.list_commits()
1391
- list = result["result"]["list"]
1392
-
1393
- print_table(list)
1394
-
1395
- end
1396
-
1397
-
1398
- desc 'unlink', 'Unlink a project from current directory'
1399
-
1400
- def unlink
1401
- verify_logged_in(false)
1402
- log_start(__method__, args, options)
1403
- working_dir = is_cnvrg_dir()
1404
- list_to_del = [working_dir+"/.cnvrgignore", working_dir+"/.cnvrg"]
1405
- FileUtils.rm_rf list_to_del
1406
- end
1407
-
1408
- desc 'clone', 'Clone project'
1409
- method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false
1410
- method_option :commit, :type => :string, :aliases => ["-c", "--c"], :default => nil
1411
-
1412
- def clone(project_url)
1413
- begin
1414
- verify_logged_in(false)
1415
- log_start(__method__, args, options)
1416
- url_parts = project_url.split("/")
1417
- project_index = Cnvrg::Helpers.look_for_in_path(project_url, "projects")
1418
- slug = url_parts[project_index+1]
1419
- owner = url_parts[project_index-1]
1420
- remote = options["remote"] || false
1421
- response = Cnvrg::API.request("users/#{owner}/projects/#{slug}/get_project", 'GET')
1422
- Cnvrg::CLI.is_response_success(response)
1423
- response = JSON.parse response["result"]
1424
- project_name = response["title"]
1425
- commit_to_clone = options["commit"] || nil
1426
-
1427
- say "Cloning #{project_name}", Thor::Shell::Color::BLUE
1428
- clone_resp = false
1429
- if remote
1430
- clone_resp = Project.clone_dir_remote(slug, owner, project_name)
1431
- project_home = Dir.pwd
1432
- else
1433
- if (Dir.exists? project_name)
1434
- say "Error: Conflict with dir #{project_name}", Thor::Shell::Color::RED
1435
- if no? "Sync to repository anyway? (current data might lost)", Thor::Shell::Color::YELLOW
1436
- say "Remove dir in order to clone #{project_name}", Thor::Shell::Color::RED
1437
- log_end(1, "conflict with dir #{project_name}")
1438
-
1439
- exit(1)
1440
- end
1441
-
1442
- end
1443
- clone_resp = Project.clone_dir(slug, owner, project_name)
1444
- project_home = Dir.pwd+"/"+project_name
1445
-
1446
-
1447
- end
1448
-
1449
- if clone_resp
1450
- @project = Project.new(project_home)
1451
- @files = Cnvrg::Files.new(@project.owner, slug)
1452
- response = @project.clone(remote, commit_to_clone)
1453
- Cnvrg::CLI.is_response_success response
1454
- working_dir = project_home
1455
- docker_image = response["result"]["image"]
1456
- current_commit = response["result"]["commit"]
1457
- idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
1458
- File.open(working_dir + "/.cnvrg/idx.yml", "w+") { |f| f.write idx.to_yaml }
1459
- if !docker_image.nil? and !docker_image.empty? and !remote
1460
- local_images = Docker::Image.all
1461
- docker_image_local = local_images.map { |x| x.info["RepoTags"] }.flatten.select { |y| y.eql? "#{docker_image}:latest" }.flatten
1462
- if docker_image_local.size == 0
1463
- if yes? "Image wasn't found locally, pull image from cnvrg repository?", Thor::Shell::Color::YELLOW
1464
- image = pull(docker_image)
1465
- if image
1466
- say "downloaded image: #{docker_image}"
1467
- @image = Images.new(working_dir, docker_image)
1468
- else
1469
- say "Could not create a new project with docker, image was not found", Thor::Shell::Color::RED
1470
- @project.revert(working_dir)
1471
- exit(1)
1472
- end
1473
- end
1474
-
1475
- elsif docker_image_local.size == 1
1476
- say "found image: #{docker_image_local[0]}, setting it up..", Thor::Shell::Color::BLUE
1477
- @image = Images.new(working_dir, docker_image_local[0])
1478
- elsif docker_image_local.size >1
1479
- say "found #{docker_image_local.size} images, choose the image name you want to use", Thor::Shell::Color::BLUE
1480
- image_name = ask "#{docker_image_local.join("\n")}\n", Thor::Shell::Color::BLUE
1481
- @image = Images.new(working_dir, image_name)
1482
- end
1483
-
1484
- end
1485
-
1486
- successful_changes = []
1487
- say "Downloading files", Thor::Shell::Color::BLUE
1488
- if !response["result"]["tree"].nil?
1489
- response["result"]["tree"].each do |f|
1490
- relative_path = f[0].gsub(/^#{@project.local_path}/, "")
1491
- if f[0].end_with? "/"
1492
- # dir
1493
- if @files.download_dir(f[0], relative_path, project_home)
1494
- successful_changes << relative_path
1495
- end
1496
- else
1497
- # blob
1498
-
1499
- if @files.download_file_s3(f[0], relative_path, project_home, commit_sha1=current_commit)
1500
- successful_changes << relative_path
1501
- end
1502
- end
1503
- end
1504
- end
1505
-
1506
- say "Done.\nDownloaded total of #{successful_changes.size} files", Thor::Shell::Color::GREEN
1507
- log_end(0)
1508
- else
1509
- log_end(1, "can't create directory")
1510
-
1511
- say "Error: Couldn't create directory: #{project_name}", Thor::Shell::Color::RED
1512
- exit(1)
1513
- end
1514
- rescue SignalException
1515
- log_end(-1)
1516
- say "\nAborting"
1517
- exit(1)
1518
- end
1519
-
1520
- end
1521
-
1522
-
1523
- desc 'status', 'Show the working tree status'
1524
- method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
1525
-
1526
-
1527
- def status
1528
- begin
1529
- verify_logged_in()
1530
- log_start(__method__, args, options)
1531
- @project = Project.new(get_project_home)
1532
- new_branch = options["new_branch"] || false
662
+ verify_logged_in()
663
+ log_start(__method__, args, options)
664
+ @project = Project.new(get_project_home)
665
+ new_branch = options["new_branch"] || false
1533
666
 
1534
667
  result = @project.compare_idx(new_branch)["result"]
1535
668
  commit = result["commit"]
1536
669
  result = result["tree"]
1537
670
  say "Comparing local changes with remote version:", Thor::Shell::Color::BLUE
1538
-
1539
671
  if result["added"].empty? and result["updated_on_local"].empty? and result["updated_on_server"].empty? and result["deleted"].empty? and result["conflicts"].empty?
1540
672
  say "Project is up to date", Thor::Shell::Color::GREEN
1541
673
  log_end(0)
@@ -1582,36 +714,14 @@ module Cnvrg
1582
714
  end
1583
715
  end
1584
716
 
1585
- desc '', '', :hide => true
1586
-
1587
- def revert_exp
1588
- begin
1589
- log_start(__method__, args, options)
1590
- @project = Project.new(get_project_home)
1591
-
1592
- result = @project.compare_idx(false)["result"]
1593
- result = result["tree"]
1594
- if result["added"].size > 0
1595
- FileUtils.rm_rf(result["added"])
1596
- end
1597
- say "Changes were removed successfully", Thor::Shell::Color::GREEN
1598
-
1599
-
1600
- rescue SignalException
1601
- log_end(-1)
1602
- say "\nAborting"
1603
- exit(1)
1604
- end
1605
- end
1606
-
1607
717
 
1608
718
  desc 'upload', 'Upload updated files'
1609
- method_option :ignore, :type => :string, :aliases => ["-i"], :desc => "ignore following files", :default => ""
1610
- method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1611
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1612
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
719
+ method_option :ignore, :type => :array, :aliases => ["-i", "--i"], :desc => "ignore following files"
720
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
721
+ method_option :verbose, :type => :boolean, :aliases => ["--v"], :default => false
722
+ method_option :sync, :type => :boolean, :aliases => ["--v"], :default => false
1613
723
 
1614
- def upload(link=false, sync=false, direct=false, ignore_list="")
724
+ def upload(link=false, sync=false)
1615
725
 
1616
726
  begin
1617
727
  verify_logged_in(true)
@@ -1620,30 +730,12 @@ module Cnvrg
1620
730
  @project = Project.new(get_project_home)
1621
731
 
1622
732
  @files = Cnvrg::Files.new(@project.owner, @project.slug)
1623
- ignore = options[:ignore] || ""
1624
-
1625
- if ignore.nil? or ignore.empty?
1626
- ignore = ignore_list
1627
- end
1628
- data_ignore = data_dir_include()
1629
- if !data_ignore.nil?
1630
- if ignore.nil? or ignore.empty?
1631
- ignore = data_ignore
1632
- else
1633
- ignore ="#{ignore},#{data_ignore}"
1634
- end
1635
- end
733
+ ignore = options[:ignore] || []
1636
734
  if !@project.update_ignore_list(ignore)
1637
735
  say "Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW
1638
736
  end
1639
737
  new_branch = options["new_branch"] || false
1640
738
 
1641
- if options["sync"] or sync
1642
- new_branch_exp = @project.get_new_branch
1643
- if new_branch_exp
1644
- new_branch = new_branch_exp
1645
- end
1646
- end
1647
739
  result = @project.compare_idx(new_branch)
1648
740
  commit = result["result"]["commit"]
1649
741
  if !link
@@ -1657,23 +749,9 @@ module Cnvrg
1657
749
  say "Comparing local changes with remote version:", Thor::Shell::Color::BLUE if options["verbose"]
1658
750
  end
1659
751
  result = result["result"]["tree"]
1660
- # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
1661
- # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
1662
- # if all.size == 1
1663
- # num = "conflict"
1664
- # else
1665
- # num = "conflicts"
1666
- # end
1667
- # say "Project contains #{all.size} #{num}:", Thor::Shell::Color::RED
1668
- # say "#{all.join("\n")}"
1669
- # say "Please fix #{num}, and retry", Thor::Shell::Color::RED
1670
- # exit(1)
1671
- #
1672
- # end
1673
- check = Helpers.checkmark()
1674
752
  if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
1675
753
  log_end(0)
1676
- say "#{check} Project is up to date", Thor::Shell::Color::GREEN unless ((options["sync"] or sync) and !direct)
754
+ say "Project is up to date", Thor::Shell::Color::GREEN unless options["sync"]
1677
755
  return true
1678
756
  end
1679
757
  update_count = 0
@@ -1687,7 +765,7 @@ module Cnvrg
1687
765
  say "Updating #{update_total} files", Thor::Shell::Color::BLUE
1688
766
  end
1689
767
  else
1690
- say "Syncing files", Thor::Shell::Color::BLUE unless (options["sync"] or sync)
768
+ say "Syncing files", Thor::Shell::Color::BLUE unless options["sync"]
1691
769
 
1692
770
  end
1693
771
 
@@ -1721,21 +799,21 @@ module Cnvrg
1721
799
  end
1722
800
 
1723
801
  # delete
1724
- deleted = update_deleted(result["deleted"])
1725
- deleted.each do |f|
802
+ result["deleted"].each do |f|
1726
803
  relative_path = f.gsub(/^#{@project.local_path + "/"}/, "")
1727
804
  if relative_path.end_with?("/")
1728
805
  if @files.delete_dir(f, relative_path, commit_sha1)
1729
- # update_count += 1
806
+ update_count += 1
1730
807
  successful_updates<< relative_path
1731
808
  end
1732
809
  else
1733
810
  if @files.delete_file(f, relative_path, commit_sha1)
1734
- # update_count += 1
811
+ update_count += 1
1735
812
  successful_updates<< relative_path
1736
813
  end
1737
814
  end
1738
815
  end
816
+ log_end(0)
1739
817
 
1740
818
  rescue SignalException
1741
819
  log_end(-1)
@@ -1743,14 +821,11 @@ module Cnvrg
1743
821
  say "User aborted, Rolling Back all changes.", Thor::Shell::Color::RED
1744
822
  exit(0)
1745
823
  rescue => e
1746
- log_end(-1, e.message)
824
+ log_end(1, e.message)
1747
825
  @files.rollback_commit(commit_sha1)
1748
826
  say "Exception while trying to upload, Rolling back", Thor::Shell::Color::RED
1749
827
  exit(0)
1750
828
  end
1751
- if !result["deleted"].nil? and !result["deleted"].empty?
1752
- update_count += result["deleted"].size
1753
- end
1754
829
  if update_count == update_total
1755
830
  res = @files.end_commit(commit_sha1)
1756
831
  if (Cnvrg::CLI.is_response_success(res, false))
@@ -1760,7 +835,7 @@ module Cnvrg
1760
835
 
1761
836
  @project.update_idx_with_commit!(commit_sha1)
1762
837
  rescue => e
1763
- log_end(-1, e.message)
838
+ log_end(1, e.message)
1764
839
  @files.rollback_commit(commit_sha1)
1765
840
  say "Couldn't commit updates, Rolling Back all changes.", Thor::Shell::Color::RED
1766
841
  exit(1)
@@ -1770,6 +845,7 @@ module Cnvrg
1770
845
  if image and image.is_docker
1771
846
  image.update_image_activity(commit_sha1, nil)
1772
847
  end
848
+ check = Helpers.checkmark()
1773
849
 
1774
850
  if options["verbose"]
1775
851
  say "#{check} Done", Thor::Shell::Color::BLUE
@@ -1785,13 +861,7 @@ module Cnvrg
1785
861
  end
1786
862
  say "Total of #{update_count} / #{update_total} files.", Thor::Shell::Color::GREEN
1787
863
  else
1788
- if (options["sync"] or sync) and direct
1789
- say "#{check} Syncing project completed successfully", Thor::Shell::Color::GREEN
1790
-
1791
- else
1792
- say "#{check} Changes were updated successfully", Thor::Shell::Color::GREEN
1793
-
1794
- end
864
+ say "#{check} Changes were updated successfully", Thor::Shell::Color::GREEN unless options["sync"]
1795
865
 
1796
866
  end
1797
867
 
@@ -1803,14 +873,13 @@ module Cnvrg
1803
873
  end
1804
874
  else
1805
875
  log_end(1, "error. Rolling Back all changes")
1806
- say "Error occurd, \nRolling back", Thor::Shell::Color::RED
1807
876
 
1808
877
  @files.rollback_commit(commit_sha1)
1809
878
  end
1810
- rescue => e
879
+ rescue
1811
880
  log_end(-1)
1812
881
 
1813
- say "Error occurd, \nAborting", Thor::Shell::Color::RED
882
+ say "Error occurd, \nAborting", Thor::Shell::Color::BLUE
1814
883
  @files.rollback_commit(commit_sha1)
1815
884
  exit(1)
1816
885
  rescue SignalException
@@ -1825,57 +894,27 @@ module Cnvrg
1825
894
  end
1826
895
 
1827
896
  desc 'download', 'Download updated files'
1828
- method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
1829
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
1830
- method_option :sync, :type => :boolean, :aliases => ["-s"], :default => false
1831
- method_option :ignore, :type => :string, :aliases => ["-i"], :desc => "ignore following files", :default => ""
897
+ method_option :new_branch, :type => :boolean, :aliases => ["-nb", "--nb"], :desc => "create new branch of commits"
898
+ method_option :verbose, :type => :boolean, :aliases => ["--v"], :default => false
899
+ method_option :sync, :type => :boolean, :aliases => ["--v"], :default => false
1832
900
 
1833
- def download(sync=false, ignore_list="")
901
+ def download
1834
902
  begin
1835
903
  verify_logged_in(true)
1836
904
  log_start(__method__, args, options)
1837
905
  project_home = get_project_home
1838
- @project = Project.new(project_home)
1839
- @files = Cnvrg::Files.new(@project.owner, @project.slug)
1840
- ignore = options[:ignore] || ""
1841
- if ignore.nil? or ignore.empty?
1842
- ignore = ignore_list
1843
- end
1844
- data_ignore = data_dir_include()
1845
- if !data_ignore.nil?
1846
- if ignore.nil? or ignore.empty?
1847
- ignore = data_ignore
1848
- else
1849
- ignore ="#{ignore},#{data_ignore}"
1850
- end
1851
- end
1852
- if !@project.update_ignore_list(ignore)
1853
- say "Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW
1854
- end
906
+ @project = Project.new(project_home)
907
+ @files = Cnvrg::Files.new(@project.owner, @project.slug)
1855
908
  new_branch = options["new_branch"] || false
1856
909
 
1857
910
  res = @project.compare_idx(new_branch)["result"]
1858
-
1859
911
  result = res["tree"]
1860
-
1861
912
  commit = res["commit"]
1862
- if result["updated_on_server"].empty? and result["conflicts"].empty? and result["deleted"].empty?
1863
- say "Project is up to date", Thor::Shell::Color::GREEN unless (options["sync"] or sync)
913
+ if result["updated_on_server"].empty? and result["conflicts"] and result["deleted"].empty?
914
+ say "Project is up to date", Thor::Shell::Color::GREEN unless options["sync"]
1864
915
  log_end(0)
1865
916
  return true
1866
917
  end
1867
- # if result["added"].any? {|x| x.include? ".conflict"} or !result["conflicts"].empty?
1868
- # all = result["added"].select {|x| x.include? ".conflict"} +result["conflicts"].flatten
1869
- # if all.size == 1
1870
- # num = "1 conflict"
1871
- # else
1872
- # num = "#{result["conflicts"].size} conflicts"
1873
- # end
1874
- # say "Project contains #{num}:", Thor::Shell::Color::RED
1875
- # say "#{all.join("\n")}"
1876
- # say "Please fix them, and retry", Thor::Shell::Color::RED
1877
- # exit(1)
1878
- # end
1879
918
  update_count = 0
1880
919
  update_total = result["updated_on_server"].size + result["conflicts"].size
1881
920
 
@@ -1897,7 +936,7 @@ module Cnvrg
1897
936
 
1898
937
  result["conflicts"].each do |f|
1899
938
  relative_path = f.gsub(/^#{@project.local_path}/, "")
1900
- if @files.download_file_s3(f, relative_path, project_home, commit_sha1=nil, conflict=true)
939
+ if @files.download_file_s3(f, relative_path, project_home, conflict=true)
1901
940
  successful_changes << relative_path
1902
941
  end
1903
942
 
@@ -1928,35 +967,12 @@ module Cnvrg
1928
967
  say successful_changes.join("\n"), Thor::Shell::Color::GREEN
1929
968
  say "Total of #{successful_changes.size} / #{update_total} files.", Thor::Shell::Color::GREEN
1930
969
  else
1931
- say "#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN unless (sync or options["sync"])
970
+ say "#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN
1932
971
  end
1933
972
 
1934
973
 
1935
974
  log_end(0)
1936
975
  end
1937
- rescue => e
1938
- log_end(-1)
1939
-
1940
- say "Error occurd, \nAborting", Thor::Shell::Color::BLUE
1941
- if successful_changes.nil?
1942
- exit(1)
1943
- end
1944
- successful_changes.each do |f|
1945
-
1946
- abs_path = "#{@project.local_path}/#{f}"
1947
- filename = File.basename abs_path
1948
- say "revoking #{filename}"
1949
- if result["conflicts"].include? f
1950
- @files.revoke_download_file(abs_path, f, filename, true)
1951
- elsif result["updated_on_server"].include? f
1952
- if File.directory? abs_path
1953
- @files.revoke_download_dir(abs_path, f, project_home)
1954
- else
1955
- @files.revoke_download_file(project_home, abs_path, filename)
1956
- end
1957
- end
1958
- end
1959
- exit(1)
1960
976
  rescue SignalException
1961
977
  log_end(-1)
1962
978
  say "\nAborting", Thor::Shell::Color::BLUE
@@ -2010,7 +1026,6 @@ module Cnvrg
2010
1026
  if !response["result"]["tree"].nil?
2011
1027
  idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
2012
1028
  File.open(project_home + "/.cnvrg/idx.yml", "w+") { |f| f.write idx.to_yaml }
2013
- current_tree = Dir.entries(".").reject { |file| file.start_with? '.' or file.eql? "__init__.py" or file.eql? "uwsgi.ini" }
2014
1029
 
2015
1030
  response["result"]["tree"].each do |f|
2016
1031
  relative_path = f[0].gsub(/^#{@project.local_path}/, "")
@@ -2022,7 +1037,7 @@ module Cnvrg
2022
1037
  end
2023
1038
  else
2024
1039
  # blob
2025
- if @files.download_file_s3(f[0], relative_path, project_home, commit_sha1=commit_sha1)
1040
+ if @files.download_file_s3(f[0], relative_path, project_home)
2026
1041
  current_tree.delete(relative_path)
2027
1042
 
2028
1043
  successful_changes << relative_path
@@ -2040,100 +1055,43 @@ module Cnvrg
2040
1055
  end
2041
1056
 
2042
1057
 
2043
- desc 'data_jump', 'jump to specific commit', :hide => true
2044
-
2045
- def data_jump(*commit_sha1)
2046
- begin
2047
- verify_logged_in()
2048
- log_start(__method__, args, options)
2049
- dataset_dir = is_cnvrg_dir(Dir.pwd)
2050
- @dataset = Dataset.new(dataset_dir)
2051
-
2052
- @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
2053
- if commit_sha1.nil? or commit_sha1.empty?
2054
- commit_sha1 = @dataset.last_local_commit
2055
- end
2056
- response = @dataset.compare_commits(commit_sha1)
2057
- successful_changes = []
2058
- if !response["result"]["status"].nil?
2059
- idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
2060
- File.open(dataset_dir + "/.cnvrg/idx.yml", "w+") { |f| f.write idx.to_yaml }
2061
- status = response["result"]["status"]
2062
- (status["delete"]).each do |f|
2063
- relative_path = f[0].gsub(/^#{@dataset.local_path}/, "")
2064
- FileUtils.rm_rf(relative_path)
2065
- end
2066
- # current_tree = Dir.entries(".").reject { |file| file.start_with? '.' }
2067
- (status["dirs"]).each do |f|
2068
- relative_path = f[0].gsub(/^#{@dataset.local_path}/, "")
2069
- # dir
2070
- if @files.download_dir(dataset_dir, relative_path)
2071
- # current_tree.delete(relative_path[0, relative_path.size-1])
2072
- successful_changes << relative_path
2073
- end
2074
- end
2075
- (status["download"]).each do |f|
2076
- relative_path = f["name"].gsub(/^#{@dataset.local_path}/, "")
2077
- # dir
2078
- if @files.download_file_s3(f["name"], relative_path, dataset_dir, f["sha1"])
2079
- successful_changes << relative_path
2080
- end
2081
- end
2082
-
2083
-
2084
- say "Done. Jumped completed successfully", Thor::Shell::Color::GREEN
2085
- log_end(0)
2086
- end
2087
-
2088
- rescue SignalException
2089
- log_end(-1)
2090
- exi(1)
2091
- end
2092
- end
2093
-
2094
1058
  desc 'sync', 'Sync with remote server'
2095
- method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
2096
- method_option :verbose, :type => :boolean, :aliases => ["-v"], :default => false
2097
- method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :default => ""
1059
+ method_option :new_branch, :type => :boolean, :aliases => ["--nb"], :desc => "create new branch of commits"
1060
+ method_option :verbose, :type => :boolean, :aliases => ["--v"], :default => false
2098
1061
 
2099
- def sync(direct=true)
2100
- verify_logged_in(true) if direct
1062
+ def sync
2101
1063
  if options["verbose"]
2102
- say 'Checking for new updates from remote version', Thor::Shell::Color::BLUE
1064
+ say 'Checking for new updates from remote version', Thor::Shell::Color::BLUE
2103
1065
  else
2104
1066
  say 'Syncing project', Thor::Shell::Color::BLUE
2105
1067
  end
2106
1068
 
2107
1069
 
2108
- invoke :download, [], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true
2109
- invoke :upload, [link=false, sync=true, direct=direct], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync => true,
2110
- :ignore => options[:ignore]
1070
+ invoke :download, [], :new_branch => options["new_branch"], :verbose => options["verbose"], :sync=>true
1071
+ invoke :upload, [], :new_branch => options["new_branch"], :verbose => options["verbose"],:sync=>true
1072
+ check = Helpers.checkmark()
2111
1073
 
1074
+ say "#{check} Syncing project completed successfully", Thor::Shell::Color::GREEN
2112
1075
 
2113
1076
  end
2114
1077
 
2115
1078
 
2116
1079
  desc 'run cmd', 'Runs an experiment'
2117
- method_option :local, :type => :boolean, :aliases => ["-l", "--local"], :default => false
2118
- method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
2119
- method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
2120
- method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
1080
+ method_option :local, :type => :boolean, :aliases => ["--l"], :default => false
1081
+ method_option :small, :type => :boolean, :aliases => ["--sm"], :default => false
1082
+ method_option :medium, :type => :boolean, :aliases => ["--med"], :default => false
1083
+ method_option :large, :type => :boolean, :aliases => ["--lg"], :default => false
2121
1084
  method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
2122
- method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
2123
- method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
2124
- method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sync_before"], :default => true
2125
- method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sync_after"], :default => true
2126
- method_option :title, :type => :string, :aliases => ["-t", "--title"], :default => ""
1085
+ method_option :gpuxl, :type => :boolean, :aliases => ["--gxl"], :default => false
1086
+ method_option :sync_before, :type => :boolean, :aliases => ["--sb"], :default => true
1087
+ method_option :sync_after, :type => :boolean, :aliases => ["--sa"], :default => true
1088
+ method_option :title, :type => :string, :aliases => ["--t"], :default => ""
2127
1089
  method_option :log, :type => :boolean, :aliases => ["--log"], :default => false
2128
- method_option :email_notification, :type => :boolean, :aliases => ["-en", "--email_notification"], :default => false
2129
- method_option :upload_output, :type => :string, :aliases => ["-uo", "--upload_output"], :default => ""
2130
- method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :default => ""
2131
- method_option :schedule, :type => :string, :aliases => ["-s", "--schedule"], :default => ""
2132
- method_option :image, :type => :string, :aliases => ["-i", "--image"], :default => ""
2133
- method_option :grid, :type => :string, :aliases => ["-g", "--grid"], :default => ""
2134
- method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
2135
- method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
2136
- method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :desc => "ignore following files", :default => ""
1090
+ method_option :email_notification, :type => :boolean, :aliases => ["--en"], :default => false
1091
+ method_option :upload_output, :type => :string, :aliases => ["--uo"], :default => ""
1092
+ method_option :commit, :type => :string, :aliases => ["--c"], :default => ""
1093
+ method_option :schedule, :type => :string, :aliases => ["--s"], :default => ""
1094
+ method_option :image, :type => :string, :aliases => ["--i"], :default => ""
2137
1095
 
2138
1096
  def run(*cmd)
2139
1097
  sync_before = options["sync_before"]
@@ -2146,73 +1104,38 @@ module Cnvrg
2146
1104
  local = options["local"]
2147
1105
  schedule = options["schedule"]
2148
1106
  image = options["image"]
2149
- grid = options["grid"]
2150
- data = options["data"]
2151
- data_commit = options["data_commit"]
2152
- ignore = options["ignore"]
2153
- options_hash = Hash[options]
2154
- real_options = []
2155
- options_hash.each do |o|
2156
- real_options << o if (!o[1].eql? "" and !["small", "medium", "large", "gpu", "gpuxl", "gpuxxl"].include? o[0])
2157
- end
2158
1107
  if local
2159
1108
  invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
2160
- :log => log, :email_notification => email_notification, :upload_output => upload_output,
2161
- :commit => commit, :image => image, :data => data, :data_commit => data_commit, :ignore => ignore
1109
+ :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit, :image => image
2162
1110
  return
2163
1111
  else
2164
- real_options.delete(["local", false])
2165
- instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"],
2166
- "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
1112
+ instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"], "gpu" => options["gpu"], "gpuxl" => options["gpuxl"]}
2167
1113
  instance_type = get_instance_type(instances)
2168
- if !instance_type.nil? and !instance_type.empty?
2169
- real_options << ["machine_type", instance_type]
2170
- end
2171
- exec_options = real_options.map { |x| "--#{x[0]}=#{x[1]}" }.flatten.join(" ")
2172
- cmd_to_exec = "#{exec_options} #{cmd.join(" ")}"
2173
1114
  invoke :exec_remote, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title, :machine_type => instance_type,
2174
- :schedule => schedule, :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit,
2175
- :image => image, :grid => grid, :data => data, :data_commit => data_commit, :ignore => ignore
1115
+ :schedule => schedule, :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit, :image =>image
2176
1116
  return
2177
1117
  end
2178
-
2179
- # if local
2180
- #
2181
- # else
2182
-
2183
-
2184
- # invoke :exec_remote, [cmd_to_exec.split(" ")], :sync_before => sync_before, :sync_after => sync_after, :title => title, :machine_type => instance_type,
2185
- # :schedule => schedule, :log => log, :email_notification => email_notification, :upload_output => upload_output, :commit => commit,
2186
- # :image => image, :grid => grid, :data => data, :data_commit => data_commit, :ignore => ignore
2187
- # return
2188
- # end
2189
1118
  end
2190
1119
 
2191
1120
 
2192
- desc '', '', :hide => true
2193
- method_option :sync_before, :type => :boolean, :aliases => ["-sb,--sync_before"], :default => true
2194
- method_option :sync_after, :type => :boolean, :aliases => ["-sa,--sync_after"], :default => true
2195
- method_option :title, :type => :string, :aliases => ["-t", "--title"], :default => ""
2196
- method_option :log, :type => :boolean, :aliases => ["--log"], :default => false
2197
- method_option :email_notification, :type => :boolean, :aliases => ["-en,--email_notification"], :default => false
2198
- method_option :upload_output, :type => :string, :aliases => ["-uo,--upload_output"], :default => ""
2199
- method_option :commit, :type => :string, :aliases => ["-c", "--commit"], :default => ""
2200
- method_option :image, :type => :string, :aliases => ["-i", "--image"], :default => ""
2201
- method_option :indocker, :type => :boolean, :aliases => ["--indocker"], :default => false
2202
- method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
2203
- method_option :data_commit, :type => :string, :aliases => ["-dc", "--data_commit"], :default => ""
2204
- method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :desc => "ignore following files", :default => ""
2205
- method_option :remote, :type => :boolean, :aliases => ["--remote"], :default => false
2206
- method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
2207
- def exec(*cmd)
1121
+ desc '', ''
1122
+ method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sb"], :default => true
1123
+ method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sa"], :default => true
1124
+ method_option :title, :type => :string, :aliases => ["-t", "--t"], :default => ""
1125
+ method_option :log, :type => :boolean, :aliases => ["-l", "--l"], :default => false
1126
+ method_option :email_notification, :type => :boolean, :aliases => ["-en", "--en"], :default => false
1127
+ method_option :upload_output, :type => :string, :aliases => ["--uo", "-uo"], :default => ""
1128
+ method_option :commit, :type => :string, :aliases => ["--c", "-c"], :default => ""
1129
+ method_option :image, :type => :string, :aliases => ["--i"], :default => ""
1130
+ method_option :indocker, :type => :boolean, :default => false
2208
1131
 
1132
+ def exec(*cmd)
2209
1133
  log = []
2210
1134
  cpu_average =0
2211
1135
  memory_average = 0
2212
1136
  verify_logged_in(true)
2213
1137
  log_start(__method__, args, options)
2214
- working_dir = is_cnvrg_dir
2215
- script_path = get_cmd_path_in_dir(working_dir, Dir.pwd)
1138
+ working_dir = Dir.pwd
2216
1139
 
2217
1140
 
2218
1141
  sync_before = options["sync_before"]
@@ -2220,14 +1143,11 @@ module Cnvrg
2220
1143
  print_log = options["log"]
2221
1144
  title = options["title"]
2222
1145
  commit = options["commit"] || nil
2223
- image = options["image"] || nil
2224
- indocker = options["indocker"] || false
2225
- ignore = options[:ignore] || ""
2226
-
1146
+ image = options["image"] || nil
1147
+ indocker = options["indocker"] || false
2227
1148
 
2228
1149
  email_notification = options["email_notification"]
2229
1150
  upload_output = options["upload_output"]
2230
- upload_output = "1m" if upload_output.nil? or upload_output.empty?
2231
1151
  time_to_upload = calc_output_time(upload_output)
2232
1152
  project_home = get_project_home
2233
1153
  @project = Project.new(project_home)
@@ -2239,8 +1159,7 @@ module Cnvrg
2239
1159
  else
2240
1160
  if sync_before
2241
1161
  # Sync before run
2242
-
2243
- invoke :sync, [false], :new_branch => is_new_branch, :ignore => ignore
1162
+ invoke :sync, [], :new_branch => is_new_branch
2244
1163
  end
2245
1164
  end
2246
1165
  #set image for the project
@@ -2248,46 +1167,40 @@ module Cnvrg
2248
1167
  invoke :set_image, [image]
2249
1168
  end
2250
1169
  if !indocker
2251
- image_proj = is_project_with_docker(working_dir)
1170
+ image_proj = is_project_with_docker(working_dir)
2252
1171
 
2253
1172
 
2254
- if image_proj and image_proj.is_docker
2255
- container= image_proj.get_container
2256
- if !container
2257
- say "Couldn't create container with image #{image_proj.image_name}:#{image_proj.image_tag}", Thor::Shell::Color::RED
2258
- exit(1)
2259
- end
1173
+ if image_proj and image_proj.is_docker
1174
+ container= image_proj.get_container
1175
+ if !container
1176
+ say "Couldn't create container with image #{image_proj.image_name}:#{image_proj.image_tag}", Thor::Shell::Color::RED
1177
+ exit(1)
1178
+ end
2260
1179
 
2261
1180
 
2262
- exec_args = args.flatten.join(" ")
2263
- options_hash = Hash[options]
2264
- options_hash.except!("image", "indocker")
2265
- exec_options = options_hash.map { |x| "--#{x[0]}=#{x[1]}" }.flatten.join(" ")
2266
- command_to_run = copy_args.join(" ")
2267
- command = ["/bin/bash", "-lc", "cnvrg exec --indocker #{exec_options} #{command_to_run} #{exec_args}"]
2268
- puts container.exec(command, tty: true)
2269
- container.stop()
2270
- exit(0)
2271
- end
1181
+ exec_args = args.flatten.join(" ")
1182
+ options_hash = Hash[options]
1183
+ options_hash.except!("image", "indocker")
1184
+ exec_options = options_hash.map { |x| "--#{x[0]}=#{x[1]}" }.flatten.join(" ")
1185
+ command_to_run = cmd.join(" ")
1186
+ command = ["/bin/bash", "-lc", "cnvrg exec --indocker #{exec_options} #{command_to_run} #{exec_args}"]
1187
+ puts container.exec(command, tty: true)
1188
+ container.stop()
1189
+ exit(0)
2272
1190
  end
2273
- remote = options["remote"]
2274
- if remote
2275
- docker_id = `cat /etc/hostname`
2276
- docker_id = docker_id.strip()
2277
1191
  end
2278
- is_on_gpu = options["gpu"]
2279
1192
  start_commit = @project.last_local_commit
2280
1193
  cmd = cmd.join("\s")
2281
1194
 
1195
+ say "Running: #{cmd}\n", Thor::Shell::Color::BLUE
1196
+
2282
1197
  @exp = Experiment.new(@project.owner, @project.slug)
2283
1198
 
2284
1199
  platform = RUBY_PLATFORM
2285
1200
  machine_name = Socket.gethostname
2286
1201
  begin
2287
- machine_activity = @exp.get_machine_activity(working_dir)
2288
- @exp.start(cmd, platform, machine_name, start_commit, title, email_notification, machine_activity, script_path)
2289
- say "Experiment's live results: #{Cnvrg::Helpers.remote_url}/#{@project.owner}/projects/#{@project.slug}/experiments/#{@exp.slug}", Thor::Shell::Color::GREEN
2290
- say "Running: #{cmd}\n", Thor::Shell::Color::BLUE
1202
+ machine_activity = @exp.get_machine_activity(Dir.pwd)
1203
+ @exp.start(cmd, platform, machine_name, start_commit, title, email_notification, machine_activity)
2291
1204
  unless @exp.slug.nil?
2292
1205
  real = Time.now
2293
1206
  exp_success = true
@@ -2299,34 +1212,19 @@ module Cnvrg
2299
1212
  begin
2300
1213
  stdout.each do |line|
2301
1214
  cur_time = Time.now
2302
- if remote
2303
- stats = usage_metrics_in_docker(docker_id)
2304
- cpu = stats[0]
2305
- memory = stats[1]
2306
- else
2307
- memory = memory_usage()
2308
- cpu = cpu_usage()
2309
- end
2310
-
1215
+ monitor = %x{ps aux|awk '{print $2,$3,$4}'|grep #{pid} }
1216
+ monitor_by = monitor.split(" ")
1217
+ memory = monitor_by[2]
1218
+ cpu = monitor_by[1]
2311
1219
  memory_total << memory.to_f
2312
1220
  cpu_total << cpu.to_f
2313
1221
  real_time= Time.now-real
2314
1222
 
2315
- cur_log = { time: cur_time,
1223
+ cur_log = {time: cur_time,
2316
1224
  message: line,
2317
1225
  type: "stdout",
2318
- real: real_time,
2319
- cpu: cpu,
2320
- memory: memory
2321
- }
2322
- if is_on_gpu
2323
- gpu_stats = gpu_util
2324
- gpu_utilization = gpu_stats[0]
2325
- gpu_memory_util = gpu_stats[1]
2326
- cur_log.merge!(gpu_util:gpu_utilization,gpu_memory_util:gpu_memory_util)
2327
- end
2328
-
2329
- if print_log
1226
+ real: real_time}
1227
+ if print_log
2330
1228
  puts cur_log
2331
1229
  end
2332
1230
  log << cur_log
@@ -2335,8 +1233,8 @@ module Cnvrg
2335
1233
  if time_to_upload !=0
2336
1234
  if time_to_upload <= Time.now - start_loop
2337
1235
  #upload current log
2338
- # cpu_average = cpu_total.inject(0) { |sum, el| sum + el }.to_f / cpu_total.size
2339
- # memory_average = memory_total.inject(0) { |sum, el| sum + el }.to_f / memory_total.size
1236
+ cpu_average = cpu_total.inject(0) { |sum, el| sum + el }.to_f / cpu_total.size
1237
+ memory_average = memory_total.inject(0) { |sum, el| sum + el }.to_f / memory_total.size
2340
1238
 
2341
1239
  @exp.upload_temp_log(log, cpu_average, memory_average)
2342
1240
  log = []
@@ -2360,7 +1258,8 @@ module Cnvrg
2360
1258
  end
2361
1259
 
2362
1260
  rescue Errno::EIO => e
2363
- # break
1261
+ puts e
1262
+ # break
2364
1263
  rescue Errno::ENOENT
2365
1264
  log_end(1, "command #{cmd} isn't valid")
2366
1265
 
@@ -2372,11 +1271,8 @@ module Cnvrg
2372
1271
  exp_success = false
2373
1272
  say "The process exited!", Thor::Shell::Color::RED
2374
1273
  rescue => e
2375
- log_end(-1, e.message)
2376
- res = @exp.end(log, 1, start_commit, cpu_average, memory_average)
2377
-
2378
- say "Error occurred,aborting", Thor::Shell::Color::RED
2379
- exit(0)
1274
+ puts e
1275
+ log_end(1, e.message)
2380
1276
  end
2381
1277
  ::Process.wait pid
2382
1278
  cpu_average = cpu_total.inject(0) { |sum, el| sum + el }.to_f / cpu_total.size
@@ -2387,7 +1283,7 @@ module Cnvrg
2387
1283
  end
2388
1284
  if !exp_success
2389
1285
  if !Cnvrg::Helpers.internet_connection?
2390
- wait_offline = agree "Seems like you're offline, wait until you're back online?", Thor::Shell::Color::YELLOW
1286
+ wait_offline = agree "Seems like you're offline, wait until your'e back online?", Thor::Shell::Color::YELLOW
2391
1287
  if wait_offline
2392
1288
  say "Waiting until your'e online..", Thor::Shell::Color::BLUE
2393
1289
  while !Cnvrg::Helpers.internet_connection?
@@ -2410,21 +1306,23 @@ module Cnvrg
2410
1306
  end
2411
1307
  if sync_after
2412
1308
  # Sync after run
1309
+ if !commit.nil?
1310
+ invoke :sync, [], :new_branch => true
2413
1311
 
2414
-
2415
- download(sync=true, ignore_list=ignore)
2416
- upload(link=false, sync=true, direct=false, ignore_list=ignore)
2417
-
1312
+ else
1313
+ invoke :sync, [], :new_branch => true
1314
+ end
2418
1315
  end
2419
1316
  end_commit = @project.last_local_commit
2420
1317
 
2421
1318
  res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
2422
1319
  check = Helpers.checkmark()
2423
- say "#{check} Done. Experiment's results were updated!", Thor::Shell::Color::GREEN
1320
+ say "#{check} Done. Experiment's result: #{Cnvrg::Helpers.remote_url}/#{@project.owner}/projects/#{@project.slug}/experiments/#{@exp.slug}", Thor::Shell::Color::GREEN
2424
1321
  log_end(0)
2425
1322
  end
2426
1323
  rescue => e
2427
- log_end(-1, e.message)
1324
+ puts e
1325
+ log_end(1, e.message)
2428
1326
  if container
2429
1327
  container.stop()
2430
1328
  end
@@ -2451,7 +1349,7 @@ module Cnvrg
2451
1349
  end
2452
1350
  end
2453
1351
 
2454
- desc '', '', :hide => true
1352
+ desc '', ''
2455
1353
  method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sb"], :default => true
2456
1354
  method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sa"], :default => true
2457
1355
  method_option :title, :type => :string, :aliases => ["-t", "--t"], :default => ""
@@ -2490,7 +1388,7 @@ module Cnvrg
2490
1388
  machine_name = Socket.gethostname
2491
1389
  begin
2492
1390
 
2493
- @exp.start(cmd, platform, machine_name, start_commit, title, email_notification, machine_activity, Dir.pwd)
1391
+ @exp.start(cmd, platform, machine_name, start_commit, title, email_notification, machine_activity)
2494
1392
  unless @exp.slug.nil?
2495
1393
  real = Time.now
2496
1394
  exp_success = true
@@ -2560,9 +1458,7 @@ module Cnvrg
2560
1458
  exp_success = false
2561
1459
  say "The process exited!", Thor::Shell::Color::RED
2562
1460
  rescue => e
2563
- log_end(-1, e.message)
2564
- say "Error occurred, aborting", Thor::Shell::Color::RED
2565
- exit(0)
1461
+ log_end(1, e.message)
2566
1462
  end
2567
1463
  ::Process.wait pid
2568
1464
  cpu_average = cpu_total.inject(0) { |sum, el| sum + el }.to_f / cpu_total.size
@@ -2612,7 +1508,7 @@ module Cnvrg
2612
1508
  log_end(0)
2613
1509
  end
2614
1510
  rescue => e
2615
- log_end(-1, e.message)
1511
+ log_end(1, e.message)
2616
1512
  say "Couldn't run #{cmd}, check your input parameters", Thor::Shell::Color::RED
2617
1513
  exit(1)
2618
1514
  end
@@ -2636,33 +1532,23 @@ module Cnvrg
2636
1532
  end
2637
1533
  end
2638
1534
 
2639
- desc '', '', :hide => true
2640
- method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sync_before"], :default => true
2641
- method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sync_after"], :default => true
2642
- method_option :title, :type => :string, :aliases => ["-t", "--title"], :default => ""
2643
- method_option :log, :type => :boolean, :aliases => ["--log"], :default => false
2644
- method_option :email_notification, :type => :boolean, :aliases => ["-en", "--email_notification"], :default => false
2645
- method_option :upload_output, :type => :string, :aliases => ["-uo", "--upload_output"], :default => ""
2646
- method_option :machine_type, :type => :string, :default => ""
2647
- method_option :schedule, :type => :string, :aliases => ["-s", "--schedule"], :default => ""
2648
- method_option :commit, :type => :string, :aliases => ["-c, --commit"], :default => nil
2649
- method_option :image, :type => :string, :aliases => ["-i", "--image"], :default => ""
2650
- method_option :grid, :type => :string, :aliases => ["-g", "--grid"], :default => ""
2651
- method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
2652
- method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
2653
- method_option :ignore, :type => :string, :aliases => ["-i", "--ignore"], :desc => "ignore following files", :default => ""
1535
+ desc '', ''
1536
+ method_option :sync_before, :type => :boolean, :aliases => ["-sb", "--sb"], :default => true
1537
+ method_option :sync_after, :type => :boolean, :aliases => ["-sa", "--sa"], :default => true
1538
+ method_option :title, :type => :string, :aliases => ["-t", "--t"], :default => ""
1539
+ method_option :log, :type => :boolean, :aliases => ["-l", "--l"], :default => false
1540
+ method_option :email_notification, :type => :boolean, :aliases => ["-en", "--en"], :default => false
1541
+ method_option :upload_output, :type => :string, :aliases => ["--uo", "-uo"], :default => ""
1542
+ method_option :machine_type, :type => :string, :aliases => ["--i", "-i"], :default => ""
1543
+ method_option :schedule, :type => :string, :aliases => ["--s", "-s"], :default => ""
1544
+ method_option :commit, :type => :string, :aliases => ["--c", "-c"], :default => nil
1545
+ method_option :image, :type => :string, :aliases => ["--i"], :default => ""
2654
1546
 
2655
1547
  def exec_remote(*cmd)
2656
1548
  verify_logged_in(true)
2657
1549
  log_start(__method__, args, options)
2658
1550
  working_dir = is_cnvrg_dir
2659
- path_to_cmd = get_cmd_path_in_dir(working_dir, Dir.pwd)
2660
-
2661
1551
  begin
2662
- grid = options["grid"] || nil
2663
- data = options["data"] || nil
2664
- data_commit = options["data_commit"] || nil
2665
- sync_before = options["sync_before"]
2666
1552
 
2667
1553
  instance_type = options["machine_type"] || nil
2668
1554
  schedule = options["schedule"] || ""
@@ -2684,22 +1570,10 @@ module Cnvrg
2684
1570
  new_time = new_time[0, new_time.size-6] #remove timezone
2685
1571
  schedule = "at #{new_time}"
2686
1572
  end
2687
- upload_output = options["upload_output"]
2688
- time_to_upload = calc_output_time(upload_output)
2689
- if time_to_upload==0 or time_to_upload==-1
2690
- upload_output_option = "--upload_output=1m"
2691
- else
2692
- upload_output_option = "--upload_output=#{upload_output}"
2693
- end
2694
- remote = "--remote=true"
2695
- if !instance_type.nil? and instance_type.include? "gpu"
2696
- remote= "#{remote} --gpu=true"
2697
- end
2698
-
2699
1573
  options_hash = Hash[options]
2700
- options_hash.except!("schedule", "machine_type", "image", "upload_output", "grid", "data", "data_commit", "local", "small", "medium", "large", "gpu", "gpuxl", "gpuxxl")
1574
+ options_hash.except!("schedule", "machine_type", "image")
2701
1575
  exec_options = options_hash.map { |x| "--#{x[0]}=#{x[1]}" }.flatten.join(" ")
2702
- command = "#{exec_options} #{remote} #{upload_output_option} #{cmd.flatten.join(" ")}"
1576
+ command = "#{exec_options} --uo=1m #{cmd.flatten.join(" ")}"
2703
1577
  commit_to_run = options["commit"] || nil
2704
1578
  if !schedule.nil? and !schedule.empty?
2705
1579
 
@@ -2710,20 +1584,19 @@ module Cnvrg
2710
1584
  choose_image = options["image"]
2711
1585
 
2712
1586
  if !choose_image.nil? and !choose_image.empty?
2713
- invoke :set_image, [choose_image]
1587
+ invoke :set_image,[choose_image]
2714
1588
  end
2715
1589
  image = is_project_with_docker(working_dir)
2716
1590
  if !image or !image.is_docker
2717
1591
  # say "Couldn't find image related to project", Thor::Shell::Color::RED
2718
-
2719
- image_slug = "cnvrg"
1592
+ default_image_name = "cnvrg"
2720
1593
  if instance_type.eql? "gpu" or instance_type.eql? "gpuxl"
2721
- image_slug = "cnvrg_gpu"
1594
+ default_image_name = "cnvrg-gpu"
2722
1595
  end
2723
1596
  # default = yes? "use #{default_image_name} default image?", Thor::Shell::Color::YELLOW
2724
1597
  # if default
2725
- # image = Images.new(working_dir, default_image_name)
2726
- # image_slug = image.image_slug
1598
+ image = Images.new(working_dir, default_image_name)
1599
+ image_slug = image.image_slug
2727
1600
  # else
2728
1601
  # exit(0)
2729
1602
  # end
@@ -2731,27 +1604,16 @@ module Cnvrg
2731
1604
  image_slug = image.image_slug
2732
1605
  end
2733
1606
 
2734
- invoke :sync, [false], [] if sync_before
2735
-
2736
1607
 
2737
- if command.include? "'"
2738
- oc = command.to_enum(:scan, /'/).map { Regexp.last_match }
2739
- pairs = oc.enum_for(:each_slice, 2).to_a
2740
- pairs.each_with_index do |p,i|
2741
- add=0
2742
- if i!=0
2743
- add=2*i
2744
- end
2745
- total_loc = command[p[0].offset(0)[0]+add..p[1].offset(0)[0]+add]
2746
- command[p[0].offset(0)[0]+add..p[1].offset(0)[0]+add] = "\"#{total_loc}\""
2747
- end
2748
1608
 
1609
+ invoke :sync, [], []
2749
1610
 
2750
- end
2751
1611
  say "Running remote experiment", Thor::Shell::Color::BLUE
2752
1612
  exp = Experiment.new(project.owner, project.slug)
2753
- res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp, grid, path_to_cmd, data, data_commit)
1613
+
1614
+ res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp)
2754
1615
  if Cnvrg::CLI.is_response_success(res)
1616
+
2755
1617
  # if res["result"]["machine"] == -1
2756
1618
  # say "There are no available machines", Thor::Shell::Color::BLUE
2757
1619
  # create = yes? "create new machine?", Thor::Shell::Color::YELLOW
@@ -2783,13 +1645,7 @@ module Cnvrg
2783
1645
  # end
2784
1646
  # else
2785
1647
  check = Helpers.checkmark()
2786
- str = "#{check} Experiment's is on: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/experiments/#{res["result"]["exp_url"]}"
2787
-
2788
- if res["result"]["grid"]
2789
- str = "Running grid search. #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/experiments?grid=#{res["result"]["exp_url"]} "
2790
- end
2791
-
2792
- say str, Thor::Shell::Color::GREEN
1648
+ say "#{check} Experiment's is on: #{Cnvrg::Helpers.remote_url}/#{project.owner}/projects/#{project.slug}/experiments/#{res["result"]["exp_url"]}", Thor::Shell::Color::GREEN
2793
1649
 
2794
1650
  exit(0)
2795
1651
  # end
@@ -2809,30 +1665,21 @@ module Cnvrg
2809
1665
  end
2810
1666
 
2811
1667
  desc 'deploy', 'Deploys model to production'
2812
- method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
2813
- method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
2814
- method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
2815
- method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
2816
- method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
2817
- method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
2818
- method_option :schedule, :type => :string, :aliases => ["--schedule", "-s"], :default => ""
2819
-
2820
- method_option :commit, :type => :string, :aliases => ["--commit", "-c"], :default => ""
2821
- method_option :workers, :type => :string, :aliases => ["--workers", "-w"], :default => ""
2822
- method_option :file_as_input, :type => :boolean, :aliases => ["--input", "-i"], :default => false
1668
+ method_option :machine_type, :type => :string, :aliases => ["--i", "-i"], :default => ""
1669
+ method_option :schedule, :type => :string, :aliases => ["--s", "-s"], :default => ""
1670
+ method_option :commit, :type => :string, :aliases => ["--c", "-c"], :default => ""
2823
1671
 
2824
1672
  def deploy(file_to_run, function)
2825
1673
  verify_logged_in(true)
2826
1674
  log_start(__method__, args, options)
2827
1675
  working_dir = is_cnvrg_dir
2828
1676
  begin
2829
- instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"],
2830
- "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
2831
- instance_type = get_instance_type(instances)
2832
1677
 
1678
+ instance_type = options["machine_type"] || nil
2833
1679
  schedule = options["schedule"] || ""
2834
1680
 
2835
1681
 
1682
+
2836
1683
  if !schedule.nil? and !schedule.empty?
2837
1684
 
2838
1685
  local_timestamp = get_schedule_date
@@ -2841,34 +1688,26 @@ module Cnvrg
2841
1688
  project = Project.new(working_dir)
2842
1689
  commit_to_run = options["commit"] || nil
2843
1690
 
2844
- workers = options["workers"] || nil
2845
- begin
2846
- num_workers = workers.to_i
2847
- rescue
2848
- say "Number of workers should be a number between 1 to 10", Thor::Shell::Color::RED
2849
- exit(1)
2850
- end
2851
- file_as_input = options["file_as_input"] || false
2852
-
2853
1691
 
2854
1692
  image = is_project_with_docker(working_dir)
2855
1693
  if !image or !image.is_docker
2856
- # say "Couldn't find image related to project", Thor::Shell::Color::RED
2857
- # default = yes? "use cnvrg default image?", Thor::Shell::Color::YELLOW
2858
- # if default
2859
- image = Images.new(working_dir, "cnvrg")
2860
- image_slug = image.image_slug
2861
- # else
2862
- # exit(0)
2863
- # end
1694
+ say "Couldn't find image related to project", Thor::Shell::Color::RED
1695
+ default = yes? "use cnvrg default image?", Thor::Shell::Color::YELLOW
1696
+ if default
1697
+ image = Images.new(working_dir, "cnvrg")
1698
+ image_slug = image.image_slug
1699
+ else
1700
+ exit(0)
1701
+ end
2864
1702
  else
2865
1703
  image_slug = image.image_slug
2866
1704
  end
2867
1705
 
2868
1706
 
2869
- invoke :sync, [false], []
2870
1707
 
2871
- res = project.deploy(file_to_run, function, nil, commit_to_run, instance_type, image_slug, schedule, local_timestamp, num_workers, file_as_input)
1708
+ invoke :sync, [], []
1709
+
1710
+ res = project.deploy(file_to_run, function, nil, commit_to_run, instance_type, image_slug, schedule, local_timestamp)
2872
1711
 
2873
1712
  if Cnvrg::CLI.is_response_success(res)
2874
1713
 
@@ -2924,37 +1763,27 @@ module Cnvrg
2924
1763
 
2925
1764
  method_option :kernel, :type => :string, :aliases => ["--k", "-k"], :default => ""
2926
1765
  method_option :notebook_dir, :type => :string, :aliases => ["-n", "--n"], :default => "", :desc => "relative path to notebook dir from current directory"
2927
- method_option :local, :type => :boolean, :aliases => ["-l"], :default => false
2928
- method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
2929
- method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
2930
- method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
1766
+ method_option :local, :type => :boolean, :aliases => ["--l"], :default => false
1767
+ method_option :small, :type => :boolean, :aliases => ["--sm"], :default => false
1768
+ method_option :medium, :type => :boolean, :aliases => ["--med"], :default => false
1769
+ method_option :large, :type => :boolean, :aliases => ["--lg"], :default => false
2931
1770
  method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
2932
- method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
2933
- method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
2934
- method_option :image, :type => :string, :aliases => ["-i", "--image"], :default => ""
2935
- method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
2936
- method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
2937
-
1771
+ method_option :gpuxl, :type => :boolean, :aliases => ["--gxl"], :default => false
1772
+ desc 'starts a notebook session', 'starts a notebook session remotely or locally'
2938
1773
 
2939
- desc 'notebook', 'starts a notebook session remotely or locally'
2940
-
2941
- def notebook
1774
+ def notebook()
2942
1775
  local = options["local"]
2943
1776
  notebook_dir = options["notebook_dir"]
2944
1777
  kernel = options["kernel"]
2945
- image = options["image"]
2946
- data = options["data"]
2947
- data_commit = options["data_commit"]
1778
+
2948
1779
  if local
2949
- invoke :run_notebook, [], :notebook_dir => notebook_dir, :remote => false, :kernel => kernel, :image => image
1780
+ invoke :run_notebook, [], :notebook_dir => notebook_dir, :remote => false, :kernel => kernel
2950
1781
  return
2951
1782
  else
2952
- instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"],
2953
- "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
1783
+ instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"], "gpu" => options["gpu"], "gpuxl" => options["gpuxl"]}
2954
1784
  instance_type = get_instance_type(instances)
2955
1785
 
2956
- invoke :remote_notebook, [], :notebook_dir => notebook_dir, :kernel => kernel, :machine_type => instance_type, :image => image,
2957
- :data => data, :data_commit => data_commit
1786
+ invoke :remote_notebook, [], :notebook_dir => notebook_dir, :kernel => kernel, :machine_type => instance_type
2958
1787
  return
2959
1788
 
2960
1789
  end
@@ -2963,12 +1792,10 @@ module Cnvrg
2963
1792
  end
2964
1793
 
2965
1794
  desc 'remote_notebook', 'run notebook server on remote server'
2966
- method_option :notebook_dir, :type => :string, :aliases => ["-n"], :default => "", :desc => "relative path to notebook dir from current directory"
2967
- method_option :machine_type, :type => :string, :default => ""
2968
- method_option :kernel, :type => :string, :aliases => ["--kernel", "-k"], :default => ""
2969
- method_option :image, :type => :string, :aliases => ["-i"], :default => ""
2970
- method_option :data, :type => :string, :aliases => ["-d", "--data"], :default => ""
2971
- method_option :data_commit, :type => :string, :aliases => ["--data_commit"], :default => ""
1795
+ method_option :notebook_dir, :type => :string, :aliases => ["-n", "--n"], :default => "", :desc => "relative path to notebook dir from current directory"
1796
+ method_option :machine_type, :type => :string, :aliases => ["--i", "-i"], :default => ""
1797
+ method_option :kernel, :type => :string, :aliases => ["--k", "-k"], :default => ""
1798
+ method_option :image, :type => :string, :aliases => ["--i"], :default => ""
2972
1799
 
2973
1800
 
2974
1801
  def remote_notebook()
@@ -2980,15 +1807,13 @@ module Cnvrg
2980
1807
  notebook_dir = options["notebook_dir"]
2981
1808
  instance_type = options["machine_type"] || nil
2982
1809
  kernel = options["kernel"] || nil
2983
- data = options["data"]
2984
- data_commit = options["data_commit"]
2985
1810
 
2986
1811
 
2987
1812
  begin
2988
1813
  choose_image = options["image"]
2989
1814
 
2990
1815
  if !choose_image.nil? and !choose_image.empty?
2991
- invoke :set_image, [choose_image]
1816
+ invoke :set_image,[choose_image]
2992
1817
  end
2993
1818
  @image = is_project_with_docker(working_dir)
2994
1819
  if !@image or !@image.is_docker
@@ -2999,16 +1824,17 @@ module Cnvrg
2999
1824
  end
3000
1825
  # default = yes? "use #{default_image_name} default image?", Thor::Shell::Color::YELLOW
3001
1826
  # if default
3002
- @image = Images.new(working_dir, default_image_name)
1827
+ @image = Images.new(working_dir, default_image_name)
3003
1828
  # else
3004
1829
  # exit(0)
3005
1830
  # end
3006
1831
  end
3007
1832
 
3008
- invoke :sync, [false], []
1833
+ invoke :sync, [], []
1834
+
3009
1835
 
3010
1836
 
3011
- res = @image.remote_notebook(notebook_dir, instance_type, kernel, data, data_commit)
1837
+ res = @image.remote_notebook(notebook_dir, instance_type, kernel)
3012
1838
  if Cnvrg::CLI.is_response_success(res)
3013
1839
  if res["result"]["machine"] == -1
3014
1840
  say "There are no available machines", Thor::Shell::Color::BLUE
@@ -3047,7 +1873,7 @@ module Cnvrg
3047
1873
  note_url = res["result"]["notebook_url"]
3048
1874
  @image.set_note_url(note_url)
3049
1875
  check = Helpers.checkmark()
3050
- say "#{check} Notebook is on: #{Cnvrg::Helpers.remote_url}/#{@image.owner}/projects/#{@image.project_slug}/notebook_sessions/show/#{note_url}", Thor::Shell::Color::GREEN
1876
+ say "#{check} Notebook is on: #{Cnvrg::Helpers.remote_url}/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/show/#{note_url}", Thor::Shell::Color::GREEN
3051
1877
  # Launchy.open(url)
3052
1878
 
3053
1879
  exit(0)
@@ -3115,8 +1941,9 @@ module Cnvrg
3115
1941
 
3116
1942
  end
3117
1943
  rescue => e
3118
- log_end(-1, e.message)
3119
- say "Error occurred, aborting", Thor::Shell::Color::RED
1944
+ puts e
1945
+ log_end(-1)
1946
+ say "Error occurd, Aborting"
3120
1947
  if container
3121
1948
  container.stop()
3122
1949
  end
@@ -3177,8 +2004,9 @@ module Cnvrg
3177
2004
  end
3178
2005
  end
3179
2006
  rescue => e
3180
- log_end(-1, e.message)
3181
- say "Error occurred, aborting"
2007
+ puts e
2008
+ log_end(-1)
2009
+ say "Error occurd, Aborting"
3182
2010
  if container
3183
2011
  container.stop()
3184
2012
  end
@@ -3195,7 +2023,6 @@ module Cnvrg
3195
2023
  method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false, :desc => "run on remote machine"
3196
2024
  method_option :kernel, :type => :string, :aliases => ["-k", "--k"], :default => "", :desc => "default kernel"
3197
2025
  method_option :verbose, :type => :boolean, :aliases => ["--v"], :default => false
3198
- method_option :image, :type => :string, :aliases => ["-i"], :default => ""
3199
2026
 
3200
2027
  def run_notebook
3201
2028
 
@@ -3209,7 +2036,7 @@ module Cnvrg
3209
2036
  notebook_dir = options["notebook_dir"]
3210
2037
  remote = options["remote"] || false
3211
2038
  kernel = options["kernel"] || ""
3212
- notebooks_pid = nil
2039
+
3213
2040
 
3214
2041
  if notebook_dir.empty?
3215
2042
  notebook_dir = project_dir
@@ -3217,148 +2044,107 @@ module Cnvrg
3217
2044
 
3218
2045
  notebook_dir = project_dir+ notebook_dir
3219
2046
  end
3220
- choose_image = options["image"]
3221
-
3222
- if !choose_image.nil? and !choose_image.empty?
3223
- invoke :set_image, [choose_image]
3224
- end
3225
-
2047
+ say "Linking notebook directory to: #{File.basename notebook_dir}", Thor::Shell::Color::BLUE
3226
2048
  image = is_project_with_docker(Dir.pwd)
3227
- if !image
3228
- jupyter_installed = `which jupyter`
3229
- if !$?.success?
3230
- say "Could not find jupyter, Is it installed?", Thor::Shell::Color::RED
3231
- exit(1)
3232
- end
3233
-
3234
-
3235
- cmd = "jupyter-notebook --port=8888"
3236
- PTY.spawn(cmd) do |stdout, stdin, pid, stderr|
3237
- begin
3238
- notebooks_pid = pid
3239
- stdout.each do |line|
3240
- puts line
3241
-
3242
- end
3243
-
3244
- rescue Errno::EIO => e
3245
- # break
3246
- rescue Errno::ENOENT
3247
- log_end(1, "command #{cmd} isn't valid")
3248
-
3249
-
3250
- say "command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED
3251
- rescue PTY::ChildExited
3252
- log_end(1, "proccess exited")
3253
- say "The process exited!", Thor::Shell::Color::RED
3254
- rescue => e
3255
- log_end(-1, e.message)
3256
- say "Error occurred,aborting", Thor::Shell::Color::RED
3257
- exit(0)
3258
-
3259
- end
3260
-
2049
+ if image and image.is_docker and !remote
2050
+ container= image.get_container
2051
+ if !container
3261
2052
 
2053
+ say "Couldn't create container with image #{image.image_name}:#{image.image_tag}", Thor::Shell::Color::RED
2054
+ exit(1)
3262
2055
  end
2056
+ else
2057
+ say "Project is not configured with any image", Thor::Shell::Color::RED
2058
+ exit(1)
3263
2059
 
3264
2060
  end
2061
+ if options["verbose"]
2062
+ say "Syncing project before running", Thor::Shell::Color::BLUE
2063
+ say 'Checking for new updates from remote version', Thor::Shell::Color::BLUE
2064
+ end
2065
+ @project = Project.new(project_dir)
3265
2066
 
3266
- if image and image.is_docker and !remote
3267
- container= image.get_container
3268
- if !container
3269
- say "Couldn't start docker container", Thor::Shell::Color::RED
3270
- exit(1)
2067
+ start_commit = @project.last_local_commit
3271
2068
 
2069
+ if (note_slug=image.note_slug)
2070
+ say "There is a running notebook session in: https://cnvrg.io/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/show/#{note_slug}", Thor::Shell::Color::BLUE
2071
+ new = yes? "Create a new session?", Thor::Shell::Color::YELLOW
2072
+ if !new
2073
+ exit(0)
3272
2074
  end
3273
2075
 
3274
- if options["verbose"]
3275
- say "Syncing project before running", Thor::Shell::Color::BLUE
3276
- say 'Checking for new updates from remote version', Thor::Shell::Color::BLUE
3277
- end
3278
- @project = Project.new(project_dir)
2076
+ end
2077
+ invoke :sync, [], :verbose => options["verbose"]
2078
+ say "Done Syncing", Thor::Shell::Color::BLUE if options["verbose"]
2079
+ #replace url
2080
+ base_url = get_base_url()
3279
2081
 
3280
- start_commit = @project.last_local_commit
2082
+ local_url = "/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/view/local"
2083
+ command = ["/bin/bash","-lc","sed -i 's#c.NotebookApp.base_url = .*#c.NotebookApp.base_url = \"#{local_url}\"#' /home/ds/.jupyter/jupyter_notebook_config.py"]
2084
+ container.exec(command, tty: true)
2085
+ container.stop()
2086
+ container.start()
3281
2087
 
3282
- if (note_slug=image.note_slug)
3283
- say "There is a running notebook session in: https://cnvrg.io/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/show/#{note_slug}", Thor::Shell::Color::BLUE
3284
- new = yes? "Create a new session?", Thor::Shell::Color::YELLOW
3285
- if !new
3286
- exit(0)
3287
- end
2088
+ @note = Experiment.new(@project.owner, @project.slug)
2089
+ port = image.container_port()
3288
2090
 
3289
- end
3290
- invoke :sync, [false], :verbose => options["verbose"]
3291
- say "Done Syncing", Thor::Shell::Color::BLUE if options["verbose"]
3292
- #replace url
3293
- base_url = get_base_url()
3294
-
3295
- local_url = "/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/view/local"
3296
- command = ["/bin/bash", "-lc", "sed -i 's#c.NotebookApp.base_url = .*#c.NotebookApp.base_url = \"#{local_url}\"#' /home/ds/.jupyter/jupyter_notebook_config.py"]
3297
- container.exec(command, tty: true)
3298
- container.stop()
3299
- container.start()
3300
- sleep(7)
3301
- @note = Experiment.new(@project.owner, @project.slug)
3302
- port = image.container_port()
3303
-
3304
- command = ["/bin/bash", "-lc", "jupyter notebook list"]
3305
- list = container.exec(command, tty: true)[0]
3306
- if list.empty? or list.nil?
3307
- say "Couldn't start notebook server", Thor::Shell::Color::RED
3308
- log_end(1, "can't start notebook server")
3309
- exit(1)
3310
- end
2091
+ command = ["/bin/bash", "-lc", "jupyter notebook list"]
2092
+ list = container.exec(command, tty: true)[0]
2093
+ if list.empty? or list.nil?
2094
+ say "Couldn't start notebook server", Thor::Shell::Color::RED
2095
+ log_end(1, "can't start notebook server")
2096
+ exit(1)
2097
+ end
3311
2098
 
3312
- result = ""
3313
- list.each do |r|
3314
- if r.include? "http"
3315
- result = r
3316
- end
3317
- end
3318
- token = result.to_s.split("::")[0].to_s.match(/(token=)(.+)\s/)[2]
2099
+ url = list[list.size-1].split(" ::")
2100
+ token = url[0][(url[0].index("=")+1)..-1]
3319
2101
 
3320
- # machine_activity = @note.get_machine_activity(project_dir)
2102
+ # machine_activity = @note.get_machine_activity(project_dir)
3321
2103
 
3322
2104
 
3323
- slug = @note.start_notebook_session(kernel, start_commit, token, port, false, notebook_dir)
3324
- image.set_note_url(slug)
3325
- note_url = "http://localhost:#{port}/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/view/local/?token=#{token}"
2105
+ slug = @note.start_notebook_session(kernel, start_commit, token, port, false, notebook_dir)
2106
+ image.set_note_url(slug)
2107
+ note_url = "http://localhost:#{port}/#{@project.owner}/projects/#{@project.slug}/notebook_sessions/view/local/?token=#{token}"
3326
2108
 
3327
2109
 
3328
- if !note_url.empty?
3329
- check = Helpers.checkmark()
2110
+ if !note_url.empty?
2111
+ check = Helpers.checkmark()
3330
2112
 
3331
- say "#{check} Notebook server started successfully", Thor::Shell::Color::GREEN
3332
- Launchy.open(note_url)
3333
- else
3334
- say "Couldn't start notebook server", Thor::Shell::Color::RED
3335
- log_end(1, "can't start notebook server")
3336
- exit(1)
3337
- end
2113
+ say "#{check} Notebook server started successfully", Thor::Shell::Color::GREEN
2114
+ Launchy.open(note_url)
2115
+ else
2116
+ say "Couldn't start notebook server", Thor::Shell::Color::RED
2117
+ log_end(1, "can't start notebook server")
2118
+ exit(1)
3338
2119
  end
3339
2120
 
3340
-
2121
+ # jup =verify_software_installed("jupyter-notebook")
2122
+ # logs = `#{jup} --no-browser --ip=0.0.0.0 --notebook-dir=#{notebook_dir}`
2123
+ # url = URI.extract(logs).reject { |x| x if !x.include? "http" }.uniq![0]
2124
+ # if !url.empty?
2125
+ # check = Helpers.checkmark()
2126
+ #
2127
+ # say "#{check} Notebook server started successfully, view notebook in url: #{url}", Thor::Shell::Color::GREEN
2128
+ # log_end(0)
2129
+ # else
2130
+ # say "Couldn't start notebook server", Thor::Shell::Color::RED
2131
+ # log_end(1, "can't start notebook server")
2132
+ # exit(1)
2133
+ # end
3341
2134
  rescue => e
3342
- log_end(-1, e.message)
2135
+ log_end(-1)
2136
+ puts e
3343
2137
  say "Error occurd, aborting", Thor::Shell::Color::RED
3344
2138
  if container
3345
2139
  container.stop()
3346
2140
  end
3347
2141
  rescue SignalException
3348
- if !notebooks_pid.nil?
3349
- ::Process.kill(0, notebooks_pid)
3350
- say "#{check} Notebook has stopped successfully", Thor::Shell::Color::GREEN
3351
-
3352
-
3353
- invoke :sync, [false], []
3354
- else
3355
- log_end(-1)
3356
-
3357
- if container
3358
- container.stop()
3359
- end
2142
+ log_end(-1)
2143
+ if container
2144
+ container.stop()
3360
2145
  end
3361
-
2146
+ say "Aborting"
2147
+ exit(1)
3362
2148
  end
3363
2149
 
3364
2150
 
@@ -3379,7 +2165,7 @@ module Cnvrg
3379
2165
 
3380
2166
 
3381
2167
  say 'Checking for new updates from remote version', Thor::Shell::Color::BLUE if options["verbose"]
3382
- invoke :sync, [false], :verbose => options["verbose"]
2168
+ invoke :sync, [], :verbose => options["verbose"]
3383
2169
 
3384
2170
  say "Done Syncing", Thor::Shell::Color::BLUE if options["verbose"]
3385
2171
 
@@ -3424,7 +2210,8 @@ module Cnvrg
3424
2210
  exit(0)
3425
2211
  end
3426
2212
  rescue => e
3427
- log_end(-1, e.message)
2213
+ puts e
2214
+ log_end(-1)
3428
2215
  say "Error occurd, aborting"
3429
2216
  if container
3430
2217
  container.stop()
@@ -3474,7 +2261,8 @@ module Cnvrg
3474
2261
 
3475
2262
  log_end(0)
3476
2263
  rescue => e
3477
- log_end(-1, e.message)
2264
+ log_end(-1)
2265
+ puts e
3478
2266
  say "Error occurd, aborting"
3479
2267
  if container
3480
2268
  container.stop()
@@ -3537,12 +2325,14 @@ module Cnvrg
3537
2325
 
3538
2326
  log_end(0)
3539
2327
  rescue => e
3540
- log_end(-1, e.message)
2328
+ log_end(-1)
2329
+ puts e
3541
2330
  say "Error occurd, aborting"
3542
2331
  if container
3543
2332
  container.stop()
3544
2333
  end
3545
2334
  rescue SignalException
2335
+ log_End(-1)
3546
2336
  if container
3547
2337
  container.stop()
3548
2338
  end
@@ -3551,100 +2341,7 @@ module Cnvrg
3551
2341
  end
3552
2342
 
3553
2343
  end
3554
-
3555
- method_option :small, :type => :boolean, :aliases => ["-sm", "--small"], :default => false
3556
- method_option :medium, :type => :boolean, :aliases => ["-md", "--medium"], :default => false
3557
- method_option :large, :type => :boolean, :aliases => ["-lg", "--large"], :default => false
3558
- method_option :gpu, :type => :boolean, :aliases => ["--gpu"], :default => false
3559
- method_option :gpuxl, :type => :boolean, :aliases => ["--gpuxl"], :default => false
3560
- method_option :gpuxxl, :type => :boolean, :aliases => ["--gpuxxl"], :default => false
3561
- method_option :image, :type => :string, :aliases => ["-i","--image"], :default => ""
3562
- method_option :public, :type => :boolean, :aliases => ["-p","--public"], :default => false
3563
- method_option :base, :type => :boolean, :aliases => ["-b","--base"], :default => false
3564
- method_option :python3, :type => :boolean, :aliases => ["--python3"], :default => false
3565
-
3566
- desc 'create_custom_image', 'run commands inside containers', :hide=>true
3567
-
3568
- def create_custom_image(image_name)
3569
- begin
3570
- verify_logged_in(false)
3571
- log_start(__method__, args, options)
3572
- instances = {"small" => options["small"], "medium" => options["medium"], "large" => options["large"],
3573
- "gpu" => options["gpu"], "gpuxl" => options["gpuxl"], "gpuxxl" => options["gpuxxl"]}
3574
- instance_type = get_instance_type(instances)
3575
- image_extend = options["image"]
3576
- public = options["public"]
3577
- base = options["base"]
3578
- python3 = options["python3"]
3579
- owner = CLI.get_owner
3580
- checks = Helpers.checkmark()
3581
-
3582
- say "Creating machine for custom image, this may take a few moments...", Thor::Shell::Color::BLUE
3583
-
3584
- resp = Images.create_new_custom_image(instance_type,owner,image_name,public,base,image_extend,python3)
3585
- if Cnvrg::CLI.is_response_success(resp,false)
3586
- image_slug = resp["result"]["slug"]
3587
- container = resp["result"]["machine_c"]
3588
- say "#{checks} Created image and machine successfully", Thor::Shell::Color::GREEN
3589
- say "Connecting to machine", Thor::Shell::Color::BLUE
3590
- ssh = Ssh.new(resp)
3591
- if !ssh.is_ssh
3592
- say "Couldn't connect to machine,aborting", Thor::Shell::Color::RED
3593
- Images.revoke_custom_new_image(owner, image_slug)
3594
- log_end(-1,"Couldn't connect to machine,aborting")
3595
- end
3596
- say "run command until ctrl + c initiates", Thor::Shell::Color::BLUE
3597
- begin
3598
-
3599
- while true
3600
- command = ask("$>")
3601
- puts ssh.exec_command(command)
3602
- end
3603
-
3604
- rescue SignalException
3605
- say "Commiting Image..", Thor::Shell::Color::BLUE
3606
-
3607
- end
3608
- resp = Images.commit_custom_image(owner,image_slug)
3609
- if Cnvrg::CLI.is_response_success(resp,false)
3610
- say "#{checks} Image commited successfuly, email will be sent when image is ready", Thor::Shell::Color::GREEN
3611
- end
3612
- if ssh
3613
- ssh.close_ssh()
3614
- end
3615
-
3616
-
3617
-
3618
-
3619
-
3620
-
3621
-
3622
- end
3623
- rescue =>e
3624
- puts e
3625
- if image_slug
3626
- Images.revoke_custom_new_image(owner, image_slug)
3627
- end
3628
- if ssh
3629
- ssh.close_ssh()
3630
- end
3631
-
3632
-
3633
- rescue SignalException
3634
- if image_slug
3635
- Images.revoke_custom_new_image(owner, image_slug)
3636
- end
3637
- if ssh
3638
- ssh.close_ssh
3639
- end
3640
- say "\nAborting"
3641
- exit(1)
3642
- end
3643
-
3644
- end
3645
-
3646
-
3647
- desc 'build', 'run commands inside containers'
2344
+ desc 'run commands inside containers', 'run commands inside containers'
3648
2345
  method_option :install, :type => :string, :aliases => ["--i"], :default => nil, :desc => "Install from the given instructions file"
3649
2346
 
3650
2347
  def build(*cmd)
@@ -3655,10 +2352,10 @@ module Cnvrg
3655
2352
  working_dir = is_cnvrg_dir
3656
2353
  install_file = options["install"] || nil
3657
2354
  if !install_file.nil?
3658
- commands = File.open(install_file).read.chop.gsub!("\n", ",").split(",")
2355
+ commands = File.open(install_file).read.chop.gsub!("\n",",").split(",")
3659
2356
 
3660
2357
  else
3661
- commands = [cmd.join(" ")]
2358
+ commands = [cmd.join(" ")]
3662
2359
  end
3663
2360
 
3664
2361
 
@@ -3676,25 +2373,25 @@ module Cnvrg
3676
2373
 
3677
2374
  end
3678
2375
  commands.each do |c|
3679
- if c.include? "pip"
3680
- c.sub("pip", "/opt/ds/bin/pip")
3681
- end
3682
- if c.include? "pip3"
3683
- c.sub("pip3", "/opt/ds3/bin/pip3")
3684
- end
2376
+ if c.include? "pip"
2377
+ c.sub("pip","/opt/ds/bin/pip")
2378
+ end
2379
+ if c.include? "pip3"
2380
+ c.sub("pip3","/opt/ds3/bin/pip3")
2381
+ end
3685
2382
 
3686
- say "Running #{c}", Thor::Shell::Color::BLUE
3687
- command = ["/bin/bash", "-lc", "#{c}"]
3688
- res = container.exec(command, tty: false)
3689
- if res[2] != 0
3690
- say "Could not run command: #{c}, #{res[1][0]}", Thor::Shell::Color::RED
3691
- container.stop()
3692
- log_end(0)
2383
+ say "Running #{c}", Thor::Shell::Color::BLUE
2384
+ command = ["/bin/bash", "-lc", "#{c}"]
2385
+ res = container.exec(command, tty: false)
2386
+ if res[2] != 0
2387
+ say "Could not run command: #{c}, #{res[1][0]}" , Thor::Shell::Color::RED
2388
+ container.stop()
2389
+ log_end(0)
3693
2390
 
3694
- exit(1)
3695
- end
3696
- say res[0].join("\n")
3697
- image.store_image_build_commands(working_dir, c)
2391
+ exit(1)
2392
+ end
2393
+ say res[0].join("\n")
2394
+ image.store_image_build_commands(working_dir,c)
3698
2395
  end
3699
2396
 
3700
2397
  checks = Helpers.checkmark()
@@ -3705,7 +2402,8 @@ module Cnvrg
3705
2402
 
3706
2403
  log_end(0)
3707
2404
  rescue => e
3708
- log_end(-1, e.message)
2405
+ log_end(-1)
2406
+ puts e
3709
2407
  say "Error occurd, aborting", Thor::Shell::Color::RED
3710
2408
  if container
3711
2409
  container.stop()
@@ -3754,9 +2452,8 @@ module Cnvrg
3754
2452
  log_end(0)
3755
2453
  return new_image.id
3756
2454
  rescue => e
3757
- log_end(-1, e.message)
3758
- say "\nError occurred,aborting"
3759
- exit(1)
2455
+ puts e
2456
+
3760
2457
  rescue SignalException
3761
2458
  log_end(-1)
3762
2459
  say "\nAborting"
@@ -3799,7 +2496,7 @@ module Cnvrg
3799
2496
 
3800
2497
  end
3801
2498
 
3802
- desc 'push', 'push image to cnvrg repository'
2499
+ desc 'push image to cnvrg repository', 'push image to cnvrg repository'
3803
2500
 
3804
2501
  def push(*name)
3805
2502
  verify_logged_in(true)
@@ -3817,24 +2514,22 @@ module Cnvrg
3817
2514
  end
3818
2515
  if !name.nil? and !name.empty?
3819
2516
  if name.include? " "
3820
- name.gsub!(" ", "_")
2517
+ name.gsub!(" ","_")
3821
2518
  end
3822
2519
  end
3823
- stored_commands = File.open(working_dir+"/.cnvrg/custom_image.txt").read.chop.gsub("\n", ",")
2520
+ stored_commands = File.open(working_dir+"/.cnvrg/custom_image.txt").read.chop.gsub("\n",",")
3824
2521
  if stored_commands.nil? or stored_commands.empty?
3825
2522
  say "Nothing to push", Thor::Shell::Color::BLUE
3826
2523
  exit(0)
3827
2524
  end
3828
2525
 
3829
2526
  say "Pushing new image", Thor::Shell::Color::BLUE
3830
- if image.create_custom_image(name, working_dir, stored_commands)
2527
+ if image.create_custom_image(name,working_dir,stored_commands)
3831
2528
 
3832
2529
  say "Image was updated successfully", Thor::Shell::Color::GREEN
3833
2530
  end
3834
2531
  rescue => e
3835
- log_end(-1, e.message)
3836
- say "error occurred, aborting"
3837
-
2532
+ puts e
3838
2533
  end
3839
2534
  end
3840
2535
 
@@ -3896,8 +2591,8 @@ module Cnvrg
3896
2591
  exit(1)
3897
2592
  end
3898
2593
  rescue => e
3899
- log_end(-1, e.message)
3900
- say "Couldn't upload image file for: #{image_name}", Thor::Shell::Color::RED
2594
+ puts e
2595
+
3901
2596
  rescue SignalException
3902
2597
  log_end(-1)
3903
2598
 
@@ -3906,7 +2601,7 @@ module Cnvrg
3906
2601
  end
3907
2602
  end
3908
2603
 
3909
- desc '', '', :hide => true
2604
+ desc '', ''
3910
2605
 
3911
2606
  def upload_log()
3912
2607
  log_path = '/home/ds/app/uwsgi.log'
@@ -3915,32 +2610,28 @@ module Cnvrg
3915
2610
 
3916
2611
  end
3917
2612
 
3918
- desc '', '', :hide => true
2613
+ desc '', ''
3919
2614
 
3920
2615
  def exec_container(container_id, *cmd)
3921
2616
  container = Docker::Container.get(container_id)
3922
2617
  container.start()
3923
2618
  cnvrg_command = cmd.join(" ")
3924
2619
  command = ["/bin/bash", "-lc", "#{cnvrg_command}"]
3925
- res = container.exec(command, tty: true, wait: 5400)[0]
2620
+ res = container.exec(command, tty: true,wait:5400)[0]
3926
2621
  say res
2622
+
3927
2623
  end
3928
2624
 
3929
- desc '', '', :hide => true
2625
+ desc '', ''
3930
2626
 
3931
2627
  def port_container(container_id)
3932
2628
  container = Docker::Container.get(container_id)
3933
2629
  say container.json["HostConfig"]["PortBindings"]["8888/tcp"][0]["HostPort"]
3934
- end
3935
2630
 
3936
- desc '', '', :hide => true
3937
2631
 
3938
- def tensor_port_container(container_id)
3939
- container = Docker::Container.get(container_id)
3940
- say container.json["HostConfig"]["PortBindings"]["6006/tcp"][0]["HostPort"]
3941
2632
  end
3942
2633
 
3943
- desc '', '', :hide => true
2634
+ desc '', ''
3944
2635
 
3945
2636
  def stop_container(container_id)
3946
2637
  container = Docker::Container.get(container_id)
@@ -3949,13 +2640,13 @@ module Cnvrg
3949
2640
 
3950
2641
  end
3951
2642
 
3952
- desc '', '', :hide => true
3953
- method_option :login, :type => :string, :aliases => ["-l"], :default => ""
3954
- method_option :app_dir, :type => :string, :aliases => ["-d"], :default => "/home/ds/notebooks"
3955
- method_option :cmd, :type => :string, :aliases => ["-c"], :default => "/usr/local/cnvrg/run_ipython.sh"
2643
+ desc '', ''
2644
+ method_option :login, :type => :string, :aliases => ["-l", "--l"], :default => ""
2645
+ method_option :app_dir, :type => :string, :aliases => ["-d", "--d"], :default => "/home/ds/notebooks"
2646
+ method_option :cmd, :type => :string, :aliases => ["-c", "--c"], :default => "/usr/local/cnvrg/run_ipython.sh"
3956
2647
 
3957
2648
 
3958
- def config_remote(image_name, port=7654, tensport=6006)
2649
+ def config_remote(image_name, port=7654)
3959
2650
  local_images = Docker::Image.all
3960
2651
 
3961
2652
  docker_image_local = local_images.map { |x| x.info["RepoTags"] }.flatten.select { |y| y.eql? "#{image_name}:latest" }.flatten
@@ -3968,25 +2659,20 @@ module Cnvrg
3968
2659
  login_content = options["login"]
3969
2660
  app_dir = options["app_dir"]
3970
2661
  cmd= options["cmd"]
3971
- volume_from = options["volume"]
3972
2662
 
3973
2663
  image_settings = {
3974
2664
  'Image' => "#{image_name}:latest",
3975
-
2665
+ 'User' => 'ds',
3976
2666
  'Cmd' => cmd,
3977
2667
  'WorkingDir' => app_dir,
3978
2668
  'ExposedPorts' => {
3979
2669
  '8888/tcp' => {},
3980
2670
  },
3981
2671
  'HostConfig' => {
3982
- 'Binds'=> ["/var/run/docker.sock:/var/run/docker.sock","/usr/bin/docker:/usr/bin/docker" ],
3983
2672
  'PortBindings' => {
3984
2673
  '8888/tcp' => [
3985
2674
  {'HostPort' => "#{port}", 'HostIp' => 'localhost'}
3986
2675
  ],
3987
- '6006/tcp' => [
3988
- {'HostPort' => "#{tensport}", 'HostIp' => 'localhost'}
3989
- ],
3990
2676
  },
3991
2677
  },
3992
2678
  }
@@ -3994,104 +2680,21 @@ module Cnvrg
3994
2680
  container.start()
3995
2681
  command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
3996
2682
  container.exec(command, tty: true)
3997
- # command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg"]
3998
- # container.exec(command, tty: true)
3999
- # command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg/tmp"]
4000
- # container.exec(command, tty: true)
4001
- command = ["/bin/bash", "-lc", "sudo chown -R ds:ds /home/ds/.netrc"]
4002
- container.exec(command, tty: true)
4003
- command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
2683
+ command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg"]
4004
2684
  container.exec(command, tty: true)
4005
- say "#{container.id}:#{port}##{tensport}"
4006
- rescue => e
4007
- puts e
4008
- if e.message.include? "is not running"
4009
- return config_remote(image_name, port-1, tensport-1)
4010
- end
4011
-
4012
- if container
4013
- container.kill()
4014
- end
4015
- return false
4016
- end
4017
- end
4018
-
4019
-
4020
- desc '', '', :hide => true
4021
- method_option :login, :type => :string, :aliases => ["-l"], :default => ""
4022
-
4023
- def config_netrc(container)
4024
-
4025
- login_content = options["login"]
4026
-
4027
- container = Docker::Container.get(container)
4028
- command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
4029
- container.exec(command, tty: true)
4030
- command = ["/bin/bash", "-lc", "sudo chown -R ds:ds /home/ds/.netrc"]
4031
- container.exec(command, tty: true)
4032
- command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
4033
- container.exec(command, tty: true)
4034
- say "OK"
4035
-
4036
- end
4037
-
4038
- desc '', '', :hide => true
4039
- method_option :login, :type => :string, :aliases => ["-l", "--l"], :default => ""
4040
- method_option :app_dir, :type => :string, :aliases => ["-d", "--d"], :default => "/home/ds/notebooks"
4041
- method_option :cmd, :type => :string, :aliases => ["-c", "--c"], :default => "/usr/local/cnvrg/run_ipython.sh"
4042
-
4043
-
4044
- def config_remote_gpu(image_name, port=7654, tensport=6006)
4045
- local_images = Docker::Image.all
4046
-
4047
- docker_image_local = local_images.map { |x| x.info["RepoTags"] }.flatten.select { |y| y.eql? "#{image_name}:latest" }.flatten
4048
- if docker_image_local.empty?
4049
- say "no image"
4050
- exit(1)
4051
- end
4052
-
4053
- begin
4054
- login_content = options["login"]
4055
- app_dir = options["app_dir"]
4056
- cmd= options["cmd"]
4057
-
4058
- # image_settings = {
4059
- # 'Image' => "#{image_name}:latest",
4060
- # 'User' => 'ds',
4061
- # 'Cmd' => cmd,
4062
- # 'WorkingDir' => app_dir,
4063
- # 'ExposedPorts' => {
4064
- # '8888/tcp' => {},
4065
- # },
4066
- # 'HostConfig' => {
4067
- # 'PortBindings' => {
4068
- # '8888/tcp' => [
4069
- # {'HostPort' => "#{port}", 'HostIp' => 'localhost'}
4070
- # ],
4071
- # '6006/tcp' => [
4072
- # {'HostPort' => "6006", 'HostIp' => 'localhost'}
4073
- # ],
4074
- # },
4075
- # },
4076
- # }
4077
-
4078
- container_id = `nvidia-docker run -itd -p #{port}:8888 -p #{tensport}:6006 -w #{app_dir} -v /usr/bin/nvidia-smi:/usr/bin/nvidia-smi -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker #{image_name}:latest #{cmd} `
4079
- container_id = container_id.gsub("\n", "")
4080
- container = Docker::Container.get(container_id)
4081
- # container.start()
4082
- command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
2685
+ command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg/tmp"]
4083
2686
  container.exec(command, tty: true)
4084
- command = ["/bin/bash", "-lc", "sudo chown -R ds:ds /home/ds/.netrc"]
2687
+ command = ["/bin/bash", "-lc", "sudo chown -R ds /home/ds/.cnvrg /home/ds/.netrc"]
4085
2688
  container.exec(command, tty: true)
4086
2689
  command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
4087
2690
  container.exec(command, tty: true)
4088
- say "#{container.id}:#{port}##{tensport}"
2691
+ say "#{container.id}:#{port}"
4089
2692
  rescue => e
4090
2693
  if e.message.include? "is not running"
4091
- puts "running asgain with: #{port-1} #{tensport-1}"
4092
- return config_remote_gpu(image_name, port-1, tensport-1)
2694
+ return config_remote(image_name, port-1)
4093
2695
  end
4094
-
2696
+ puts "error"
2697
+ puts e
4095
2698
  if container
4096
2699
  container.kill()
4097
2700
  end
@@ -4099,8 +2702,8 @@ module Cnvrg
4099
2702
  end
4100
2703
  end
4101
2704
 
4102
- desc '', '', :hide => true
4103
- method_option :login, :type => :string, :aliases => ["-l"], :default => ""
2705
+ desc '', ''
2706
+ method_option :login, :type => :string, :aliases => ["-l", "--l"], :default => ""
4104
2707
 
4105
2708
  def config_flask_remote(image_name, port=80)
4106
2709
  local_images = Docker::Image.all
@@ -4133,54 +2736,21 @@ module Cnvrg
4133
2736
  container.start()
4134
2737
  command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
4135
2738
  container.exec(command, tty: true)
4136
- command = ["/bin/bash", "-lc", "sudo chown -R ds:ds /home/ds/.netrc"]
4137
- container.exec(command, tty: true)
4138
- command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
2739
+ command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg"]
4139
2740
  container.exec(command, tty: true)
4140
- say "#{container.id}:#{port}"
4141
- rescue => e
4142
- pus e
4143
- if e.message.include? "is not running"
4144
- return "port is taken"
4145
- end
4146
- puts "error"
4147
- if container
4148
- container.kill()
4149
- end
4150
- return false
4151
- end
4152
- end
4153
-
4154
- desc '', '', :hide => true
4155
- method_option :login, :type => :string, :aliases => ["-l"], :default => ""
4156
-
4157
- def config_flask_remote_gpu(image_name, port=80)
4158
- local_images = Docker::Image.all
4159
-
4160
- docker_image_local = local_images.map { |x| x.info["RepoTags"] }.flatten.select { |y| y.eql? "#{image_name}:latest" }.flatten
4161
- if docker_image_local.empty?
4162
- say "no image"
4163
- exit(1)
4164
- end
4165
-
4166
- begin
4167
- login_content = options["login"]
4168
- container_id = `nvidia-docker run -itd -p 80:80 -w /home/ds/app #{image_name}:latest /usr/local/cnvrg/start_super.sh`
4169
- container_id = container_id.gsub("\n", "")
4170
- container = Docker::Container.get(container_id)
4171
- command = ["/bin/bash", "-lc", "sudo echo -e \"#{login_content}\" >/home/ds/.netrc"]
2741
+ command = ["/bin/bash", "-lc", "mkdir /home/ds/.cnvrg/tmp"]
4172
2742
  container.exec(command, tty: true)
4173
- command = ["/bin/bash", "-lc", "sudo chown -R ds:ds /home/ds/.netrc"]
2743
+ command = ["/bin/bash", "-lc", "sudo chown -R ds /home/ds/.cnvrg /home/ds/.netrc"]
4174
2744
  container.exec(command, tty: true)
4175
2745
  command = ["/bin/bash", "-lc", "sudo chmod 0600 /home/ds/.netrc"]
4176
2746
  container.exec(command, tty: true)
4177
2747
  say "#{container.id}:#{port}"
4178
2748
  rescue => e
4179
- puts e
4180
2749
  if e.message.include? "is not running"
4181
2750
  return "port is taken"
4182
2751
  end
4183
2752
  puts "error"
2753
+ puts e
4184
2754
  if container
4185
2755
  container.kill()
4186
2756
  end
@@ -4188,7 +2758,7 @@ module Cnvrg
4188
2758
  end
4189
2759
  end
4190
2760
 
4191
- desc '', '', :hide => true
2761
+ desc '', ''
4192
2762
 
4193
2763
  def upload_cnvrg_image(image_name)
4194
2764
  verify_logged_in(false)
@@ -4198,12 +2768,12 @@ module Cnvrg
4198
2768
 
4199
2769
  path = File.expand_path('~')+"/.cnvrg/tmp/#{image_name}.zip"
4200
2770
  @files = Cnvrg::Files.new("", "")
4201
- # python_arr = Cnvrg::Images.get_installed_packages("python")
4202
- # py = python_arr.join(",") unless python_arr.nil? or python_arr.empty?
4203
- # system_arr = Cnvrg::Images.get_installed_packages("system")
4204
- # sys = system_arr.join(",") unless system_arr.nil? or system_arr.empty?
2771
+ python_arr = Cnvrg::Images.get_installed_packages("python")
2772
+ py = python_arr.join(",") unless python_arr.nil? or python_arr.empty?
2773
+ system_arr = Cnvrg::Images.get_installed_packages("system")
2774
+ sys = system_arr.join(",") unless system_arr.nil? or system_arr.empty?
4205
2775
  # bash_history = Cnvrg::Images.get_bash_history
4206
- res = @files.upload_image(path, image_name, owner, true, true, "", "", "", "Image made by cnvrg.io team", "")
2776
+ res = @files.upload_image(path, image_name, owner, true, true, sys, py, "", "Image made by cnvrg.io team", "")
4207
2777
 
4208
2778
  end
4209
2779
 
@@ -4249,7 +2819,7 @@ module Cnvrg
4249
2819
  end
4250
2820
  end
4251
2821
 
4252
- desc '', '', :hide => true
2822
+ desc '', ''
4253
2823
 
4254
2824
  def download_image(image_name, image_slug)
4255
2825
  begin
@@ -4275,6 +2845,8 @@ module Cnvrg
4275
2845
  end
4276
2846
  end
4277
2847
 
2848
+
2849
+
4278
2850
  return dir_path
4279
2851
 
4280
2852
  else
@@ -4308,13 +2880,13 @@ module Cnvrg
4308
2880
  owner = Cnvrg::CLI.get_owner()
4309
2881
  res = Cnvrg::API.request("users/#{owner}/images/list", 'GET')
4310
2882
  if Cnvrg::CLI.is_response_success(res)
4311
- printf "%-20s %-20s %-30s %-20s %-20s\n", "name", "project", "created by", "is_public", "last updated"
2883
+ printf "%-20s %-20s %-30s %-20s %-20s\n", "name", "project", "created by", "is_public", "last updated"
4312
2884
  res["result"]["images"].each do |u|
4313
2885
  time = Time.parse(u["created_at"])
4314
2886
  update_at = get_local_time(time)
4315
2887
  created_by = u["created_by"]
4316
2888
 
4317
- printf "%-20s %-20s %-30s %-20s %-20s\n", u["name"], u["project"], created_by, u["is_public"], update_at
2889
+ printf "%-20s %-20s %-30s %-20s %-20s\n", u["name"], u["project"], created_by, u["is_public"], update_at
4318
2890
  end
4319
2891
  end
4320
2892
  log_end(0)
@@ -4396,7 +2968,7 @@ module Cnvrg
4396
2968
 
4397
2969
  desc 'pull_image', 'downloads and loads an image'
4398
2970
 
4399
- def pull_image(image_name)
2971
+ def pull(image_name)
4400
2972
  begin
4401
2973
  verify_logged_in(false)
4402
2974
  log_start(__method__, args, options)
@@ -4409,18 +2981,8 @@ module Cnvrg
4409
2981
  path = download_image(image_name, image["slug"])
4410
2982
  if path
4411
2983
  say "Building image", Thor::Shell::Color::BLUE
4412
- Docker.options[:read_timeout]=216000
4413
- image = Docker::Image.build_from_dir(path, {'dockerfile' => 'Dockerfile.cpu', 't' => "#{image_name}:latest"}) do |v|
4414
- begin
4415
- if (log = JSON.parse(v)) && log.has_key?("stream")
4416
- next if log["stream"].starts_with? "Step"
4417
- $stdout.puts log["stream"]
4418
- end
4419
- rescue
4420
- end
4421
-
4422
- end
4423
-
2984
+ Docker.options[:read_timeout]=1200
2985
+ image = Docker::Image.build_from_dir(path, {'dockerfile' => 'Dockerfile', 't' => "#{image_name}:lastest"})
4424
2986
  if not image.nil?
4425
2987
  FileUtils.rm_rf(path)
4426
2988
  checks = Helpers.checkmark()
@@ -4429,13 +2991,11 @@ module Cnvrg
4429
2991
  return image
4430
2992
  log_end(0)
4431
2993
  else
4432
-
4433
2994
  say "Could not build image", Thor::Shell::Color::RED
4434
2995
  log_end(1, "Could build image")
4435
2996
  return false
4436
2997
  end
4437
2998
  else
4438
-
4439
2999
  say "Could not download image", Thor::Shell::Color::RED
4440
3000
  log_end(1, "Could build image")
4441
3001
  return false
@@ -4463,9 +3023,7 @@ module Cnvrg
4463
3023
  #
4464
3024
  # end
4465
3025
  # end
4466
- rescue => e
4467
-
4468
-
3026
+ rescue
4469
3027
  say "Couldn't build image", Thor::Shell::Color::RED
4470
3028
 
4471
3029
  rescue SignalException
@@ -4572,12 +3130,7 @@ module Cnvrg
4572
3130
  if url.nil? or url.empty?
4573
3131
  url = "https://cnvrg.io/api"
4574
3132
  end
4575
- config = YAML.load_file(home_dir+"/.cnvrg/config.yml")
4576
- compression_path = "#{home_dir}/.cnvrg/tmp"
4577
- if config and !config.nil? and !config.empty? and !config.to_h[:compression_path].nil?
4578
- compression_path = config.to_h[:compression_path]
4579
- end
4580
- config = {owner: owner, username: username, version_last_check: get_start_day(), api: url,compression_path:compression_path}
3133
+ config = {owner: owner, username: username, version_last_check: get_start_day(), api: url}
4581
3134
 
4582
3135
  File.open(home_dir+"/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
4583
3136
  return true
@@ -4631,7 +3184,7 @@ module Cnvrg
4631
3184
 
4632
3185
  def log_end(exit_status=0, error=nil)
4633
3186
  begin
4634
- if exit_status != 0
3187
+ if exit_status==1
4635
3188
  $LOG.error exit_status: exit_status, error: error
4636
3189
  else
4637
3190
  $LOG.info exit_status: exit_status
@@ -4643,6 +3196,7 @@ module Cnvrg
4643
3196
  def self.is_response_success(response, should_exit=true)
4644
3197
  if response.nil?
4645
3198
  if !Cnvrg::Helpers.internet_connection?
3199
+ # Cnvrg::CLI.log_end(1,"no internet connection")
4646
3200
  say("<%= color('Error:You seems to be offline', RED) %>")
4647
3201
  else
4648
3202
  say("<%= color('Error', RED) %>")
@@ -4677,26 +3231,12 @@ module Cnvrg
4677
3231
  return owner
4678
3232
  end
4679
3233
  end
4680
-
4681
3234
  def get_base_url
4682
3235
  home_dir = File.expand_path('~')
4683
3236
 
4684
3237
  config = YAML.load_file(home_dir+ "/.cnvrg/config.yml")
4685
3238
  api = config.to_h[:api]
4686
- return api.gsub!("/api", "")
4687
- end
4688
- def get_compression_path
4689
- home_dir = File.expand_path('~')
4690
-
4691
- config = YAML.load_file(home_dir+ "/.cnvrg/config.yml")
4692
- compression_path = config.to_h[:compression_path]
4693
- if compression_path.nil?
4694
- compression_path = "#{home_dir}/.cnvrg/tmp/"
4695
- end
4696
- if !compression_path.ends_with? "/"
4697
- compression_path = compression_path + "/"
4698
- end
4699
- return compression_path
3239
+ return api.gsub!("/api","")
4700
3240
  end
4701
3241
 
4702
3242
  def get_project_home
@@ -4750,6 +3290,7 @@ module Cnvrg
4750
3290
  end
4751
3291
  $LOG = LogStashLogger.new(type: :file, path: logfile, sync: true)
4752
3292
  rescue => e
3293
+ # puts e
4753
3294
  end
4754
3295
  end
4755
3296
 
@@ -4777,9 +3318,6 @@ module Cnvrg
4777
3318
 
4778
3319
  config = YAML.load_file(File.expand_path('~')+"/.cnvrg/config.yml")
4779
3320
  version_date = config.to_h[:version_last_check]
4780
- if version_date.nil?
4781
- version_date = get_start_day()
4782
- end
4783
3321
  next_day = get_start_day+ 86399
4784
3322
  if not (version_date..next_day).cover?(Time.now)
4785
3323
  if should_update_version()
@@ -4805,15 +3343,11 @@ module Cnvrg
4805
3343
  def is_cnvrg_dir(dir=Dir.pwd)
4806
3344
  current_dir = dir
4807
3345
  home_dir = File.expand_path('~')
4808
- if current_dir.eql? home_dir
4809
- return false
4810
- end
4811
3346
  is_cnvrg = Dir.exist? current_dir+"/.cnvrg"
4812
3347
  until is_cnvrg == true
4813
3348
  current_dir = File.expand_path("..", current_dir)
4814
3349
  is_cnvrg = Dir.exist? current_dir+"/.cnvrg"
4815
- if ((File.expand_path("..", current_dir).eql? home_dir) or current_dir.eql? home_dir or current_dir.eql? "/") and !is_cnvrg
4816
- is_cnvrg = false
3350
+ if File.expand_path("..", current_dir).eql? home_dir
4817
3351
  break
4818
3352
  end
4819
3353
  end
@@ -4824,19 +3358,6 @@ module Cnvrg
4824
3358
  end
4825
3359
  end
4826
3360
 
4827
- def data_dir_include()
4828
- all_dirs = Dir.glob("**/*/", File::FNM_DOTMATCH)
4829
- all_dirs.flatten!
4830
- all_dirs.each do |a|
4831
- if a.include? "/.cnvrg"
4832
- ignore = File.dirname(a)
4833
- return ignore
4834
- end
4835
- end
4836
- return nil
4837
-
4838
- end
4839
-
4840
3361
  def verify_software_installed(software)
4841
3362
  begin
4842
3363
  install_url = Cnvrg::CLI::INSTALLATION_URLS[software.to_sym]
@@ -5012,151 +3533,8 @@ module Cnvrg
5012
3533
 
5013
3534
  end
5014
3535
 
5015
- def update_deleted(deleted)
5016
- final = []
5017
- deleted.each do |d|
5018
- all_subs = d.split("/")
5019
- to_add = true
5020
- value = all_subs[0]
5021
- all_subs.each_with_index do |a, i|
5022
- if final.include? value+"/"
5023
- to_add = false
5024
- break
5025
- end
5026
- value = value+"/"+all_subs[i+1] if i <all_subs.size-1
5027
- end
5028
- final << d if to_add
5029
-
5030
-
5031
- end
5032
-
5033
-
5034
- return final
5035
- end
5036
-
5037
- def get_cmd_path_in_dir(main_dir, sub_dir)
5038
- first = Pathname.new main_dir
5039
- second = Pathname.new sub_dir
5040
- relative = second.relative_path_from first
5041
- if relative.eql? "."
5042
- return ""
5043
- else
5044
- return relative
5045
- end
5046
- end
5047
-
5048
- def create_tar(path_in, path_out, tar_files,no_compression=false)
5049
- #The cd is meant for cases when running cnvrg data uplaod not in the main folder
5050
- begin
5051
- if no_compression
5052
- `cd #{path_in} && tar -cf #{path_out} -T #{tar_files}`
5053
- else
5054
- `cd #{path_in} && tar -czf #{path_out} -T #{tar_files}`
5055
- end
5056
- rescue => e
5057
- puts "Exception while compressing data: #{e.message}"
5058
- end
5059
-
5060
- return $?.success?
5061
- end
5062
-
5063
- def extarct_tar(file_path, dir_path)
5064
- `tar -xvf #{file_path} -C #{dir_path} > /dev/null 2>&1`
5065
- return $?.success?
5066
- end
5067
- def cpu_usage
5068
- cpu_usage = 0.0
5069
- begin
5070
- cpu = `top b -n 2 -d 2 |grep %Cpu |tail -1 |awk '{print $2+$3}'`
5071
- if !cpu.nil?
5072
- cpu_usage = cpu.to_f
5073
- end
5074
- rescue
5075
- cpu_usage = 0.0
5076
- end
5077
-
5078
- return cpu_usage
5079
- end
5080
- def memory_usage
5081
- prec = 0.0
5082
- begin
5083
- used = `free -mt |grep Mem: |awk '{print $3}'`
5084
- total = `free -mt |grep Mem: |awk '{print $2}'`
5085
-
5086
- used_f = used.to_f if !used.nil?
5087
- total_f = total.to_f if !total.nil?
5088
- prec = (used_f / total_f)*100
5089
- prec = prec.round(2)
5090
- rescue
5091
- prec = 0.0
5092
- end
5093
- return prec
5094
-
5095
-
5096
- end
5097
- def gpu_util
5098
- gpu = [0.0, 0.0]
5099
- begin
5100
- gpu_stats = `nvidia-smi --query-gpu=utilization.gpu,utilization.memory --format=csv |tail -1`
5101
-
5102
- if !gpu_stats.nil?
5103
- gpu = gpu_stats.strip
5104
- gpu = gpu_stats.gsub!("%","").split(",")
5105
- gpu[0] = gpu[0].to_f
5106
- gpu[1] = gpu[1].to_f
5107
- return gpu
5108
- end
5109
-
5110
- rescue
5111
- return gpu
5112
- end
5113
-
5114
-
5115
- end
5116
- def usage_metrics_in_docker(docker_id)
5117
- res = [0.0,0.0]
5118
- begin
5119
- if docker_id.nil?
5120
- docker_id = `cat /etc/hostname`
5121
- end
5122
- stats = `sudo docker stats #{docker_id} --no-stream --format "{{.CPUPerc}},{{.MemPerc}},{{.BlockIO}}"`
5123
- if !stats.nil?
5124
- conv = stats.split(",")
5125
- cpu = conv[0].gsub!("%","").to_f
5126
- memory = conv[1].gsub!("%","").to_f
5127
- res = [cpu,memory]
5128
- return res
5129
- end
5130
- rescue
5131
- return res
5132
- end
5133
-
5134
-
5135
-
5136
- end
5137
-
5138
- def with_progress_bar
5139
- not_done = true
5140
- upload_progress_bar = ProgressBar.create(:title => "Upload progress",
5141
- :format => '%a <%B> %p%% %t',
5142
- :starting_at => 0,
5143
- :total => 600)
5144
- pb = Thread.new do
5145
- while not_done do
5146
- upload_progress_bar.increment
5147
- sleep(1)
5148
-
5149
- end
5150
- end
5151
3536
 
5152
- yield.tap do # After yielding to the block, save the return value
5153
- not_done = false # Tell the thread to exit, cleaning up after itself…
5154
- pb.join # …and wait for it to do so.
5155
- end
5156
- end
5157
3537
  end
5158
-
5159
-
5160
3538
  end
5161
3539
  end
5162
3540