@@ -29,25 +29,32 @@ class BatchRequestExecutorSpec
29
29
with MockSugar
30
30
with PrivateMethodTester {
31
31
32
- val startStatusEvent = StatusEvent
32
+ val schedulingStatusEvent = StatusEvent
33
33
.newBuilder()
34
34
.setType(" STATUS_CHANGED" )
35
35
.setEventTime(Timestamp .newBuilder().setSeconds(1 ).build())
36
- .setDescription(" Job state is set from SCHEDULED to RUNNING for job..." )
36
+ .setDescription(" Job state is set from QUEUED to SCHEDULED for job..." )
37
37
.build()
38
38
39
- val endStatusEvent = StatusEvent
39
+ val runningStatusEvent = StatusEvent
40
40
.newBuilder()
41
41
.setType(" STATUS_CHANGED" )
42
42
.setEventTime(Timestamp .newBuilder().setSeconds(2 ).build())
43
- .setDescription(" Job state is set from RUNNING to SOME_OTHER_STATUS for job..." )
43
+ .setDescription(" Job state is set from SCHEDULED to RUNNING for job..." )
44
44
.build()
45
45
46
- val schedulingStatusEvent = StatusEvent
46
+ val terminalStatusEvent = StatusEvent
47
47
.newBuilder()
48
48
.setType(" STATUS_CHANGED" )
49
49
.setEventTime(Timestamp .newBuilder().setSeconds(3 ).build())
50
- .setDescription(" Job state is set from QUEUED to SCHEDULED for job..." )
50
+ .setDescription(" Job state is set from RUNNING to SOME_OTHER_STATUS for job..." )
51
+ .build()
52
+
53
+ val scheduleFailedStatusEvent = StatusEvent
54
+ .newBuilder()
55
+ .setType(" STATUS_CHANGED" )
56
+ .setEventTime(Timestamp .newBuilder().setSeconds(5 ).build())
57
+ .setDescription(" Job state is set from SCHEDULED_PENDING_FAILED to FAILED for job..." )
51
58
.build()
52
59
53
60
val preemptionError = " Job state is set from SCHEDULED to FAILED for job projects/....Job failed due to task " +
@@ -94,7 +101,7 @@ class BatchRequestExecutorSpec
94
101
95
102
behavior of " BatchRequestExecutor"
96
103
97
- it should " create a schedule status event correctly" in {
104
+ it should " create a schedule status and vmStartTime event correctly" in {
98
105
99
106
val mockClient = setupBatchClient(jobState = JobStatus .State .QUEUED , events = List (schedulingStatusEvent))
100
107
val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
@@ -106,9 +113,9 @@ class BatchRequestExecutorSpec
106
113
// Verify the event
107
114
result.status match {
108
115
case RunStatus .Initializing (events, _) =>
109
- events.length shouldBe 1
110
- events.map(_.name).head shouldBe " Job state is set from QUEUED to SCHEDULED for job..."
111
- events.map(_.offsetDateTime.toString).head shouldBe " 1970-01-01T00:00:03Z "
116
+ events.length shouldBe 2
117
+ events.map(_.name) should contain allOf ( " Job state is set from QUEUED to SCHEDULED for job..." , " vmStartTime " )
118
+ events.map(_.offsetDateTime.toString) shouldBe List ( " 1970-01-01T00:00:01Z " , " 1970-01-01T00:00:01Z " )
112
119
case _ => fail(" Expected RunStatus.Initializing with events" )
113
120
}
114
121
}
@@ -137,7 +144,7 @@ class BatchRequestExecutorSpec
137
144
it should " create instantiatedVmInfo correctly" in {
138
145
139
146
val mockClient =
140
- setupBatchClient(jobState = JobStatus .State .RUNNING , events = List (startStatusEvent, endStatusEvent ))
147
+ setupBatchClient(jobState = JobStatus .State .RUNNING , events = List (runningStatusEvent, terminalStatusEvent ))
141
148
// Create the BatchRequestExecutor
142
149
val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
143
150
@@ -159,7 +166,7 @@ class BatchRequestExecutorSpec
159
166
160
167
val mockClient = setupBatchClient(location = " zones/us-central1-a" ,
161
168
jobState = JobStatus .State .RUNNING ,
162
- events = List (startStatusEvent, endStatusEvent )
169
+ events = List (runningStatusEvent, terminalStatusEvent )
163
170
)
164
171
165
172
// Create the BatchRequestExecutor
@@ -182,7 +189,7 @@ class BatchRequestExecutorSpec
182
189
it should " create instantiatedVmInfo correctly with missing location info" in {
183
190
184
191
val mockClient =
185
- setupBatchClient(jobState = JobStatus .State .RUNNING , events = List (startStatusEvent, endStatusEvent ))
192
+ setupBatchClient(jobState = JobStatus .State .RUNNING , events = List (runningStatusEvent, terminalStatusEvent ))
186
193
187
194
// Create the BatchRequestExecutor
188
195
val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
@@ -203,7 +210,7 @@ class BatchRequestExecutorSpec
203
210
204
211
it should " send vmStartTime and vmEndTime metadata info when a workflow succeeds" in {
205
212
206
- val mockClient = setupBatchClient(events = List (startStatusEvent, endStatusEvent ))
213
+ val mockClient = setupBatchClient(events = List (schedulingStatusEvent, runningStatusEvent, terminalStatusEvent ))
207
214
208
215
// Create the BatchRequestExecutor
209
216
val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
@@ -216,16 +223,22 @@ class BatchRequestExecutorSpec
216
223
result.status match {
217
224
case RunStatus .Success (events, _) =>
218
225
val eventNames = events.map(_.name)
219
- val eventTimes = events.map(_.offsetDateTime.toString)
220
226
eventNames should contain allOf (" vmStartTime" , " vmEndTime" )
221
- eventTimes should contain allOf (" 1970-01-01T00:00:01Z" , " 1970-01-01T00:00:02Z" )
227
+
228
+ val vmStartTime = events.find(e => e.name == " vmStartTime" ).get
229
+ val vmEndTime = events.find(e => e.name == " vmEndTime" ).get
230
+
231
+ vmStartTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:01Z"
232
+ vmEndTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:03Z"
222
233
case _ => fail(" Expected RunStatus.Success with events" )
223
234
}
224
235
}
225
236
226
237
it should " send vmStartTime and vmEndTime metadata info along with other events when a workflow fails" in {
227
238
val mockClient =
228
- setupBatchClient(jobState = JobStatus .State .FAILED , events = List (startStatusEvent, endStatusEvent))
239
+ setupBatchClient(jobState = JobStatus .State .FAILED ,
240
+ events = List (schedulingStatusEvent, runningStatusEvent, terminalStatusEvent)
241
+ )
229
242
230
243
// Create the BatchRequestExecutor
231
244
val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
@@ -238,13 +251,44 @@ class BatchRequestExecutorSpec
238
251
result.status match {
239
252
case RunStatus .Failed (_, events, _) =>
240
253
val eventNames = events.map(_.name)
241
- val eventTimes = events.map(_.offsetDateTime.toString)
242
- println(eventNames)
243
254
eventNames should contain allOf (" vmStartTime" , " vmEndTime" )
255
+
256
+ val vmStartTime = events.find(e => e.name == " vmStartTime" ).get
257
+ val vmEndTime = events.find(e => e.name == " vmEndTime" ).get
258
+
244
259
eventNames should contain allOf (" Job state is set from RUNNING to SOME_OTHER_STATUS for job..." , " Job state is set from SCHEDULED to RUNNING for job..." )
245
- eventTimes should contain allOf (" 1970-01-01T00:00:01Z" , " 1970-01-01T00:00:02Z" )
246
- case _ => fail(" Expected RunStatus.Success with events" )
260
+ vmStartTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:01Z"
261
+ vmEndTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:03Z"
262
+ case _ => fail(" Expected RunStatus.Failed with events" )
247
263
}
248
264
}
249
265
266
+ it should " send vmStartTime and vmEndTime metadata info along with other events when a job fails to run" in {
267
+ val mockClient =
268
+ setupBatchClient(jobState = JobStatus .State .FAILED ,
269
+ events = List (schedulingStatusEvent, scheduleFailedStatusEvent)
270
+ )
271
+
272
+ // Create the BatchRequestExecutor
273
+ val batchRequestExecutor = new BatchRequestExecutor .CloudImpl (BatchServiceSettings .newBuilder().build())
274
+
275
+ // testing a private method see https://www.scalatest.org/user_guide/using_PrivateMethodTester
276
+ val internalGetHandler = PrivateMethod [BatchApiResponse .StatusQueried ](Symbol (" internalGetHandler" ))
277
+ val result = batchRequestExecutor invokePrivate internalGetHandler(mockClient, GetJobRequest .newBuilder().build())
278
+
279
+ // Verify the events
280
+ result.status match {
281
+ case RunStatus .Failed (_, events, _) =>
282
+ val eventNames = events.map(_.name)
283
+ eventNames should contain allOf (" vmStartTime" , " vmEndTime" )
284
+
285
+ val vmStartTime = events.find(e => e.name == " vmStartTime" ).get
286
+ val vmEndTime = events.find(e => e.name == " vmEndTime" ).get
287
+
288
+ eventNames should contain allOf (" Job state is set from SCHEDULED_PENDING_FAILED to FAILED for job..." , " Job state is set from QUEUED to SCHEDULED for job..." )
289
+ vmStartTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:01Z"
290
+ vmEndTime.offsetDateTime.toString shouldBe " 1970-01-01T00:00:05Z"
291
+ case _ => fail(" Expected RunStatus.Failed with events" )
292
+ }
293
+ }
250
294
}
0 commit comments