mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-19 13:41:10 +02:00
* Glimmerize replication controllers * Add enable-replication-form component with tests * use EnableReplicationForm in index and mode routes * clean up enable action from replication-actions mixin * fix test failure for structuredClone * stabilize tests, remove enable action from replication-actions and replication-summary * Update ui/lib/replication/addon/controllers/replication-mode.js Co-authored-by: claire bontempo <68122737+hellobontempo@users.noreply.github.com> * address PR comments * stabilize oidc test? --------- Co-authored-by: claire bontempo <68122737+hellobontempo@users.noreply.github.com>
178 lines
6.8 KiB
Handlebars
178 lines
6.8 KiB
Handlebars
{{!
|
|
Copyright (c) HashiCorp, Inc.
|
|
SPDX-License-Identifier: BUSL-1.1
|
|
~}}
|
|
|
|
<form {{on "submit" (fn this.onSubmit this.data)}} data-test-replication-enable-form>
|
|
<MessageError @errorMessage={{this.error}} />
|
|
|
|
<div class="box is-sideless is-fullwidth is-marginless">
|
|
<label for="replication-mode" class="is-label">
|
|
Cluster mode
|
|
</label>
|
|
<div class="field is-expanded">
|
|
<div class="control select is-fullwidth">
|
|
<select {{on "change" this.inputChange}} id="replication-mode" name="mode" data-test-replication-cluster-mode-select>
|
|
{{#each (array "primary" "secondary") as |modeOption|}}
|
|
<option selected={{eq this.data.mode modeOption}} value={{modeOption}}>
|
|
{{modeOption}}
|
|
</option>
|
|
{{/each}}
|
|
</select>
|
|
</div>
|
|
{{#if (eq this.data.mode "secondary")}}
|
|
<AlertInline
|
|
class="has-top-margin-xs"
|
|
@type="warning"
|
|
@message="This will immediately clear all data in this cluster!"
|
|
/>
|
|
{{/if}}
|
|
</div>
|
|
{{#if (eq this.data.mode "primary")}}
|
|
{{#if @canEnablePrimary}}
|
|
<div class="field">
|
|
<label for="primary_cluster_addr" class="is-label">
|
|
Primary cluster address
|
|
<em class="is-optional">(optional)</em>
|
|
</label>
|
|
<div class="control">
|
|
<input
|
|
class="input"
|
|
id="primary_cluster_addr"
|
|
name="primary_cluster_addr"
|
|
value={{this.data.primary_cluster_addr}}
|
|
{{on "change" this.inputChange}}
|
|
data-test-input="primary_cluster_addr"
|
|
/>
|
|
</div>
|
|
<p class="help has-text-grey">
|
|
Overrides the cluster address that the primary gives to secondary nodes.
|
|
</p>
|
|
</div>
|
|
{{else}}
|
|
<p data-test-not-allowed>
|
|
The token you are using is not authorized to enable primary replication.
|
|
</p>
|
|
{{/if}}
|
|
{{else}}
|
|
{{#if @canEnableSecondary}}
|
|
{{#if (and (eq @replicationMode "dr") this.performanceReplicationEnabled (has-feature "Performance Replication"))}}
|
|
<div>
|
|
<ToggleButton
|
|
@isOpen={{this.showExplanation}}
|
|
@openLabel="Disable Performance Replication in order to enable this cluster as a DR secondary."
|
|
@closedLabel="Disable Performance Replication in order to enable this cluster as a DR secondary."
|
|
@onClick={{fn (mut this.showExplanation)}}
|
|
class="has-text-danger"
|
|
data-test-disable-to-continue
|
|
/>
|
|
{{#if this.showExplanation}}
|
|
<p data-test-disable-explanation>
|
|
When running as a DR Secondary Vault is read only. For this reason, we don't allow other Replication modes to
|
|
operate at the same time. This cluster is also currently operating as a Performance
|
|
{{capitalize @performanceMode}}.
|
|
</p>
|
|
{{/if}}
|
|
</div>
|
|
{{else}}
|
|
<div class="field">
|
|
<label for="secondary-token" class="is-label">
|
|
Secondary activation token
|
|
</label>
|
|
<div class="control">
|
|
<Textarea
|
|
@value={{this.data.token}}
|
|
id="secondary-token"
|
|
name="secondary-token"
|
|
class="textarea"
|
|
data-test-textarea="secondary-token"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div class="field">
|
|
<label for="primary_api_addr" class="is-label">
|
|
Primary API address
|
|
{{#if (not (and this.data.token (not this.data.tokenIncludesAPIAddr)))}}
|
|
<em class="is-optional">(optional)</em>
|
|
{{/if}}
|
|
</label>
|
|
<div class="control">
|
|
<input
|
|
id="primary_api_addr"
|
|
name="primary_api_addr"
|
|
class="input"
|
|
value={{this.data.primary_api_addr}}
|
|
{{on "change" this.inputChange}}
|
|
data-test-input="primary_api_addr"
|
|
/>
|
|
</div>
|
|
<p class="help {{if (and this.data.token (not this.data.tokenIncludesAPIAddr)) 'is-danger' 'has-text-grey'}}">
|
|
{{#if (and this.data.token (not this.data.tokenIncludesAPIAddr))}}
|
|
The supplied token does not contain an embedded address for the primary cluster. Please enter the primary
|
|
cluster's API address (normal Vault address).
|
|
{{else}}
|
|
Set this to the API address (normal Vault address) to override the value embedded in the token.
|
|
{{/if}}
|
|
</p>
|
|
</div>
|
|
<div class="field">
|
|
<label for="ca_file" class="is-label">
|
|
CA file
|
|
<em class="is-optional">(optional)</em>
|
|
</label>
|
|
<div class="control">
|
|
<input
|
|
id="ca_file"
|
|
name="ca_file"
|
|
class="input"
|
|
value={{this.data.ca_file}}
|
|
{{on "change" this.inputChange}}
|
|
data-test-input="ca_file"
|
|
/>
|
|
</div>
|
|
<p class="help has-text-grey">
|
|
Specifies the path to a CA root file (PEM format) that the secondary can use when unwrapping the token from the
|
|
primary.
|
|
</p>
|
|
</div>
|
|
<div class="field">
|
|
<label for="ca_path" class="is-label">
|
|
CA path
|
|
<em class="is-optional">(optional)</em>
|
|
</label>
|
|
<div class="control">
|
|
<input
|
|
id="ca_path"
|
|
name="ca_path"
|
|
class="input"
|
|
value={{this.data.ca_path}}
|
|
{{on "change" this.inputChange}}
|
|
data-test-input="ca_path"
|
|
/>
|
|
</div>
|
|
<p class="help has-text-grey">
|
|
Specifies the path to a CA root directory containing PEM-format files that the secondary can use when
|
|
unwrapping the token from the primary.
|
|
</p>
|
|
</div>
|
|
<p>
|
|
Note: If both
|
|
<code>CA file</code>
|
|
and
|
|
<code>CA path</code>
|
|
are not given, they default to system CA roots.
|
|
</p>
|
|
{{/if}}
|
|
{{else}}
|
|
<p data-test-not-allowed>The token you are using is not authorized to enable secondary replication.</p>
|
|
{{/if}}
|
|
{{/if}}
|
|
</div>
|
|
{{#if
|
|
(or (and (eq this.data.mode "primary") @canEnablePrimary) (and (eq this.data.mode "secondary") @canEnableSecondary))
|
|
}}
|
|
<div class="field is-grouped box is-fullwidth is-bottomless">
|
|
<Hds::Button @text="Enable Replication" type="submit" disabled={{this.disallowEnable}} data-test-replication-enable />
|
|
</div>
|
|
{{/if}}
|
|
</form> |