querysub 0.695.0 → 0.697.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -106,22 +106,59 @@ export function confirmNoOverlapDeploy(actionLabel: string, onConfirm: () => voi
|
|
|
106
106
|
});
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
+
const CONFIRM_LIST_MAX_HEIGHT = 220;
|
|
110
|
+
|
|
111
|
+
/** Deploying every outdated service restarts all of them at once, which is most of the cluster — worth naming what is about to restart before it happens. */
|
|
112
|
+
class DeployAllConfirmModal extends qreact.Component<{ titles: string[]; latestRef: string; onConfirm: () => void }> {
|
|
113
|
+
render() {
|
|
114
|
+
let count = this.props.titles.length;
|
|
115
|
+
return <div className={css.vbox(14).maxWidth(560)}>
|
|
116
|
+
<div className={css.fontSize(18).boldStyle}>Deploy {count} service{count === 1 && "" || "s"}?</div>
|
|
117
|
+
<div>
|
|
118
|
+
Each one restarts onto {this.props.latestRef.slice(0, 6)}. The old instances keep running for {formatTime(DEFAULT_OVERLAP_TIME)} before shutting down, so there is somewhere for connections to go while clients move across.
|
|
119
|
+
</div>
|
|
120
|
+
<div className={css.vbox(2).fillWidth.maxHeight(CONFIRM_LIST_MAX_HEIGHT).overflowAuto}>
|
|
121
|
+
{this.props.titles.map(title => <div>{title}</div>)}
|
|
122
|
+
</div>
|
|
123
|
+
<div className={css.hbox(10)}>
|
|
124
|
+
<button
|
|
125
|
+
className={buttonStyle.hsl(120, 70, 90)}
|
|
126
|
+
onClick={() => {
|
|
127
|
+
closeAllModals();
|
|
128
|
+
this.props.onConfirm();
|
|
129
|
+
}}
|
|
130
|
+
>
|
|
131
|
+
Deploy & Restart All ({count})
|
|
132
|
+
</button>
|
|
133
|
+
<button className={buttonStyle.hsl(0, 0, 90)} onClick={() => closeAllModals()}>
|
|
134
|
+
Cancel
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export function confirmDeployAll(config: { titles: string[]; latestRef: string; onConfirm: () => void }) {
|
|
141
|
+
showFullscreenModal({
|
|
142
|
+
content: <DeployAllConfirmModal titles={config.titles} latestRef={config.latestRef} onConfirm={config.onConfirm} />,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
109
146
|
export class UpdateButtons extends qreact.Component<{
|
|
110
147
|
services: ServiceConfig[];
|
|
111
148
|
}> {
|
|
112
149
|
state = t.state({
|
|
113
150
|
isDeploying: t.type(false),
|
|
114
151
|
});
|
|
115
|
-
// Deploys all outdated services to latestRef, always immediately. The overlap is what keeps the service up - the old instances keep running for it, so connections have somewhere to go while clients move across.
|
|
116
|
-
private deployAll(outdatedServices: ServiceConfig[], latestRef: string
|
|
152
|
+
// Deploys all outdated services to latestRef, always immediately. The overlap is what keeps the service up - the old instances keep running for it, so connections have somewhere to go while clients move across.
|
|
153
|
+
private deployAll(outdatedServices: ServiceConfig[], latestRef: string) {
|
|
117
154
|
this.state.isDeploying = true;
|
|
118
155
|
// Props are synchronized state, so everything the async work needs is cloned into plain locals HERE, in the synced part
|
|
119
156
|
let toDeploy = outdatedServices.map(service => {
|
|
120
157
|
let updated = deepCloneJSON(service);
|
|
121
158
|
updated.parameters.gitRef = latestRef;
|
|
122
159
|
updated.parameters.releaseTime = Date.now();
|
|
123
|
-
// Always set, never inherited: the overlap belongs to the deploy being made, and leaving the previous deploy's value in place means one no-overlap deploy silently makes every later deploy a no-overlap one.
|
|
124
|
-
updated.parameters.overlapTime =
|
|
160
|
+
// Always set, never inherited: the overlap belongs to the deploy being made, and leaving the previous deploy's value in place means one no-overlap deploy silently makes every later deploy a no-overlap one.
|
|
161
|
+
updated.parameters.overlapTime = DEFAULT_OVERLAP_TIME;
|
|
125
162
|
return updated;
|
|
126
163
|
});
|
|
127
164
|
let controller = MachineServiceController(SocketFunction.browserNodeId());
|
|
@@ -190,9 +227,13 @@ export class UpdateButtons extends qreact.Component<{
|
|
|
190
227
|
<button
|
|
191
228
|
className={buttonStyle.hsl(120, 70, 90)}
|
|
192
229
|
disabled={this.state.isDeploying}
|
|
193
|
-
title="
|
|
230
|
+
title="Asks first, then deploys; the old instances keep running for their configured overlap before shutting down"
|
|
194
231
|
onClick={() => {
|
|
195
|
-
|
|
232
|
+
confirmDeployAll({
|
|
233
|
+
titles: outdatedServices.map(service => service.info.title),
|
|
234
|
+
latestRef: gitInfo.latestRef,
|
|
235
|
+
onConfirm: () => this.deployAll(outdatedServices, gitInfo.latestRef),
|
|
236
|
+
});
|
|
196
237
|
}}
|
|
197
238
|
>
|
|
198
239
|
<div>
|
|
@@ -208,17 +249,15 @@ export class UpdateButtons extends qreact.Component<{
|
|
|
208
249
|
</div>)}
|
|
209
250
|
</button>
|
|
210
251
|
<button
|
|
211
|
-
className={buttonStyle.hsl(
|
|
252
|
+
className={buttonStyle.hsl(45, 85, 82)}
|
|
212
253
|
disabled={this.state.isDeploying}
|
|
213
|
-
title="Deploys
|
|
254
|
+
title="Deploys every outdated service straight away, without asking. Same overlap as the confirmed deploy — the old instances keep running before shutting down"
|
|
214
255
|
onClick={() => {
|
|
215
|
-
|
|
216
|
-
this.deployAll(outdatedServices, gitInfo.latestRef, true);
|
|
217
|
-
});
|
|
256
|
+
this.deployAll(outdatedServices, gitInfo.latestRef);
|
|
218
257
|
}}
|
|
219
258
|
>
|
|
220
259
|
<div>
|
|
221
|
-
{bigEmoji("⚡")} <span>{this.state.isDeploying && "⏳ Deploying..." || `Deploy All (${outdatedServices.length})
|
|
260
|
+
{bigEmoji("⚡")} <span>{this.state.isDeploying && "⏳ Deploying..." || `Deploy All Now (${outdatedServices.length})`}</span>
|
|
222
261
|
</div>
|
|
223
262
|
</button>
|
|
224
263
|
</>}
|