4
4
from bs4 import BeautifulSoup
5
5
import urllib3
6
6
import requests
7
- from datetime import datetime
7
+ from datetime import datetime , timedelta
8
8
import xml .etree .ElementTree as ET
9
9
import constants
10
10
@@ -46,6 +46,38 @@ def fetch_release_date(release):
46
46
return "Error while sending request to url"
47
47
except json .JSONDecodeError as e :
48
48
return "Failed to extract the spy-links"
49
+
50
+ def fetch_build_time (build ):
51
+ '''
52
+ Returns the created time (HH:MM) and date (YYYY-MM-DD) of the release in IST
53
+ '''
54
+ url = constants .PROW_VIEW_URL + build [8 :] + '/prowjob.json'
55
+
56
+ try :
57
+ response = requests .get (url , verify = False , timeout = 15 )
58
+ response .raise_for_status () # Raise exception for non-200 responses
59
+
60
+ buildtime = response .json () # Directly parse JSON
61
+ timestamp_str = buildtime ["metadata" ]["creationTimestamp" ]
62
+
63
+ # Convert timestamp to datetime object (UTC)
64
+ utc_time = datetime .strptime (timestamp_str , "%Y-%m-%dT%H:%M:%SZ" )
65
+
66
+ # Convert UTC to IST (UTC +5:30)
67
+ ist_time = utc_time + timedelta (hours = 5 , minutes = 30 )
68
+
69
+ # Extract date and time separately
70
+ ist_date = ist_time .strftime ("%Y-%m-%d" ) # YYYY-MM-DD
71
+ ist_time_formatted = ist_time .strftime ("%H:%M" ) # HH:MM (without seconds)
72
+
73
+ return ist_date , ist_time_formatted # Returning both date and time
74
+
75
+ except requests .Timeout :
76
+ return "Request timed out" , None
77
+ except requests .RequestException :
78
+ return "Error while sending request to URL" , None
79
+ except (json .JSONDecodeError , KeyError ):
80
+ return "Error while parsing prowjob.json" , None
49
81
50
82
def set_prow_url (ci_job_type : str )-> str :
51
83
'''
@@ -1219,6 +1251,7 @@ def get_brief_job_info(build_list,prow_ci_name,zone=None):
1219
1251
for build in build_list :
1220
1252
match = re .search (pattern_build_id , build )
1221
1253
build_id = match .group (1 )
1254
+ _ ,time = fetch_build_time (build )
1222
1255
lease , _ = get_quota_and_nightly (build )
1223
1256
if zone is not None and lease not in zone :
1224
1257
continue
@@ -1229,6 +1262,7 @@ def get_brief_job_info(build_list,prow_ci_name,zone=None):
1229
1262
job_dict = {}
1230
1263
job_dict ["Job" ] = prow_ci_name
1231
1264
job_dict ["Prow Build ID" ] = build_id
1265
+ job_dict ["Time" ]= time
1232
1266
job_dict ["Install Status" ] = cluster_status
1233
1267
if sensitive_info_expose_status == True :
1234
1268
job_dict ["Lease" ]= "Build log removed"
@@ -1284,7 +1318,10 @@ def get_detailed_job_info(build_list,prow_ci_name,zone=None):
1284
1318
builds_to_deleted .append (build )
1285
1319
continue
1286
1320
i = i + 1
1321
+ date ,time = fetch_build_time (build )
1322
+
1287
1323
print (i ,"Job link:" + constants .JOB_LINK_URL + build )
1324
+ print ("Build started time: " + time + " " + date )
1288
1325
1289
1326
build_status = check_job_status (build )
1290
1327
sensitive_info_expose_status = check_if_sensitive_info_exposed (build )
0 commit comments