/
phase.go
172 lines (145 loc) · 4.98 KB
/
phase.go
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package transferfiles
import (
"context"
"errors"
"os"
"time"
"github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/transferfiles/api"
"github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/transferfiles/state"
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
serviceUtils "github.com/jfrog/jfrog-client-go/artifactory/services/utils"
)
const NumberOfPhases = 3
type transferPhase interface {
run() error
phaseStarted() error
phaseDone() error
setContext(context context.Context)
setRepoKey(repoKey string)
setCheckExistenceInFilestore(bool)
shouldSkipPhase() (bool, error)
setSrcUserPluginService(*srcUserPluginService)
setSourceDetails(*coreConfig.ServerDetails)
getSourceDetails() *coreConfig.ServerDetails
setTargetDetails(*coreConfig.ServerDetails)
setRepoSummary(serviceUtils.RepositorySummary)
getPhaseName() string
setProgressBar(*TransferProgressMng)
setStateManager(stateManager *state.TransferStateManager)
setLocallyGeneratedFilter(locallyGeneratedFilter *locallyGeneratedFilter)
initProgressBar() error
setProxyKey(proxyKey string)
setBuildInfo(setBuildInfo bool)
setPackageType(packageType string)
setDisabledDistinctiveAql()
setStopSignal(stopSignal chan os.Signal)
setMinCheckSumDeploySize(minCheckSumDeploySize int64)
StopGracefully()
}
type phaseBase struct {
context context.Context
repoKey string
buildInfoRepo bool
packageType string
phaseId int
checkExistenceInFilestore bool
startTime time.Time
srcUpService *srcUserPluginService
srcRtDetails *coreConfig.ServerDetails
targetRtDetails *coreConfig.ServerDetails
progressBar *TransferProgressMng
repoSummary serviceUtils.RepositorySummary
proxyKey string
pcDetails *producerConsumerWrapper
transferManager *transferManager
stateManager *state.TransferStateManager
locallyGeneratedFilter *locallyGeneratedFilter
stopSignal chan os.Signal
// Optimization in Artifactory version 7.37 and above enables the exclusion of setting DISTINCT in SQL queries
disabledDistinctiveAql bool
minCheckSumDeploySize int64
}
func (pb *phaseBase) ShouldStop() bool {
return pb.context.Err() != nil
}
// Return InterruptionError, if stop is true
func (pb *phaseBase) getInterruptionErr() error {
if errors.Is(pb.context.Err(), context.Canceled) {
return new(InterruptionErr)
}
return nil
}
// Stop and indicate graceful stopping in the progress bar
func (pb *phaseBase) StopGracefully() {
if pb.progressBar != nil {
pb.progressBar.StopGracefully()
}
if pb.pcDetails != nil {
pb.pcDetails.chunkBuilderProducerConsumer.Cancel(true)
pb.pcDetails.chunkUploaderProducerConsumer.Cancel(true)
}
}
func (pb *phaseBase) getSourceDetails() *coreConfig.ServerDetails {
return pb.srcRtDetails
}
func (pb *phaseBase) setContext(context context.Context) {
pb.context = context
}
func (pb *phaseBase) setRepoKey(repoKey string) {
pb.repoKey = repoKey
}
func (pb *phaseBase) setCheckExistenceInFilestore(shouldCheck bool) {
pb.checkExistenceInFilestore = shouldCheck
}
func (pb *phaseBase) setSrcUserPluginService(service *srcUserPluginService) {
pb.srcUpService = service
}
func (pb *phaseBase) setSourceDetails(details *coreConfig.ServerDetails) {
pb.srcRtDetails = details
}
func (pb *phaseBase) setTargetDetails(details *coreConfig.ServerDetails) {
pb.targetRtDetails = details
}
func (pb *phaseBase) setRepoSummary(repoSummary serviceUtils.RepositorySummary) {
pb.repoSummary = repoSummary
}
func (pb *phaseBase) setProgressBar(progressbar *TransferProgressMng) {
pb.progressBar = progressbar
}
func (pb *phaseBase) setProxyKey(proxyKey string) {
pb.proxyKey = proxyKey
}
func (pb *phaseBase) setStateManager(stateManager *state.TransferStateManager) {
pb.stateManager = stateManager
}
func (pb *phaseBase) setLocallyGeneratedFilter(locallyGeneratedFilter *locallyGeneratedFilter) {
pb.locallyGeneratedFilter = locallyGeneratedFilter
}
func (pb *phaseBase) setBuildInfo(buildInfoRepo bool) {
pb.buildInfoRepo = buildInfoRepo
}
func (pb *phaseBase) setPackageType(packageType string) {
pb.packageType = packageType
}
func (pb *phaseBase) setDisabledDistinctiveAql() {
pb.disabledDistinctiveAql = true
}
func (pb *phaseBase) setMinCheckSumDeploySize(minCheckSumDeploySize int64) {
pb.minCheckSumDeploySize = minCheckSumDeploySize
}
func (pb *phaseBase) setStopSignal(stopSignal chan os.Signal) {
pb.stopSignal = stopSignal
}
func createTransferPhase(i int) transferPhase {
// Initialize a pointer to an empty producerConsumerWrapper to allow access the real value in StopGracefully
curPhaseBase := phaseBase{phaseId: i, pcDetails: &producerConsumerWrapper{}}
switch i {
case api.Phase1:
return &fullTransferPhase{phaseBase: curPhaseBase}
case api.Phase2:
return &filesDiffPhase{phaseBase: curPhaseBase}
case api.Phase3:
return &errorsRetryPhase{phaseBase: curPhaseBase}
}
return nil
}