cnvrg 0.0.15 → 0.0.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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