cnvrg 0.3.6 → 0.3.8

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.
@@ -5,7 +5,7 @@ module Cnvrg
5
5
 
6
6
  RemoteURL ||= "https://cnvrg.io"
7
7
  IDXParallelThreads ||= 15
8
-
8
+ IDXParallelProcesses ||= Parallel.processor_count
9
9
 
10
10
  def initialize(project_home)
11
11
  begin
@@ -18,7 +18,12 @@ module Cnvrg
18
18
  rescue => e
19
19
 
20
20
  end
21
+ end
21
22
 
23
+
24
+ def self.delete(dataset_slug,owner)
25
+ response = Cnvrg::API.request("users/#{owner}/datasets/#{dataset_slug}/delete", 'DELETE')
26
+ return response
22
27
  end
23
28
 
24
29
  def last_local_commit
@@ -50,6 +55,26 @@ module Cnvrg
50
55
  "#{url}/#{self.owner}/projects/#{self.slug}"
51
56
  end
52
57
 
58
+ def self.verify_cnvrgignore_exist(dataset_name,remote)
59
+ path = ".cnvrgignore"
60
+ if !File.exist? path
61
+ path = "#{dataset_name}/.cnvrgignore"
62
+ end
63
+ ignore_exits = File.exist? path
64
+ if !ignore_exits
65
+ begin
66
+ list_files = [
67
+ path
68
+ ]
69
+ FileUtils.touch list_files
70
+ cnvrgignore = Helpers.cnvrgignore_content
71
+ File.open(path, "w+") { |f| f.write cnvrgignore }
72
+ rescue => e
73
+ return false
74
+ end
75
+
76
+ end
77
+ end
53
78
  def update_ignore_list(new_ignore)
54
79
 
55
80
  if new_ignore.nil? or new_ignore.empty?
@@ -97,9 +122,14 @@ module Cnvrg
97
122
  list_dirs = [".cnvrg"
98
123
  ]
99
124
  list_files = [
100
- ".cnvrgignore",
101
125
  ".cnvrg/config.yml"
102
126
  ]
127
+ create_ignore = false
128
+ if !File.exist? ".cnvrgignore"
129
+ list_files << ".cnvrgignore"
130
+ create_ignore = true
131
+ end
132
+
103
133
 
104
134
  cnvrgignore = Helpers.cnvrgignore_content
105
135
  begin
@@ -111,22 +141,30 @@ module Cnvrg
111
141
  config = {dataset_name: dataset_name,
112
142
  dataset_slug: dataset_slug,
113
143
  owner: owner}
144
+
114
145
  FileUtils.mkdir_p list_dirs
115
146
  FileUtils.touch list_files
116
147
  File.open(".cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
117
- File.open(".cnvrgignore", "w+") { |f| f.write cnvrgignore } unless File.exist? ".cnvrgignore"
148
+ File.open(".cnvrgignore", "w+") { |f| f.write cnvrgignore } unless !create_ignore
118
149
  rescue => e
119
150
  return false
120
151
  end
121
152
  return true
122
153
  end
154
+
155
+
156
+ def clone( commit)
157
+
158
+
159
+ return response
160
+ end
161
+
123
162
  def self.clone(owner, dataset_name,dataset_slug)
124
163
 
125
164
  begin
126
165
  list_dirs = [ dataset_name, "#{dataset_name}/.cnvrg"
127
166
  ]
128
167
  list_files = [
129
- "#{dataset_name}/.cnvrgignore",
130
168
  "#{dataset_name}/.cnvrg/config.yml"
131
169
  ]
132
170
 
@@ -135,11 +173,9 @@ module Cnvrg
135
173
  owner: owner}
136
174
 
137
175
 
138
- cnvrgignore = Helpers.cnvrgignore_content
139
176
  FileUtils.mkdir_p list_dirs
140
177
  FileUtils.touch list_files
141
178
  File.open("#{dataset_name}/.cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
142
- File.open("#{dataset_name}/.cnvrgignore", "w+") { |f| f.write cnvrgignore } unless File.exist? ".cnvrgignore"
143
179
  rescue => e
144
180
  puts "Exception in clone request:#{e.message}"
145
181
  return false
@@ -189,11 +225,8 @@ module Cnvrg
189
225
 
190
226
  tree_idx = Hash.new(0)
191
227
 
192
- list = Dir.glob("#{self.local_path}/**/**", File::FNM_DOTMATCH).reject { |x| (x =~ /\/\.{1,2}$/) or (x =~ /^#{self.local_path}\/\.cnvrg\/*/) }
193
- if list_ignore.nil?
228
+ list = Dir.glob("#{self.local_path}/**/*", File::FNM_DOTMATCH).reject { |x| (x =~ /\/\.{1,2}$/) or (x =~ /^#{self.local_path}\/\.cnvrg\/*/) or (x =~/^#{self.local_path}\/\.cnvrgignore.conflict*/) and not (x =~/^#{self.local_path}\/\.cnvrgignore/) }
194
229
  list_ignore = self.get_ignore_list()
195
- end
196
-
197
230
  Parallel.map(list, in_threads: IDXParallelThreads) do |e|
198
231
  label = e.gsub(self.local_path + "/", "")
199
232
  if File.directory? e
@@ -215,11 +248,16 @@ module Cnvrg
215
248
  end
216
249
  end
217
250
  end
251
+ if !old_idx.nil? and !old_idx[:next_commit].nil? and !old_idx[:next_commit].empty?
252
+ idx = {commit: old_idx.to_h[:commit], tree: tree_idx, next_commit:old_idx[:next_commit] }
253
+ else
254
+ idx = {commit: old_idx.to_h[:commit], tree: tree_idx}
218
255
 
219
- idx = {commit: old_idx.to_h[:commit], tree: tree_idx}
256
+ end
257
+ idx_yaml = idx.to_yaml
220
258
 
221
- File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') { |f| f.write idx.to_yaml }
222
- return YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
259
+ File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') { |f| f.write idx_yaml }
260
+ return idx
223
261
  end
224
262
  def create_volume
225
263
  response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/volumes/create", 'POST')
@@ -233,17 +271,45 @@ module Cnvrg
233
271
  CLI.is_response_success(response,false)
234
272
  return response
235
273
  end
236
- def compare_idx(new_branch, commit=last_local_commit,local_idx=nil)
274
+ def compare_idx(new_branch, commit=last_local_commit,local_idx=nil,force = false, next_commit = nil)
275
+ if local_idx.nil?
276
+ local_idx = self.generate_idx
277
+ end
278
+ ignore_list = self.get_ignore_list()
279
+ if force
280
+ added = []
281
+ if local_idx[:tree]
282
+ added << local_idx[:tree].keys
283
+ added.flatten!
284
+ end
237
285
 
286
+ response ={"result"=> {"commit"=>next_commit,"tree"=> {"added"=> added,
287
+ "updated_on_server"=> [],
288
+ "updated_on_local"=> [],
289
+ "deleted"=> [],
290
+ "conflicts"=> []} } }
291
+ return response
292
+
293
+ end
294
+ response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/status", 'POST', {idx: local_idx, new_branch: new_branch, current_commit: commit, ignore:ignore_list, next_commit: next_commit})
295
+ CLI.is_response_success(response,false)
296
+ return response
297
+ end
298
+ def compare_idx_download(commit=last_local_commit,local_idx=nil,all=false)
238
299
  if local_idx.nil?
239
300
  local_idx = self.generate_idx
240
301
  end
241
302
  ignore_list = self.send_ignore_list()
242
-
243
- response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/status", 'POST', {idx: local_idx, new_branch: new_branch, current_commit: commit, ignore:ignore_list})
303
+ response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/download_status", 'POST', {idx: local_idx, current_commit: commit, ignore:ignore_list,all_files:all})
244
304
  CLI.is_response_success(response,false)
245
305
  return response
246
306
  end
307
+ def current_status(new_branch)
308
+ commit=last_local_commit
309
+ response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/status_current", 'POST', {current_commit: commit,new_branch: new_branch})
310
+ CLI.is_response_success(response,true)
311
+ return response
312
+ end
247
313
  def send_ignore_list()
248
314
  begin
249
315
  ignore_list = []
@@ -277,7 +343,45 @@ module Cnvrg
277
343
  CLI.is_response_success(response,false)
278
344
  return response
279
345
  end
346
+ def set_next_commit(commit_sha1)
347
+ if !File.exist? "#{self.local_path}/.cnvrg/idx.yml"
348
+ idx_hash = Hash.new()
349
+ idx_hash[:commit] = ""
350
+ idx_hash[:tree] = ""
351
+ else
352
+ idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
280
353
 
354
+ end
355
+ idx_hash[:next_commit] = commit_sha1
356
+ File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') { |f| f.write idx_hash.to_yaml }
357
+ return true
358
+
359
+ end
360
+ def get_next_commit()
361
+ if !File.exist? "#{self.local_path}/.cnvrg/idx.yml"
362
+ return nil
363
+ end
364
+ idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
365
+ return idx_hash[:next_commit]
366
+
367
+ end
368
+ def remove_next_commit()
369
+ if !File.exist? "#{self.local_path}/.cnvrg/idx.yml"
370
+ return nil
371
+ end
372
+ idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
373
+ idx = Hash.new()
374
+ idx[:commit] = idx_hash[:next_commit]
375
+ idx[:tree] = idx_hash[:tree]
376
+ File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') { |f| f.write idx.to_yaml }
377
+
378
+
379
+ end
380
+ def list_files(commit, json)
381
+ response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/list", 'GET', {commit_sha1:commit, as_json:json})
382
+ CLI.is_response_success(response,true)
383
+ return response
384
+ end
281
385
  def compare_commit(commit)
282
386
  if commit.nil? or commit.empty?
283
387
  commit = last_local_commit
@@ -289,11 +393,14 @@ module Cnvrg
289
393
  end
290
394
 
291
395
  def update_idx_with_files_commits!(files, commit_time)
292
-
396
+ files.flatten!
293
397
  idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
398
+ # idx_hash[:commit] = commit
399
+
294
400
  files.each do |path|
295
401
  idx_hash[:tree].to_h[path].to_h[:commit_time] = commit_time
296
402
  end
403
+ idx_hash[:next_commit] = idx_hash[:next_commit]
297
404
  File.open("#{self.local_path}/.cnvrg/idx.yml", 'w') { |f| f.write idx_hash.to_yaml }
298
405
 
299
406
  return true
@@ -83,7 +83,7 @@ module Cnvrg
83
83
 
84
84
  end
85
85
 
86
- def exec_remote(command, commit_to_run, instance_type, image_slug,scheduling_query,local_timestamp, grid,path_to_cmd,data, data_commit)
86
+ def exec_remote(command, commit_to_run, instance_type, image_slug,scheduling_query,local_timestamp, grid,path_to_cmd,data, data_commit,periodic_sync, sync_before_terminate, max_time, ds_sync_options=0)
87
87
  response = Cnvrg::API.request("users/#{@owner}/projects/#{@project_slug}/experiment/remote", 'POST', {command: command, image_slug: image_slug,
88
88
  commit_sha1: commit_to_run,
89
89
  instance_type: instance_type,
@@ -91,12 +91,15 @@ module Cnvrg
91
91
  local_timestamp:local_timestamp,
92
92
  grid: grid,
93
93
  path_to_cmd:path_to_cmd,dataset_slug:data,
94
- dataset_commit: data_commit})
94
+ dataset_commit: data_commit,max_time:max_time,
95
+ periodic_sync:periodic_sync, sync_before_terminate:sync_before_terminate,
96
+ dataset_sync_options:ds_sync_options})
95
97
  return response
96
98
  end
97
- def remote_notebook(instance_type, commit, data, data_commit, notebook_type)
99
+ def remote_notebook(instance_type, commit, data, data_commit, notebook_type,ds_sync_options=0)
98
100
  response = Cnvrg::API.request("users/#{@owner}/projects/#{@project_slug}/notebook/remote", 'POST', {instance_type: instance_type,dataset_slug:data,
99
- dataset_commit: data_commit,commit:commit,notebook_type:notebook_type})
101
+ dataset_commit: data_commit,
102
+ commit:commit,notebook_type:notebook_type,dataset_sync_options:ds_sync_options})
100
103
  return response
101
104
  end
102
105
 
@@ -59,8 +59,8 @@ module Cnvrg
59
59
  file_name: file_name, log_date: log_date,
60
60
  file_size: file_size, file_content_type: content_type})
61
61
  if Cnvrg::CLI.is_response_success(upload_resp, false)
62
- path = upload_resp["result"]["path"]
63
- s3_res = upload_small_files_s3(path, absolute_path, "text/plain")
62
+ s3_res = upload_large_files_s3(upload_resp, absolute_path)
63
+
64
64
  end
65
65
  if s3_res
66
66
  return true
@@ -130,8 +130,7 @@ module Cnvrg
130
130
  is_base: is_base})
131
131
  # puts upload_resp
132
132
  if Cnvrg::CLI.is_response_success(upload_resp, false)
133
- path = upload_resp["result"]["path"]
134
- s3_res = upload_small_files_s3(path, absolute_path, content_type)
133
+ s3_res = upload_large_files_s3(upload_resp, absolute_path)
135
134
  if s3_res
136
135
  commit_resp = Cnvrg::API.request("users/#{owner}/images/#{upload_resp["result"]["id"]}/" + "commit", 'GET')
137
136
  if Cnvrg::CLI.is_response_success(commit_resp, false)
@@ -161,6 +160,7 @@ module Cnvrg
161
160
  })
162
161
  # puts upload_resp
163
162
  if Cnvrg::CLI.is_response_success(upload_resp, false)
163
+ path = upload_resp["result"]["path"]
164
164
  s3_res = upload_large_files_s3(upload_resp, absolute_path)
165
165
  if s3_res
166
166
  return true
@@ -254,50 +254,14 @@ module Cnvrg
254
254
 
255
255
  def upload_large_files_s3(upload_resp, file_path)
256
256
  begin
257
- # speed_uri = URI.parse("https://s3-us-west-2.amazonaws.com/cnvrgw2-dev/speedtest-cli")
258
- # speed_http_object = Net::HTTP.new(speed_uri.host, speed_uri.port)
259
- # speed_http_object.use_ssl = true if speed_uri.scheme == 'https'
260
- # speed_request = Net::HTTP::Get.new("https://s3-us-west-2.amazonaws.com/cnvrgw2-dev/speedtest-cli")
261
- #
262
- # speed_body = ""
263
- # speed_http_object.start do |http|
264
- # response = http.request speed_request
265
- # speed_body = response.read_body
266
- # end
267
- # speed_tmp = Tempfile.new('speed')
268
- # speed_tmp << speed_body
269
- # speed_tmp.flush
270
- # speed_tmp.close
271
- # count = 0
272
- # sum = 0
273
- # speed_res = `python #{speed_tmp.path} --json`
274
- # if !speed_res.nil? and !speed_res.empty?
275
- # upload = JSON.parse(speed_res)["upload"]
276
- # if !upload.nil?
277
- # up_spped = (upload/1000000).round(2)
278
- # end
279
- #
280
- #
281
- # file_size = File.size(file_path)/1048576
282
- # est_up = ((file_size*8)/up_spped)/60
283
- # puts est_up
284
- # end
285
-
286
-
287
257
  sts_path = upload_resp["result"]["path_sts"]
288
258
 
289
- uri = URI.parse(sts_path)
290
- http_object = Net::HTTP.new(uri.host, uri.port)
291
- http_object.use_ssl = true if uri.scheme == 'https'
292
- http_object.ssl_version="TLSv1"
293
-
294
- request = Net::HTTP::Get.new(sts_path)
295
-
296
- body = ""
297
- http_object.start do |http|
298
- response = http.request request
299
- body = response.read_body
259
+ if !Helpers.is_verify_ssl
260
+ body = open(sts_path, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}).read
261
+ else
262
+ body = open(sts_path).read
300
263
  end
264
+
301
265
  split = body.split("\n")
302
266
  key = split[0]
303
267
  iv = split[1]
@@ -310,18 +274,30 @@ module Cnvrg
310
274
  region = Cnvrg::Helpers.decrypt(key,iv, upload_resp["result"]["region"])
311
275
 
312
276
  bucket = Cnvrg::Helpers.decrypt(key,iv, upload_resp["result"]["bucket"])
313
-
277
+ is_s3 = upload_resp["result"]["is_s3"]
278
+ if is_s3 or is_s3.nil?
279
+ use_accelerate_endpoint =true
314
280
  client = Aws::S3::Client.new(
315
281
  :access_key_id =>access,
316
282
  :secret_access_key => secret,
317
283
  :session_token => session,
318
284
  :region => region,
319
- :http_open_timeout => 60, :retry_limit => 20
320
- )
285
+ :http_open_timeout => 60, :retry_limit => 20)
286
+ else
287
+ endpoint = Cnvrg::Helpers.decrypt(key,iv, upload_resp["result"]["endpoint"])
288
+ use_accelerate_endpoint = false
289
+ client = Aws::S3::Client.new(
290
+ :access_key_id =>access,
291
+ :secret_access_key => secret,
292
+ :region => region,
293
+ :endpoint=> endpoint,:force_path_style=> true,:ssl_verify_peer=>false,
294
+ :http_open_timeout => 60, :retry_limit => 20)
295
+ end
296
+
321
297
  s3 = Aws::S3::Resource.new(client: client)
322
298
  resp = s3.bucket(bucket).
323
299
  object(upload_resp["result"]["path"]+"/"+File.basename(file_path)).
324
- upload_file(file_path, {:use_accelerate_endpoint => true, :server_side_encryption => 'AES256'})
300
+ upload_file(file_path, {:use_accelerate_endpoint => use_accelerate_endpoint, :server_side_encryption => 'AES256'})
325
301
 
326
302
  return resp
327
303
 
@@ -344,6 +320,9 @@ module Cnvrg
344
320
  body = file.read
345
321
  begin
346
322
  Net::HTTP.start(url.host) do |http|
323
+ if !Helpers.is_verify_ssl
324
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
325
+ end
347
326
  http.send_request("PUT", url.request_uri, body, {
348
327
  "content-type" => content_type,
349
328
  })
@@ -394,15 +373,10 @@ module Cnvrg
394
373
 
395
374
  absolute_path += ".conflict" if conflict
396
375
  sts_path = download_resp["result"]["path_sts"]
397
- uri = URI.parse(sts_path)
398
- http_object = Net::HTTP.new(uri.host, uri.port)
399
- http_object.use_ssl = true if uri.scheme == 'https'
400
- request = Net::HTTP::Get.new(sts_path)
401
-
402
- body = ""
403
- http_object.start do |http|
404
- response = http.request request
405
- body = response.read_body
376
+ if !Helpers.is_verify_ssl
377
+ body = open(sts_path, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}).read
378
+ else
379
+ body = open(sts_path).read
406
380
  end
407
381
  split = body.split("\n")
408
382
  key = split[0]
@@ -416,18 +390,29 @@ module Cnvrg
416
390
  region = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["region"])
417
391
 
418
392
  bucket = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["bucket"])
419
- key = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["key"])
393
+ file_key = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["key"])
394
+
395
+ is_s3 = download_resp["result"]["is_s3"]
396
+ if is_s3 or is_s3.nil?
397
+ client = Aws::S3::Client.new(
398
+ :access_key_id =>access,
399
+ :secret_access_key => secret,
400
+ :session_token => session,
401
+ :region => region,
402
+ :http_open_timeout => 60, :retry_limit => 20)
403
+ else
404
+ endpoint = Cnvrg::Helpers.decrypt(key,iv, download_resp["result"]["endpoint_url"])
405
+ client = Aws::S3::Client.new(
406
+ :access_key_id =>access,
407
+ :secret_access_key => secret,
408
+ :region => region,
409
+ :endpoint=> endpoint,:force_path_style=> true,:ssl_verify_peer=>false,
410
+ :http_open_timeout => 60, :retry_limit => 20)
411
+ end
420
412
 
421
- client = Aws::S3::Client.new(
422
- :access_key_id =>access,
423
- :secret_access_key => secret,
424
- :session_token => session,
425
- :region => region,
426
- :http_open_timeout => 60, :retry_limit => 20
427
- )
428
413
  File.open(project_home+"/"+absolute_path, 'w+') do |file|
429
414
  resp = client.get_object({bucket:bucket,
430
- key:key}, target: file)
415
+ key:file_key}, target: file)
431
416
  end
432
417
  return true
433
418
  end