hahunavth commited on
Commit
2b0538d
1 Parent(s): edf61c6

update v1.0.1

Browse files
.gitignore CHANGED
@@ -1 +1,2 @@
1
- tmp
 
 
1
+ tmp
2
+ __pycache__
__pycache__/google_sheet.cpython-310.pyc DELETED
Binary file (3.07 kB)
 
__pycache__/kaggle_service.cpython-310.pyc DELETED
Binary file (15.4 kB)
 
__pycache__/logger.cpython-310.pyc DELETED
Binary file (2.17 kB)
 
google_sheet.py CHANGED
@@ -51,10 +51,11 @@ def create_repositories():
51
 
52
  config_repository = SheetCRUDRepository(sheet.get_worksheet(0))
53
  log_repository = SheetCRUDRepository(sheet.get_worksheet(1))
54
- return config_repository, log_repository
 
55
 
56
 
57
- conf_repo, log_repo = create_repositories()
58
 
59
 
60
  if __name__ == "__main__":
 
51
 
52
  config_repository = SheetCRUDRepository(sheet.get_worksheet(0))
53
  log_repository = SheetCRUDRepository(sheet.get_worksheet(1))
54
+ secret_repository = SheetCRUDRepository(sheet.get_worksheet(2))
55
+ return config_repository, log_repository, secret_repository
56
 
57
 
58
+ conf_repo, log_repo, secret_repo = create_repositories()
59
 
60
 
61
  if __name__ == "__main__":
kaggle_service.py CHANGED
@@ -44,6 +44,83 @@ class KaggleApiWrapper(KaggleApi):
44
  # todo: fix bug when delete api
45
  pass
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
  class ValidateException(Exception):
49
  def __init__(self, message: str):
@@ -309,14 +386,16 @@ class NbJob:
309
  sheet_logger.log(username=api.username, nb=self.nb_slug, log="Try but no effect. Seem account to be out of quota")
310
  return False
311
  if status3 in self.not_rerun_stt:
312
- sheet_logger.log(username=api.username, nb=self.nb_slug, log=f"Notebook status is {status3} is in ignore status list {self.not_rerun_stt}, do nothing!")
 
 
313
  return True
314
  if status3 not in ["queued", "running"]:
315
  # return False # todo: check when user is out of quota
316
  print(f"Error: status is {status3}")
 
317
  raise Exception("Setup exception")
318
- sheet_logger.log(username=api.username, nb=self.nb_slug,
319
- log=f"Schedule notebook successfully. Current status is '{status3}'")
320
  return True
321
 
322
  sheet_logger.log(username=api.username, nb=self.nb_slug, log=f"Notebook status is '{status1}' is not in {self.rerun_stt}, do nothing!")
@@ -428,16 +507,16 @@ class KernelRerunService:
428
  print(f"Job: {job.nb_slug} {success}")
429
 
430
 
431
- if __name__ == "__main__":
432
- service = KernelRerunService()
433
- files = os.listdir("./config")
434
- for file in files:
435
- if '.example' not in file:
436
- with open(os.path.join("./config", file), "r") as f:
437
- obj = json.loads(f.read())
438
- print(obj)
439
- service.add_job(NbJob.from_dict(obj))
440
- service.run_all()
441
 
442
  # try:
443
  # acc_secret_dict = {
 
44
  # todo: fix bug when delete api
45
  pass
46
 
47
+ # def get_accelerator_quota_with_http_info(self): # noqa: E501
48
+ # """
49
+ #
50
+ # This method makes a synchronous HTTP request by default. To make an
51
+ # asynchronous HTTP request, please pass async_req=True
52
+ # >>> thread = api.competitions_list_with_http_info(async_req=True)
53
+ # >>> result = thread.get()
54
+ #
55
+ # :param async_req bool
56
+ # :param str group: Filter competitions by a particular group
57
+ # :param str category: Filter competitions by a particular category
58
+ # :param str sort_by: Sort the results
59
+ # :param int page: Page number
60
+ # :param str search: Search terms
61
+ # :return: Result
62
+ # If the method is called asynchronously,
63
+ # returns the request thread.
64
+ # """
65
+ #
66
+ # all_params = [] # noqa: E501
67
+ # all_params.append('async_req')
68
+ # all_params.append('_return_http_data_only')
69
+ # all_params.append('_preload_content')
70
+ # all_params.append('_request_timeout')
71
+ #
72
+ # params = locals()
73
+ #
74
+ # collection_formats = {}
75
+ #
76
+ # path_params = {}
77
+ #
78
+ # query_params = []
79
+ # # if 'group' in params:
80
+ # # query_params.append(('group', params['group'])) # noqa: E501
81
+ # # if 'category' in params:
82
+ # # query_params.append(('category', params['category'])) # noqa: E501
83
+ # # if 'sort_by' in params:
84
+ # # query_params.append(('sortBy', params['sort_by'])) # noqa: E501
85
+ # # if 'page' in params:
86
+ # # query_params.append(('page', params['page'])) # noqa: E501
87
+ # # if 'search' in params:
88
+ # # query_params.append(('search', params['search'])) # noqa: E501
89
+ #
90
+ # header_params = {}
91
+ #
92
+ # form_params = []
93
+ # local_var_files = {}
94
+ #
95
+ # body_params = None
96
+ # # HTTP header `Accept`
97
+ # header_params['Accept'] = self.api_client.select_header_accept(
98
+ # ['application/json']) # noqa: E501
99
+ #
100
+ # # Authentication setting
101
+ # auth_settings = ['basicAuth'] # noqa: E501
102
+ #
103
+ # return self.api_client.call_api(
104
+ # 'i/kernels.KernelsService/GetAcceleratorQuotaStatistics', 'GET',
105
+ # # '/competitions/list', 'GET',
106
+ # path_params,
107
+ # query_params,
108
+ # header_params,
109
+ # body=body_params,
110
+ # post_params=form_params,
111
+ # files=local_var_files,
112
+ # response_type='Result', # noqa: E501
113
+ # auth_settings=auth_settings,
114
+ # async_req=params.get('async_req'),
115
+ # _return_http_data_only=params.get('_return_http_data_only'),
116
+ # _preload_content=params.get('_preload_content', True),
117
+ # _request_timeout=params.get('_request_timeout'),
118
+ # collection_formats=collection_formats)
119
+ #
120
+ # if __name__ == "__main__":
121
+ # api = KaggleApiWrapper('ha.vt194547@sis.hust.edu.vn', "c54e96568075fcc277bd10ba0e0a52b9")
122
+ # api.authenticate()
123
+ # print(api.get_accelerator_quota_with_http_info())
124
 
125
  class ValidateException(Exception):
126
  def __init__(self, message: str):
 
386
  sheet_logger.log(username=api.username, nb=self.nb_slug, log="Try but no effect. Seem account to be out of quota")
387
  return False
388
  if status3 in self.not_rerun_stt:
389
+ # sheet_logger.log(username=api.username, nb=self.nb_slug, log=f"Notebook status is {status3} is in ignore status list {self.not_rerun_stt}, do nothing!")
390
+ sheet_logger.log(username=api.username, nb=self.nb_slug,
391
+ log=f"Schedule notebook successfully. Current status is '{status3}'")
392
  return True
393
  if status3 not in ["queued", "running"]:
394
  # return False # todo: check when user is out of quota
395
  print(f"Error: status is {status3}")
396
+
397
  raise Exception("Setup exception")
398
+
 
399
  return True
400
 
401
  sheet_logger.log(username=api.username, nb=self.nb_slug, log=f"Notebook status is '{status1}' is not in {self.rerun_stt}, do nothing!")
 
507
  print(f"Job: {job.nb_slug} {success}")
508
 
509
 
510
+ # if __name__ == "__main__":
511
+ # service = KernelRerunService()
512
+ # files = os.listdir("./config")
513
+ # for file in files:
514
+ # if '.example' not in file:
515
+ # with open(os.path.join("./config", file), "r") as f:
516
+ # obj = json.loads(f.read())
517
+ # print(obj)
518
+ # service.add_job(NbJob.from_dict(obj))
519
+ # service.run_all()
520
 
521
  # try:
522
  # acc_secret_dict = {
logger.py CHANGED
@@ -1,8 +1,7 @@
1
  import platform,socket,re,uuid,json,psutil,logging
2
  from datetime import datetime as dt
3
  from google_sheet import log_repo, conf_repo, SheetCRUDRepository
4
-
5
- version="v1.0.0"
6
 
7
 
8
  def get_sys_info():
@@ -34,7 +33,7 @@ class SheetLogger:
34
  "kaggle_username": username,
35
  "log": log,
36
  "device": str(get_sys_info()),
37
- "version": version
38
  })
39
 
40
  def update_job_status(self, row, validate_status: str = None, notebook_status: str = None):
 
1
  import platform,socket,re,uuid,json,psutil,logging
2
  from datetime import datetime as dt
3
  from google_sheet import log_repo, conf_repo, SheetCRUDRepository
4
+ from version import VERSION
 
5
 
6
 
7
  def get_sys_info():
 
33
  "kaggle_username": username,
34
  "log": log,
35
  "device": str(get_sys_info()),
36
+ "version": VERSION
37
  })
38
 
39
  def update_job_status(self, row, validate_status: str = None, notebook_status: str = None):
main.py CHANGED
@@ -1,4 +1,4 @@
1
- from google_sheet import conf_repo
2
  import json
3
 
4
  from kaggle_service import KernelRerunService, NbJob
@@ -6,23 +6,81 @@ from logger import sheet_logger
6
 
7
 
8
  if __name__ == "__main__":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  configs = []
10
  ids = []
11
  try:
12
- for i in range(2, 256):
13
  rs = conf_repo.read(i)
14
  if not rs:
15
  break
 
 
 
 
 
 
 
 
 
16
  try:
 
 
 
 
 
 
 
 
17
  cfg = json.loads(rs['config'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  configs.append(cfg)
19
  ids.append(i)
20
  print(cfg)
21
- except Exception as e:
22
- sheet_logger.update_job_status(i, validate_status=str(e))
23
- except Exception as e:
24
- sheet_logger.log(log="Get config failed!!" + str(e))
 
 
25
 
 
26
  service = KernelRerunService()
27
  for config, idx in zip(configs, ids):
28
  try:
@@ -30,6 +88,7 @@ if __name__ == "__main__":
30
  except Exception as e:
31
  sheet_logger.update_job_status(idx, validate_status=str(e))
32
 
 
33
  try:
34
  service.validate_all()
35
  # service.status_all()
@@ -37,3 +96,4 @@ if __name__ == "__main__":
37
  except Exception as e:
38
  sheet_logger.log(log=str(e))
39
 
 
 
1
+ from google_sheet import conf_repo, secret_repo
2
  import json
3
 
4
  from kaggle_service import KernelRerunService, NbJob
 
6
 
7
 
8
  if __name__ == "__main__":
9
+ sheet_logger.log("========= start ==========")
10
+
11
+ # load all account and secret into a dict
12
+ secret_dict = {}
13
+ try:
14
+ for i in range(2, 50): # note: read row 2 - 50
15
+ rs = secret_repo.read(i)
16
+ if not rs:
17
+ break
18
+ assert 'username' in rs
19
+ assert 'secret' in rs
20
+
21
+ username = rs['username'].rstrip()
22
+ secret = rs['secret'].rstrip()
23
+
24
+ secret_dict[username] = secret
25
+ except Exception as e:
26
+ sheet_logger.log(log="Get secret table failed!!" + str(e))
27
+
28
+ # load config from gg sheet file
29
  configs = []
30
  ids = []
31
  try:
32
+ for i in range(2, 50): # note: read row 2 - 50
33
  rs = conf_repo.read(i)
34
  if not rs:
35
  break
36
+ if not rs['config']:
37
+ reset_keys = []
38
+ for key in rs:
39
+ if rs[key]:
40
+ reset_keys.append(key)
41
+ if len(reset_keys) > 0:
42
+ conf_repo.update(row_index=i, data={k: '' for k in reset_keys})
43
+ break
44
+ print(i, rs)
45
  try:
46
+ # validation
47
+ # assert 'config' in rs, 'require config column'
48
+ assert 'usernames' in rs, 'require usernames column'
49
+ assert 'enable' in rs, 'require enable column'
50
+
51
+ assert rs['enable'].rstrip() in ['enable', 'disable'], rs['enable']
52
+ assert 'slug' in rs['config'], 'require config.slug'
53
+
54
  cfg = json.loads(rs['config'])
55
+ usernames = set(rs['usernames']
56
+ .rstrip().replace('\n', ' ').replace(',', ' ').replace(';', ' ').replace('|', ' ')
57
+ .split(' '))
58
+ usernames = [u for u in usernames if u]
59
+ is_enabled = rs['enable'].rstrip() == 'enable'
60
+ if not is_enabled:
61
+ sheet_logger.log(log="Disabled, skip!", nb=cfg['slug'])
62
+ print("skip ", cfg['slug'])
63
+ continue
64
+
65
+ assert len(usernames) > 0, 'len usernames == 0'
66
+
67
+ # process config
68
+ accounts = {u: secret_dict[u] for u in secret_dict if u in usernames}
69
+ assert not set(usernames).difference(set(accounts.keys())), set(usernames).difference(set(accounts.keys()))
70
+ cfg = {**cfg, "accounts": accounts}
71
+
72
+ # save
73
  configs.append(cfg)
74
  ids.append(i)
75
  print(cfg)
76
+ except AssertionError:
77
+ import traceback
78
+ sheet_logger.update_job_status(i, validate_status=str(traceback.format_exc()))
79
+ except Exception:
80
+ import traceback
81
+ sheet_logger.log(log="Get config failed!!" + str(traceback.format_exc()))
82
 
83
+ # add config to service
84
  service = KernelRerunService()
85
  for config, idx in zip(configs, ids):
86
  try:
 
88
  except Exception as e:
89
  sheet_logger.update_job_status(idx, validate_status=str(e))
90
 
91
+ # run service
92
  try:
93
  service.validate_all()
94
  # service.status_all()
 
96
  except Exception as e:
97
  sheet_logger.log(log=str(e))
98
 
99
+ sheet_logger.log("========= end ==========")
version.py ADDED
@@ -0,0 +1 @@
 
 
1
+ VERSION="v1.0.1"