Merge ~gavin.lin/cc-lab-manager:customized_naming into cc-lab-manager:master

Proposed by Gavin Lin
Status: Merged
Approved by: Gavin Lin
Approved revision: 230d3dac477e2f1554342787f108e7bc7dc3503e
Merged at revision: 5a10955afc7f62d91134da7b90b477f20757522b
Proposed branch: ~gavin.lin/cc-lab-manager:customized_naming
Merge into: cc-lab-manager:master
Diff against target: 264 lines (+157/-7)
5 files modified
cc_lab_manager/commands/cc_lab_manager.py (+11/-3)
cc_lab_manager/gsheet_db/db_gsheet.py (+39/-2)
cc_lab_manager/insert_data/__init__.py (+0/-0)
cc_lab_manager/insert_data/gen_device_id.py (+102/-0)
cc_lab_manager/maas/create_maas_node.py (+5/-2)
Reviewer Review Type Date Requested Status
Gavin Lin (community) Approve
Review via email: mp+425015@code.launchpad.net

Commit message

Generate device id and use it as maas node name

To post a comment you must log in.
Revision history for this message
Gavin Lin (gavin.lin) wrote :

Self approved, tested with some devices in lab5.
It's weekend now, and this need to be landed to re-construct the infrastructure before people start using the lab in Monday.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/cc_lab_manager/commands/cc_lab_manager.py b/cc_lab_manager/commands/cc_lab_manager.py
2index 3b78d8e..1ed8b1b 100644
3--- a/cc_lab_manager/commands/cc_lab_manager.py
4+++ b/cc_lab_manager/commands/cc_lab_manager.py
5@@ -2,13 +2,15 @@ import logging
6 import os
7 import sys
8
9-from cc_lab_manager.gsheet_db import gsheet_db
10-from cc_lab_manager.gsheet_db import db_gsheet
11 from cc_lab_manager.c3_db import c3_db
12 from cc_lab_manager.dhcp import dhcp_config_generator
13 from cc_lab_manager.dhcp import restart_dhcp_servers
14-from cc_lab_manager.maas import create_maas_node
15 from cc_lab_manager.gen_config import gen_agent_tf_config
16+from cc_lab_manager.gsheet_db import gsheet_db
17+from cc_lab_manager.gsheet_db import db_gsheet
18+from cc_lab_manager.insert_data import gen_device_id
19+from cc_lab_manager.maas import create_maas_node
20+from cc_lab_manager.maas import update_maas_node_network
21
22
23 logger = logging.getLogger('cc-lab-manager')
24@@ -20,12 +22,18 @@ def main():
25 # Get needed information from c3
26 c3_db.main()
27
28+ # Generate device id
29+ result = gen_device_id.main()
30+ if result == 1:
31+ return 1
32+
33 # Generate and apply DHCP config for each subnet
34 dhcp_config_generator.main()
35 restart_dhcp_servers.main()
36
37 # Create MAAS nodes for DUTs
38 create_maas_node.main()
39+ update_maas_node_network.main()
40
41 # Write data in db back to the google sheet
42 db_gsheet.main()
43diff --git a/cc_lab_manager/gsheet_db/db_gsheet.py b/cc_lab_manager/gsheet_db/db_gsheet.py
44index c535445..34e99d1 100644
45--- a/cc_lab_manager/gsheet_db/db_gsheet.py
46+++ b/cc_lab_manager/gsheet_db/db_gsheet.py
47@@ -50,7 +50,6 @@ def get_column_to_be_updated(token_file):
48 for key in col_to_be_updated:
49 col_to_be_updated[key] = col_position_list[started_index]
50 started_index += 1
51-
52 return col_to_be_updated
53
54
55@@ -71,7 +70,7 @@ def sync_c3_data_to_sheet(db_machine_list,token_file):
56
57 row_num += 1
58 wks.update_cells(cell_list)
59-
60+
61
62 def read_data_from_db(cursor, token_file):
63
64@@ -82,6 +81,43 @@ def read_data_from_db(cursor, token_file):
65
66 return list(results)
67
68+
69+def sync_device_id_to_sheet(cursor, token_file):
70+
71+ col_in_c3 = ['CID','Lab','Device_ID',
72+ 'Lab', 'CID']
73+ sqlcmd = 'select {},{},{} from lab_hw \
74+ order by {} ASC, {} ASC'.format(*col_in_c3)
75+ cursor.execute(sqlcmd)
76+ db_device_list = cursor.fetchall()
77+
78+ device_dict = {}
79+ for device in db_device_list:
80+ if device['Lab'] not in device_dict:
81+ device_dict[device['Lab']] = {}
82+ device_dict[device['Lab']][device['CID']] = device['Device_ID']
83+
84+ gc = pygsheets.authorize(service_file=token_file)
85+ sht = gc.open_by_url(gsheet_url)
86+
87+ for lab in device_dict:
88+ try:
89+ wks = sht.worksheet_by_title(lab)
90+ except:
91+ continue
92+ col_names = wks.get_row(1)
93+ target_col = col_names.index('Device_ID') + 1
94+ cid_in_wks = wks.get_col(1)
95+ id_list = []
96+ for target_row in range(1, len(cid_in_wks)):
97+ cid = cid_in_wks[target_row]
98+ try:
99+ id_list.append(device_dict[lab][cid])
100+ except:
101+ id_list.append('')
102+ wks.update_col(target_col, id_list, row_offset=1)
103+
104+
105 def environ_or_required(key):
106 if os.environ.get(key):
107 return {'default': os.environ.get(key)}
108@@ -100,6 +136,7 @@ def main():
109 db = get_db_obj(args.database)
110 cursor = get_cursor_obj(db)
111 sync_c3_data_to_sheet(read_data_from_db(cursor, args.token),args.token)
112+ sync_device_id_to_sheet(cursor, args.token)
113 close_db(db)
114
115
116diff --git a/cc_lab_manager/insert_data/__init__.py b/cc_lab_manager/insert_data/__init__.py
117new file mode 100644
118index 0000000..e69de29
119--- /dev/null
120+++ b/cc_lab_manager/insert_data/__init__.py
121diff --git a/cc_lab_manager/insert_data/gen_device_id.py b/cc_lab_manager/insert_data/gen_device_id.py
122new file mode 100644
123index 0000000..4af0c21
124--- /dev/null
125+++ b/cc_lab_manager/insert_data/gen_device_id.py
126@@ -0,0 +1,102 @@
127+import sqlite3
128+import os
129+import yaml
130+import argparse
131+import re
132+
133+from cc_lab_manager.cc_lab_manager_maptable import account_id_maptable
134+
135+def get_db_obj(path_to_db):
136+ db = sqlite3.connect(path_to_db)
137+ db.row_factory = sqlite3.Row
138+ return db
139+
140+
141+def get_cursor_obj(db_obj):
142+ cursor = db_obj.cursor()
143+ return cursor
144+
145+
146+def close_db(db):
147+ db.commit()
148+ db.close()
149+
150+
151+def read_data_from_db(cursor):
152+ col_in_c3 = ['CID', 'Device_ID', 'Account', 'Model',
153+ 'CID']
154+
155+ sqlcmd = 'select {},{},{},{} from lab_hw \
156+ where CID not like \'dummy-%\' \
157+ order by {} ASC'.format(*col_in_c3)
158+ cursor.execute(sqlcmd)
159+ results = cursor.fetchall()
160+ return list(results)
161+
162+
163+def update_device_id(cursor, update_dev_id):
164+ update_list = []
165+ for cid in update_dev_id:
166+ update_list.append([update_dev_id[cid], cid])
167+
168+ sqlcmd = 'update lab_hw set Device_ID=? where CID=?'
169+ cursor.executemany(sqlcmd, update_list)
170+
171+
172+def generate_device_id(db_device_list):
173+ update_dev_id = {}
174+ for device in db_device_list:
175+ if not re.match('^[0-9]{6}-[0-9]{4,}$', device['CID']):
176+ continue
177+ if device['Device_ID'] == '':
178+ if device['Account'] in account_id_maptable:
179+ account_id = account_id_maptable[device['Account']]
180+ else:
181+ account_id = device['Account'].split(' ')[0]
182+ cid_num = 'c' + device['CID'].split('-')[-1]
183+ platform_id = re.sub('[^A-Za-z0-9 -]+', '', device['Model'].split('(')[0])
184+ platform_id = platform_id.strip().replace(' ', '-')
185+ if account_id in platform_id:
186+ update_dev_id[device['CID']] = '-'.join([platform_id, cid_num]).lower()
187+ else:
188+ update_dev_id[device['CID']] = '-'.join([account_id, platform_id, cid_num]).lower()
189+ else:
190+ update_dev_id[device['CID']] = re.sub('[^A-Za-z0-9-]+', '', device['Device_ID']).lower()
191+
192+ # Check if there's dupliacte in current device id
193+ device_id_list = []
194+ for cid in update_dev_id:
195+ if update_dev_id[cid] in device_id_list:
196+ print('Duplicate device id:', cid)
197+ return 1
198+ else:
199+ device_id_list.append(update_dev_id[cid])
200+
201+ return update_dev_id
202+
203+
204+def environ_or_required(key):
205+ if os.environ.get(key):
206+ return {'default': os.environ.get(key)}
207+ else:
208+ return {'required': True}
209+
210+
211+def main():
212+ parser = argparse.ArgumentParser()
213+ parser.add_argument('--database', help="Database location",**environ_or_required('CCLM_HARDWARE_DB'))
214+ args = parser.parse_args()
215+ db = get_db_obj(args.database)
216+ cursor = get_cursor_obj(db)
217+ device_list = read_data_from_db(cursor)
218+ update_dev_id = generate_device_id(device_list)
219+ if update_dev_id == 1:
220+ return_code = 1
221+ else:
222+ update_device_id(cursor, update_dev_id)
223+ return_code = 0
224+ close_db(db)
225+ return return_code
226+
227+if __name__ == '__main__':
228+ main()
229diff --git a/cc_lab_manager/maas/create_maas_node.py b/cc_lab_manager/maas/create_maas_node.py
230index 1ba9261..83cafb1 100644
231--- a/cc_lab_manager/maas/create_maas_node.py
232+++ b/cc_lab_manager/maas/create_maas_node.py
233@@ -26,7 +26,7 @@ def close_db(db):
234
235 def read_data_from_db(cursor):
236
237- col_in_c3 = ["CID","MAC","CanonicalLabel","Power","IP","PDU_IP","PDU_Outlet","MAAS_Server","MAAS_Node_ID"]
238+ col_in_c3 = ["CID","MAC","CanonicalLabel","Provision","Power","Device_ID","IP","PDU_IP","PDU_Outlet","MAAS_Server","MAAS_Node_ID"]
239
240 sqlcmd = 'select {} from lab_hw where CID not like \'dummy-%\' order by MAAS_Server'.format(",".join(col_in_c3[0:]))
241 cursor.execute(sqlcmd)
242@@ -69,6 +69,9 @@ def create_maas_node(machine_list, maas_admin, maas_admin_password):
243 client = ""
244
245 for machine in machine_list:
246+
247+ if machine["Provision"] not in ['maas_uefi', 'maas_legacy']:
248+ continue
249
250 if not mass_is_connecting:
251 mass_is_connecting = machine["MAAS_Server"]
252@@ -81,7 +84,7 @@ def create_maas_node(machine_list, maas_admin, maas_admin_password):
253
254 power_type = machine["Power"].lower() if machine["Power"] != "" else "manual"
255 power_parameter = {}
256- node_name = machine["cid"] + "-" + re.sub('[^A-Za-z0-9\-]+', '', machine["CanonicalLabel"])
257+ node_name = machine["Device_ID"]
258
259 if machine["MAC"] in maas_mac_list or machine["MAC"] == '':
260 continue
261diff --git a/cc_lab_manager/maas/update-maas-node-network-setting.py b/cc_lab_manager/maas/update_maas_node_network.py
262similarity index 100%
263rename from cc_lab_manager/maas/update-maas-node-network-setting.py
264rename to cc_lab_manager/maas/update_maas_node_network.py

Subscribers

People subscribed via source and target branches

to all changes: