1
1
#!/usr/bin/env python
2
- # -*- coding: utf-8; -*-
3
-
4
- # Copyright (c) 2024 Oracle and/or its affiliates.
2
+ # Copyright (c) 2024, 2025 Oracle and/or its affiliates.
5
3
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
6
4
7
5
import logging
12
10
import oci
13
11
from oci import Signer
14
12
from tqdm .auto import tqdm
13
+
15
14
from ads .common .oci_datascience import OCIDataScienceMixin
16
15
17
16
logger = logging .getLogger (__name__ )
20
19
DEFAULT_WAIT_TIME = 1200
21
20
DEFAULT_POLL_INTERVAL = 10
22
21
WORK_REQUEST_PERCENTAGE = 100
23
- # default tqdm progress bar format:
22
+ # default tqdm progress bar format:
24
23
# {l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, ' '{rate_fmt}{postfix}]
25
24
# customize the bar format to remove the {n_fmt}/{total_fmt} from the right side
26
- DEFAULT_BAR_FORMAT = ' {l_bar}{bar}| [{elapsed}<{remaining}, ' ' {rate_fmt}{postfix}]'
25
+ DEFAULT_BAR_FORMAT = " {l_bar}{bar}| [{elapsed}<{remaining}, " " {rate_fmt}{postfix}]"
27
26
28
27
29
28
class DataScienceWorkRequest (OCIDataScienceMixin ):
@@ -32,13 +31,13 @@ class DataScienceWorkRequest(OCIDataScienceMixin):
32
31
"""
33
32
34
33
def __init__ (
35
- self ,
36
- id : str ,
34
+ self ,
35
+ id : str ,
37
36
description : str = "Processing" ,
38
- config : dict = None ,
39
- signer : Signer = None ,
40
- client_kwargs : dict = None ,
41
- ** kwargs
37
+ config : dict = None ,
38
+ signer : Signer = None ,
39
+ client_kwargs : dict = None ,
40
+ ** kwargs ,
42
41
) -> None :
43
42
"""Initializes ADSWorkRequest object.
44
43
@@ -49,41 +48,43 @@ def __init__(
49
48
description: str
50
49
Progress bar initial step description (Defaults to `Processing`).
51
50
config : dict, optional
52
- OCI API key config dictionary to initialize
51
+ OCI API key config dictionary to initialize
53
52
oci.data_science.DataScienceClient (Defaults to None).
54
53
signer : oci.signer.Signer, optional
55
- OCI authentication signer to initialize
54
+ OCI authentication signer to initialize
56
55
oci.data_science.DataScienceClient (Defaults to None).
57
56
client_kwargs : dict, optional
58
- Additional client keyword arguments to initialize
57
+ Additional client keyword arguments to initialize
59
58
oci.data_science.DataScienceClient (Defaults to None).
60
59
kwargs:
61
- Additional keyword arguments to initialize
60
+ Additional keyword arguments to initialize
62
61
oci.data_science.DataScienceClient.
63
62
"""
64
63
self .id = id
65
64
self ._description = description
66
65
self ._percentage = 0
67
66
self ._status = None
67
+ self ._error_message = ""
68
68
super ().__init__ (config , signer , client_kwargs , ** kwargs )
69
-
70
69
71
70
def _sync (self ):
72
71
"""Fetches the latest work request information to ADSWorkRequest object."""
73
72
work_request = self .client .get_work_request (self .id ).data
74
- work_request_logs = self .client .list_work_request_logs (
75
- self .id
76
- ).data
73
+ work_request_logs = self .client .list_work_request_logs (self .id ).data
77
74
78
- self ._percentage = work_request .percent_complete
75
+ self ._percentage = work_request .percent_complete
79
76
self ._status = work_request .status
80
- self ._description = work_request_logs [- 1 ].message if work_request_logs else "Processing"
77
+ self ._description = (
78
+ work_request_logs [- 1 ].message if work_request_logs else "Processing"
79
+ )
80
+ if work_request .status == "FAILED" :
81
+ self ._error_message = self .client .list_work_request_errors (self .id ).data
81
82
82
83
def watch (
83
- self ,
84
+ self ,
84
85
progress_callback : Callable ,
85
- max_wait_time : int = DEFAULT_WAIT_TIME ,
86
- poll_interval : int = DEFAULT_POLL_INTERVAL ,
86
+ max_wait_time : int = DEFAULT_WAIT_TIME ,
87
+ poll_interval : int = DEFAULT_POLL_INTERVAL ,
87
88
):
88
89
"""Updates the progress bar with realtime message and percentage until the process is completed.
89
90
@@ -92,10 +93,10 @@ def watch(
92
93
progress_callback: Callable
93
94
Progress bar callback function.
94
95
It must accept `(percent_change, description)` where `percent_change` is the
95
- work request percent complete and `description` is the latest work request log message.
96
+ work request percent complete and `description` is the latest work request log message.
96
97
max_wait_time: int
97
98
Maximum amount of time to wait in seconds (Defaults to 1200).
98
- Negative implies infinite wait time.
99
+ Negative implies infinite wait time.
99
100
poll_interval: int
100
101
Poll interval in seconds (Defaults to 10).
101
102
@@ -107,7 +108,6 @@ def watch(
107
108
108
109
start_time = time .time ()
109
110
while self ._percentage < 100 :
110
-
111
111
seconds_since = time .time () - start_time
112
112
if max_wait_time > 0 and seconds_since >= max_wait_time :
113
113
logger .error (f"Exceeded max wait time of { max_wait_time } seconds." )
@@ -124,12 +124,14 @@ def watch(
124
124
percent_change = self ._percentage - previous_percent_complete
125
125
previous_percent_complete = self ._percentage
126
126
progress_callback (
127
- percent_change = percent_change ,
128
- description = self ._description
127
+ percent_change = percent_change , description = self ._description
129
128
)
130
129
131
130
if self ._status in WORK_REQUEST_STOP_STATE :
132
- if self ._status != oci .work_requests .models .WorkRequest .STATUS_SUCCEEDED :
131
+ if (
132
+ self ._status
133
+ != oci .work_requests .models .WorkRequest .STATUS_SUCCEEDED
134
+ ):
133
135
if self ._description :
134
136
raise Exception (self ._description )
135
137
else :
@@ -145,12 +147,12 @@ def watch(
145
147
146
148
def wait_work_request (
147
149
self ,
148
- progress_bar_description : str = "Processing" ,
149
- max_wait_time : int = DEFAULT_WAIT_TIME ,
150
- poll_interval : int = DEFAULT_POLL_INTERVAL
150
+ progress_bar_description : str = "Processing" ,
151
+ max_wait_time : int = DEFAULT_WAIT_TIME ,
152
+ poll_interval : int = DEFAULT_POLL_INTERVAL ,
151
153
):
152
154
"""Waits for the work request progress bar to be completed.
153
-
155
+
154
156
Parameters
155
157
----------
156
158
progress_bar_description: str
@@ -160,7 +162,7 @@ def wait_work_request(
160
162
Negative implies infinite wait time.
161
163
poll_interval: int
162
164
Poll interval in seconds (Defaults to 10).
163
-
165
+
164
166
Returns
165
167
-------
166
168
None
@@ -172,7 +174,7 @@ def wait_work_request(
172
174
mininterval = 0 ,
173
175
file = sys .stdout ,
174
176
desc = progress_bar_description ,
175
- bar_format = DEFAULT_BAR_FORMAT
177
+ bar_format = DEFAULT_BAR_FORMAT ,
176
178
) as pbar :
177
179
178
180
def progress_callback (percent_change , description ):
@@ -184,6 +186,5 @@ def progress_callback(percent_change, description):
184
186
self .watch (
185
187
progress_callback = progress_callback ,
186
188
max_wait_time = max_wait_time ,
187
- poll_interval = poll_interval
189
+ poll_interval = poll_interval ,
188
190
)
189
-
0 commit comments