vault/ui/lib/replication/addon/components/enable-replication-form.hbs
Chelsea Shaw 349e449d49
UI: Glimmerize replication enable form (#26417)
* 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>
2024-04-15 15:30:33 -05:00

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>