@@ -11,8 +11,6 @@ import (
11
11
"strings"
12
12
"time"
13
13
14
- "golang.org/x/sync/errgroup"
15
-
16
14
"github.com/elastic/elastic-agent/pkg/testing/runner"
17
15
)
18
16
@@ -62,89 +60,77 @@ func (p *provisioner) SetLogger(l runner.Logger) {
62
60
p .logger = l
63
61
}
64
62
65
- func (p * provisioner ) Provision (ctx context.Context , requests []runner.StackRequest ) ([]runner.Stack , error ) {
66
- results := make (map [runner.StackRequest ]* CreateDeploymentResponse )
67
- for _ , r := range requests {
68
- // allow up to 2 minutes for each create request
69
- createCtx , createCancel := context .WithTimeout (ctx , 2 * time .Minute )
70
- resp , err := p .createDeployment (createCtx , r ,
71
- map [string ]string {
72
- "division" : "engineering" ,
73
- "org" : "ingest" ,
74
- "team" : "elastic-agent" ,
75
- "project" : "elastic-agent" ,
76
- "integration-tests" : "true" ,
77
- })
78
- createCancel ()
79
- if err != nil {
80
- return nil , err
81
- }
82
- results [r ] = resp
83
- }
63
+ // Create creates a stack.
64
+ func (p * provisioner ) Create (ctx context.Context , request runner.StackRequest ) (runner.Stack , error ) {
65
+ // allow up to 2 minutes for request
66
+ createCtx , createCancel := context .WithTimeout (ctx , 2 * time .Minute )
67
+ defer createCancel ()
68
+ resp , err := p .createDeployment (createCtx , request ,
69
+ map [string ]string {
70
+ "division" : "engineering" ,
71
+ "org" : "ingest" ,
72
+ "team" : "elastic-agent" ,
73
+ "project" : "elastic-agent" ,
74
+ "integration-tests" : "true" ,
75
+ })
76
+ if err != nil {
77
+ return runner.Stack {}, err
78
+ }
79
+ return runner.Stack {
80
+ ID : request .ID ,
81
+ Version : request .Version ,
82
+ Elasticsearch : resp .ElasticsearchEndpoint ,
83
+ Kibana : resp .KibanaEndpoint ,
84
+ Username : resp .Username ,
85
+ Password : resp .Password ,
86
+ Internal : map [string ]interface {}{
87
+ "deployment_id" : resp .ID ,
88
+ },
89
+ Ready : false ,
90
+ }, nil
91
+ }
84
92
85
- // set a long timeout
86
- // this context travels up to the magefile, clients that want a shorter timeout can set
87
- // it via mage's -t flag
88
- readyCtx , readyCancel := context .WithTimeout (ctx , 25 * time .Minute )
89
- defer readyCancel ()
90
-
91
- g , gCtx := errgroup .WithContext (readyCtx )
92
- for req , resp := range results {
93
- g .Go (func (req runner.StackRequest , resp * CreateDeploymentResponse ) func () error {
94
- return func () error {
95
- ready , err := p .client .DeploymentIsReady (gCtx , resp .ID , 30 * time .Second )
96
- if err != nil {
97
- return fmt .Errorf ("failed to check for cloud %s to be ready: %w" , req .Version , err )
98
- }
99
- if ! ready {
100
- return fmt .Errorf ("cloud %s never became ready: %w" , req .Version , err )
101
- }
102
- return nil
103
- }
104
- }(req , resp ))
93
+ // WaitForReady should block until the stack is ready or the context is cancelled.
94
+ func (p * provisioner ) WaitForReady (ctx context.Context , stack runner.Stack ) (runner.Stack , error ) {
95
+ deploymentID , err := p .getDeploymentID (stack )
96
+ if err != nil {
97
+ return stack , fmt .Errorf ("failed to get deployment ID from the stack: %w" , err )
105
98
}
106
- err := g .Wait ()
99
+ // allow up to 10 minutes for it to become ready
100
+ ctx , cancel := context .WithTimeout (ctx , 10 * time .Minute )
101
+ defer cancel ()
102
+ p .logger .Logf ("Waiting for cloud stack %s to be ready [stack_id: %s, deployment_id: %s]" , stack .Version , stack .ID , deploymentID )
103
+ ready , err := p .client .DeploymentIsReady (ctx , deploymentID , 30 * time .Second )
107
104
if err != nil {
108
- return nil , err
105
+ return stack , fmt . Errorf ( "failed to check for cloud %s [stack_id: %s, deployment_id: %s] to be ready: %w" , stack . Version , stack . ID , deploymentID , err )
109
106
}
110
-
111
- var stacks []runner.Stack
112
- for req , resp := range results {
113
- stacks = append (stacks , runner.Stack {
114
- ID : req .ID ,
115
- Version : req .Version ,
116
- Elasticsearch : resp .ElasticsearchEndpoint ,
117
- Kibana : resp .KibanaEndpoint ,
118
- Username : resp .Username ,
119
- Password : resp .Password ,
120
- Internal : map [string ]interface {}{
121
- "deployment_id" : resp .ID ,
122
- },
123
- })
107
+ if ! ready {
108
+ return stack , fmt .Errorf ("cloud %s [stack_id: %s, deployment_id: %s] never became ready: %w" , stack .Version , stack .ID , deploymentID , err )
124
109
}
125
- return stacks , nil
110
+ stack .Ready = true
111
+ return stack , nil
126
112
}
127
113
128
- // Clean cleans up all provisioned resources.
129
- func (p * provisioner ) Clean (ctx context.Context , stacks []runner.Stack ) error {
130
- var errs []error
131
- for _ , s := range stacks {
132
- err := p .destroyDeployment (ctx , s )
133
- if err != nil {
134
- errs = append (errs , fmt .Errorf ("failed to destroy stack %s (%s): %w" , s .Version , s .ID , err ))
135
- }
136
- }
137
- if len (errs ) > 0 {
138
- return errors .Join (errs ... )
114
+ // Delete deletes a stack.
115
+ func (p * provisioner ) Delete (ctx context.Context , stack runner.Stack ) error {
116
+ deploymentID , err := p .getDeploymentID (stack )
117
+ if err != nil {
118
+ return err
139
119
}
140
- return nil
120
+
121
+ // allow up to 1 minute for request
122
+ ctx , cancel := context .WithTimeout (ctx , 1 * time .Minute )
123
+ defer cancel ()
124
+
125
+ p .logger .Logf ("Destroying cloud stack %s [stack_id: %s, deployment_id: %s]" , stack .Version , stack .ID , deploymentID )
126
+ return p .client .ShutdownDeployment (ctx , deploymentID )
141
127
}
142
128
143
129
func (p * provisioner ) createDeployment (ctx context.Context , r runner.StackRequest , tags map [string ]string ) (* CreateDeploymentResponse , error ) {
144
130
ctx , cancel := context .WithTimeout (ctx , 1 * time .Minute )
145
131
defer cancel ()
146
132
147
- p .logger .Logf ("Creating stack %s (%s) " , r .Version , r .ID )
133
+ p .logger .Logf ("Creating cloud stack %s [stack_id: %s] " , r .Version , r .ID )
148
134
name := fmt .Sprintf ("%s-%s" , strings .Replace (p .cfg .Identifier , "." , "-" , - 1 ), r .ID )
149
135
150
136
// prepare tags
@@ -168,26 +154,21 @@ func (p *provisioner) createDeployment(ctx context.Context, r runner.StackReques
168
154
p .logger .Logf ("Failed to create ESS cloud %s: %s" , r .Version , err )
169
155
return nil , fmt .Errorf ("failed to create ESS cloud for version %s: %w" , r .Version , err )
170
156
}
171
- p .logger .Logf ("Created stack %s (%s) [id : %s]" , r .Version , r .ID , resp .ID )
157
+ p .logger .Logf ("Created cloud stack %s [stack_id: %s, deployment_id : %s]" , r .Version , r .ID , resp .ID )
172
158
return resp , nil
173
159
}
174
160
175
- func (p * provisioner ) destroyDeployment ( ctx context. Context , s runner.Stack ) error {
176
- if s .Internal == nil {
177
- return fmt .Errorf ("missing internal information" )
161
+ func (p * provisioner ) getDeploymentID ( stack runner.Stack ) ( string , error ) {
162
+ if stack .Internal == nil {
163
+ return "" , fmt .Errorf ("missing internal information" )
178
164
}
179
- deploymentIDRaw , ok := s .Internal ["deployment_id" ]
165
+ deploymentIDRaw , ok := stack .Internal ["deployment_id" ]
180
166
if ! ok {
181
- return fmt .Errorf ("missing internal deployment_id" )
167
+ return "" , fmt .Errorf ("missing internal deployment_id" )
182
168
}
183
169
deploymentID , ok := deploymentIDRaw .(string )
184
170
if ! ok {
185
- return fmt .Errorf ("internal deployment_id not a string" )
171
+ return "" , fmt .Errorf ("internal deployment_id not a string" )
186
172
}
187
-
188
- ctx , cancel := context .WithTimeout (ctx , 1 * time .Minute )
189
- defer cancel ()
190
-
191
- p .logger .Logf ("Destroying stack %s (%s)" , s .Version , s .ID )
192
- return p .client .ShutdownDeployment (ctx , deploymentID )
173
+ return deploymentID , nil
193
174
}
0 commit comments