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
diff --git a/cc_lab_manager/commands/cc_lab_manager.py b/cc_lab_manager/commands/cc_lab_manager.py
index 3b78d8e..1ed8b1b 100644
--- a/cc_lab_manager/commands/cc_lab_manager.py
+++ b/cc_lab_manager/commands/cc_lab_manager.py
@@ -2,13 +2,15 @@ import logging
2import os2import os
3import sys3import sys
44
5from cc_lab_manager.gsheet_db import gsheet_db
6from cc_lab_manager.gsheet_db import db_gsheet
7from cc_lab_manager.c3_db import c3_db5from cc_lab_manager.c3_db import c3_db
8from cc_lab_manager.dhcp import dhcp_config_generator6from cc_lab_manager.dhcp import dhcp_config_generator
9from cc_lab_manager.dhcp import restart_dhcp_servers7from cc_lab_manager.dhcp import restart_dhcp_servers
10from cc_lab_manager.maas import create_maas_node
11from cc_lab_manager.gen_config import gen_agent_tf_config8from cc_lab_manager.gen_config import gen_agent_tf_config
9from cc_lab_manager.gsheet_db import gsheet_db
10from cc_lab_manager.gsheet_db import db_gsheet
11from cc_lab_manager.insert_data import gen_device_id
12from cc_lab_manager.maas import create_maas_node
13from cc_lab_manager.maas import update_maas_node_network
1214
1315
14logger = logging.getLogger('cc-lab-manager')16logger = logging.getLogger('cc-lab-manager')
@@ -20,12 +22,18 @@ def main():
20 # Get needed information from c322 # Get needed information from c3
21 c3_db.main()23 c3_db.main()
2224
25 # Generate device id
26 result = gen_device_id.main()
27 if result == 1:
28 return 1
29
23 # Generate and apply DHCP config for each subnet30 # Generate and apply DHCP config for each subnet
24 dhcp_config_generator.main()31 dhcp_config_generator.main()
25 restart_dhcp_servers.main()32 restart_dhcp_servers.main()
2633
27 # Create MAAS nodes for DUTs34 # Create MAAS nodes for DUTs
28 create_maas_node.main()35 create_maas_node.main()
36 update_maas_node_network.main()
2937
30 # Write data in db back to the google sheet38 # Write data in db back to the google sheet
31 db_gsheet.main()39 db_gsheet.main()
diff --git a/cc_lab_manager/gsheet_db/db_gsheet.py b/cc_lab_manager/gsheet_db/db_gsheet.py
index c535445..34e99d1 100644
--- a/cc_lab_manager/gsheet_db/db_gsheet.py
+++ b/cc_lab_manager/gsheet_db/db_gsheet.py
@@ -50,7 +50,6 @@ def get_column_to_be_updated(token_file):
50 for key in col_to_be_updated:50 for key in col_to_be_updated:
51 col_to_be_updated[key] = col_position_list[started_index]51 col_to_be_updated[key] = col_position_list[started_index]
52 started_index += 152 started_index += 1
53
54 return col_to_be_updated53 return col_to_be_updated
55 54
5655
@@ -71,7 +70,7 @@ def sync_c3_data_to_sheet(db_machine_list,token_file):
7170
72 row_num += 171 row_num += 1
73 wks.update_cells(cell_list)72 wks.update_cells(cell_list)
74 73
7574
76def read_data_from_db(cursor, token_file):75def read_data_from_db(cursor, token_file):
77 76
@@ -82,6 +81,43 @@ def read_data_from_db(cursor, token_file):
82 81
83 return list(results)82 return list(results)
8483
84
85def sync_device_id_to_sheet(cursor, token_file):
86
87 col_in_c3 = ['CID','Lab','Device_ID',
88 'Lab', 'CID']
89 sqlcmd = 'select {},{},{} from lab_hw \
90 order by {} ASC, {} ASC'.format(*col_in_c3)
91 cursor.execute(sqlcmd)
92 db_device_list = cursor.fetchall()
93
94 device_dict = {}
95 for device in db_device_list:
96 if device['Lab'] not in device_dict:
97 device_dict[device['Lab']] = {}
98 device_dict[device['Lab']][device['CID']] = device['Device_ID']
99
100 gc = pygsheets.authorize(service_file=token_file)
101 sht = gc.open_by_url(gsheet_url)
102
103 for lab in device_dict:
104 try:
105 wks = sht.worksheet_by_title(lab)
106 except:
107 continue
108 col_names = wks.get_row(1)
109 target_col = col_names.index('Device_ID') + 1
110 cid_in_wks = wks.get_col(1)
111 id_list = []
112 for target_row in range(1, len(cid_in_wks)):
113 cid = cid_in_wks[target_row]
114 try:
115 id_list.append(device_dict[lab][cid])
116 except:
117 id_list.append('')
118 wks.update_col(target_col, id_list, row_offset=1)
119
120
85def environ_or_required(key):121def environ_or_required(key):
86 if os.environ.get(key):122 if os.environ.get(key):
87 return {'default': os.environ.get(key)}123 return {'default': os.environ.get(key)}
@@ -100,6 +136,7 @@ def main():
100 db = get_db_obj(args.database)136 db = get_db_obj(args.database)
101 cursor = get_cursor_obj(db) 137 cursor = get_cursor_obj(db)
102 sync_c3_data_to_sheet(read_data_from_db(cursor, args.token),args.token)138 sync_c3_data_to_sheet(read_data_from_db(cursor, args.token),args.token)
139 sync_device_id_to_sheet(cursor, args.token)
103 close_db(db)140 close_db(db)
104141
105142
diff --git a/cc_lab_manager/insert_data/__init__.py b/cc_lab_manager/insert_data/__init__.py
106new file mode 100644143new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cc_lab_manager/insert_data/__init__.py
diff --git a/cc_lab_manager/insert_data/gen_device_id.py b/cc_lab_manager/insert_data/gen_device_id.py
107new file mode 100644144new file mode 100644
index 0000000..4af0c21
--- /dev/null
+++ b/cc_lab_manager/insert_data/gen_device_id.py
@@ -0,0 +1,102 @@
1import sqlite3
2import os
3import yaml
4import argparse
5import re
6
7from cc_lab_manager.cc_lab_manager_maptable import account_id_maptable
8
9def get_db_obj(path_to_db):
10 db = sqlite3.connect(path_to_db)
11 db.row_factory = sqlite3.Row
12 return db
13
14
15def get_cursor_obj(db_obj):
16 cursor = db_obj.cursor()
17 return cursor
18
19
20def close_db(db):
21 db.commit()
22 db.close()
23
24
25def read_data_from_db(cursor):
26 col_in_c3 = ['CID', 'Device_ID', 'Account', 'Model',
27 'CID']
28
29 sqlcmd = 'select {},{},{},{} from lab_hw \
30 where CID not like \'dummy-%\' \
31 order by {} ASC'.format(*col_in_c3)
32 cursor.execute(sqlcmd)
33 results = cursor.fetchall()
34 return list(results)
35
36
37def update_device_id(cursor, update_dev_id):
38 update_list = []
39 for cid in update_dev_id:
40 update_list.append([update_dev_id[cid], cid])
41
42 sqlcmd = 'update lab_hw set Device_ID=? where CID=?'
43 cursor.executemany(sqlcmd, update_list)
44
45
46def generate_device_id(db_device_list):
47 update_dev_id = {}
48 for device in db_device_list:
49 if not re.match('^[0-9]{6}-[0-9]{4,}$', device['CID']):
50 continue
51 if device['Device_ID'] == '':
52 if device['Account'] in account_id_maptable:
53 account_id = account_id_maptable[device['Account']]
54 else:
55 account_id = device['Account'].split(' ')[0]
56 cid_num = 'c' + device['CID'].split('-')[-1]
57 platform_id = re.sub('[^A-Za-z0-9 -]+', '', device['Model'].split('(')[0])
58 platform_id = platform_id.strip().replace(' ', '-')
59 if account_id in platform_id:
60 update_dev_id[device['CID']] = '-'.join([platform_id, cid_num]).lower()
61 else:
62 update_dev_id[device['CID']] = '-'.join([account_id, platform_id, cid_num]).lower()
63 else:
64 update_dev_id[device['CID']] = re.sub('[^A-Za-z0-9-]+', '', device['Device_ID']).lower()
65
66 # Check if there's dupliacte in current device id
67 device_id_list = []
68 for cid in update_dev_id:
69 if update_dev_id[cid] in device_id_list:
70 print('Duplicate device id:', cid)
71 return 1
72 else:
73 device_id_list.append(update_dev_id[cid])
74
75 return update_dev_id
76
77
78def environ_or_required(key):
79 if os.environ.get(key):
80 return {'default': os.environ.get(key)}
81 else:
82 return {'required': True}
83
84
85def main():
86 parser = argparse.ArgumentParser()
87 parser.add_argument('--database', help="Database location",**environ_or_required('CCLM_HARDWARE_DB'))
88 args = parser.parse_args()
89 db = get_db_obj(args.database)
90 cursor = get_cursor_obj(db)
91 device_list = read_data_from_db(cursor)
92 update_dev_id = generate_device_id(device_list)
93 if update_dev_id == 1:
94 return_code = 1
95 else:
96 update_device_id(cursor, update_dev_id)
97 return_code = 0
98 close_db(db)
99 return return_code
100
101if __name__ == '__main__':
102 main()
diff --git a/cc_lab_manager/maas/create_maas_node.py b/cc_lab_manager/maas/create_maas_node.py
index 1ba9261..83cafb1 100644
--- a/cc_lab_manager/maas/create_maas_node.py
+++ b/cc_lab_manager/maas/create_maas_node.py
@@ -26,7 +26,7 @@ def close_db(db):
26 26
27def read_data_from_db(cursor):27def read_data_from_db(cursor):
28 28
29 col_in_c3 = ["CID","MAC","CanonicalLabel","Power","IP","PDU_IP","PDU_Outlet","MAAS_Server","MAAS_Node_ID"]29 col_in_c3 = ["CID","MAC","CanonicalLabel","Provision","Power","Device_ID","IP","PDU_IP","PDU_Outlet","MAAS_Server","MAAS_Node_ID"]
30 30
31 sqlcmd = 'select {} from lab_hw where CID not like \'dummy-%\' order by MAAS_Server'.format(",".join(col_in_c3[0:]))31 sqlcmd = 'select {} from lab_hw where CID not like \'dummy-%\' order by MAAS_Server'.format(",".join(col_in_c3[0:]))
32 cursor.execute(sqlcmd)32 cursor.execute(sqlcmd)
@@ -69,6 +69,9 @@ def create_maas_node(machine_list, maas_admin, maas_admin_password):
69 client = ""69 client = ""
70 70
71 for machine in machine_list:71 for machine in machine_list:
72
73 if machine["Provision"] not in ['maas_uefi', 'maas_legacy']:
74 continue
72 75
73 if not mass_is_connecting:76 if not mass_is_connecting:
74 mass_is_connecting = machine["MAAS_Server"]77 mass_is_connecting = machine["MAAS_Server"]
@@ -81,7 +84,7 @@ def create_maas_node(machine_list, maas_admin, maas_admin_password):
81 84
82 power_type = machine["Power"].lower() if machine["Power"] != "" else "manual"85 power_type = machine["Power"].lower() if machine["Power"] != "" else "manual"
83 power_parameter = {}86 power_parameter = {}
84 node_name = machine["cid"] + "-" + re.sub('[^A-Za-z0-9\-]+', '', machine["CanonicalLabel"])87 node_name = machine["Device_ID"]
85 88
86 if machine["MAC"] in maas_mac_list or machine["MAC"] == '':89 if machine["MAC"] in maas_mac_list or machine["MAC"] == '':
87 continue90 continue
diff --git a/cc_lab_manager/maas/update-maas-node-network-setting.py b/cc_lab_manager/maas/update_maas_node_network.py
88similarity index 100%91similarity index 100%
89rename from cc_lab_manager/maas/update-maas-node-network-setting.py92rename from cc_lab_manager/maas/update-maas-node-network-setting.py
90rename to cc_lab_manager/maas/update_maas_node_network.py93rename to cc_lab_manager/maas/update_maas_node_network.py

Subscribers

People subscribed via source and target branches

to all changes: