1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
/*-
* ============LICENSE_START=======================================================
* VID
* ================================================================================
* Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package org.onap.vid.job.command
import org.apache.commons.lang3.StringUtils
import org.onap.portalsdk.core.service.DataAccessService
import org.onap.vid.job.Job
import org.onap.vid.job.Job.JobStatus.*
import org.onap.vid.job.impl.JobDaoImpl
import org.onap.vid.properties.Features
import org.onap.vid.utils.DaoUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.togglz.core.manager.FeatureManager
import java.util.*
import java.util.stream.Collectors
import java.util.stream.Stream
@Service
class WatchChildrenJobsBL @Autowired
constructor(private val dataAccessService: DataAccessService, private val featureManager: FeatureManager) {
fun retrieveChildrenJobsStatus(childrenJobsIds: List<String>): Job.JobStatus {
val jobs = getAllChildrenJobs(childrenJobsIds)
val jobsStatuses = childrenJobsIds.stream()
.map<JobDaoImpl> { jobId -> jobs[UUID.fromString(jobId)] }
.map {when {
(it == null || it.status == null) -> Job.JobStatus.FAILED
else -> it.status
}}
return if(featureManager.isActive(Features.FLAG_2008_PAUSE_VFMODULE_INSTANTIATION_FAILURE))
cumulateJobStatusWithPauseOnFailure(jobsStatuses) else cumulateJobStatus(jobsStatuses)
}
fun cumulateJobStatus(childrenComulatedStatus: Job.JobStatus, fatherJobStatus: Job.JobStatus): Job.JobStatus {
return if(featureManager.isActive(Features.FLAG_2008_PAUSE_VFMODULE_INSTANTIATION_FAILURE))
cumulateJobStatusWithPauseOnFailure(Stream.of(childrenComulatedStatus, fatherJobStatus))
else cumulateJobStatus(Stream.of(childrenComulatedStatus, fatherJobStatus))
}
private fun cumulateJobStatus(jobsStatuses: Stream<Job.JobStatus>): Job.JobStatus {
return jobsStatuses.reduce{ a, b ->
when {
!a.isFinal || !b.isFinal -> IN_PROGRESS
a == COMPLETED_WITH_ERRORS || b == COMPLETED_WITH_ERRORS-> COMPLETED_WITH_ERRORS
a == COMPLETED && b.isFailure -> COMPLETED_WITH_ERRORS
b == COMPLETED && a.isFailure -> COMPLETED_WITH_ERRORS
a == COMPLETED_AND_PAUSED || b == COMPLETED_AND_PAUSED -> COMPLETED_AND_PAUSED
a == COMPLETED || b == COMPLETED -> COMPLETED
a.isFailure || b.isFailure -> FAILED
else -> COMPLETED_WITH_NO_ACTION
}
} .orElse(COMPLETED_WITH_NO_ACTION)
}
private fun cumulateJobStatusWithPauseOnFailure(jobsStatuses: Stream<Job.JobStatus>): Job.JobStatus {
return jobsStatuses.reduce{ a, b ->
when {
a == FAILED_AND_PAUSED || b == FAILED_AND_PAUSED-> FAILED_AND_PAUSED
a == COMPLETED && b.isFailure -> FAILED_AND_PAUSED
b == COMPLETED && a.isFailure -> FAILED_AND_PAUSED
!a.isFinal || !b.isFinal -> IN_PROGRESS
a == COMPLETED_AND_PAUSED || b == COMPLETED_AND_PAUSED -> COMPLETED_AND_PAUSED
a == COMPLETED || b == COMPLETED -> COMPLETED
a.isFailure || b.isFailure -> FAILED
else -> COMPLETED_WITH_NO_ACTION
}
} .orElse(COMPLETED_WITH_NO_ACTION)
}
private fun getAllChildrenJobs(childrenJobsIds: List<String>): Map<UUID, JobDaoImpl> {
val jobs:MutableList<JobDaoImpl> = dataAccessService.getList(JobDaoImpl::class.java, filterByJobIds(childrenJobsIds), null, DaoUtils.getPropsMap()) as MutableList<JobDaoImpl>
return jobs.stream().collect(Collectors.toMap( { it.uuid }, { it }))
}
private fun filterByJobIds(childrenJobsIds: List<String>): String {
return " WHERE JOB_ID IN('" + StringUtils.join(childrenJobsIds, "', '") + "')"
}
}
|