Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI unseal screen updates #11705

Merged
merged 6 commits into from
May 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelog/11705.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:improvement
ui: Add specific error message if unseal fails due to license
```
5 changes: 5 additions & 0 deletions ui/app/controllers/vault/cluster/unseal.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Controller from '@ember/controller';

export default Controller.extend({
wizard: service(),
showLicenseError: false,

actions: {
transitionToCluster(resp) {
Expand All @@ -19,5 +20,9 @@ export default Controller.extend({
isUnsealed(data) {
return data.sealed === false;
},

handleLicenseError() {
this.set('showLicenseError', true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we still use this.set?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, possibly because this is in a controller? I considered moving all of this logic to a separate component that we can glimmerize but that seemed out of scope for this, especially considering the backport

},
},
});
10 changes: 10 additions & 0 deletions ui/app/styles/components/empty-state.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@
box-shadow: 0 -2px 0 -1px $ui-gray-300;
}

.empty-state-transparent {
align-items: center;
color: $grey;
background: transparent;
display: flex;
justify-content: center;
padding: $spacing-xxl 0;
box-shadow: none;
}

.empty-state-content {
max-width: 320px;
}
Expand Down
2 changes: 1 addition & 1 deletion ui/app/styles/components/splash-page.scss
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
}

.splash-page-header {
padding: $size-6 $size-5;
padding: $size-6 0;
}
86 changes: 60 additions & 26 deletions ui/app/templates/vault/cluster/unseal.hbs
Original file line number Diff line number Diff line change
@@ -1,26 +1,60 @@
<SplashPage as |Page|>
<Page.header>
<h1 class="title is-3">
Unseal Vault
</h1>
</Page.header>
<Page.content>
<AlertBanner
@type="warning"
@title="{{capitalize model.name}} is {{if model.unsealed 'unsealed' 'sealed'}}"
@message="You can unseal the vault by entering a portion of the master key. Once all portions are entered, the vault will be unsealed."
@class="unseal-warning"
data-test-cluster-status
/>
<ShamirFlow
@action="unseal"
@onUpdate={{action 'setUnsealState'}}
@onShamirSuccess={{action 'transitionToCluster'}}
@buttonText="Unseal"
@thresholdPath="t"
@isComplete={{action 'isUnsealed'}}
@threshold={{model.sealThreshold}}
@progress={{model.sealProgress}}
/>
</Page.content>
</SplashPage>
{{#if showLicenseError}}
<NavHeader as |Nav|>
<Nav.home>
<HomeLink @class="navbar-item splash-page-logo has-text-white">
<LogoEdition />
</HomeLink>
</Nav.home>
<Nav.items>
<div class="navbar-item status-indicator-button" data-status="{{if activeCluster.unsealed "good" "bad"}}">
<StatusMenu @label="Status" @onLinkClick={{action Nav.closeDrawer}} />
</div>
</Nav.items>
</NavHeader>
<div class="section is-flex-v-centered-tablet is-flex-1 is-fullwidth">
<div class="columns is-centered is-gapless is-fullwidth">
<EmptyState
class="empty-state-transparent"
@title="License required"
@subTitle="Vault license has terminated"
@icon="disabled"
@bottomBorder={{true}}
@message="Your Vault license has terminated and Vault is sealed. To unseal, add a current license to your configuration and restart Vault."
>
<p class="align-right"><a href="https://learn.hashicorp.com/tutorials/nomad/hashicorp-enterprise-license" rel="noreferrer noopener">License documentation</a></p>
</EmptyState>
</div>
</div>
{{else}}
<SplashPage as |Page|>
<Page.header>
<h1 class="title is-3">
Unseal Vault
</h1>
</Page.header>
<Page.content>
<div class="box is-borderless is-shadowless is-marginless">
<p class="title is-5">{{capitalize model.name}} is {{if model.unsealed 'unsealed' 'sealed'}}</p>
<p>
Unseal Vault by entering portions of the unseal key. This can be done via multiple mechanisms on multiple computers. Once all portions are entered, the root key will be decrypted and Vault will unseal.
</p>
</div>
<ShamirFlow
@action="unseal"
@onUpdate={{action 'setUnsealState'}}
@onLicenseError={{action 'handleLicenseError'}}
@onShamirSuccess={{action 'transitionToCluster'}}
@buttonText="Unseal"
@thresholdPath="t"
@isComplete={{action 'isUnsealed'}}
@threshold={{model.sealThreshold}}
@progress={{model.sealProgress}}
/>
</Page.content>
<Page.footer>
<div class="box is-borderless is-shadowless">
<p><a target="_blank" rel="noreferrer noopener" href="https://www.vaultproject.io/docs/concepts/seal">Seal/unseal documentation</a></p>
</div>
</Page.footer>
</SplashPage>
{{/if}}
2 changes: 1 addition & 1 deletion ui/lib/core/addon/components/empty-state.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import layout from '../templates/components/empty-state';
* @param title=null{String} - A short label for the empty state
* @param subTitle=null{String} - A sub title that goes underneath the main title
* @param message=null{String} - A description of why a user might be seeing the empty state and possibly instructions for actions they may take.
* @param [icon='']{String} - An optional param to display icon to the right of the title
* @param [icon='']{String} - An optional param to display icon to the left of the title
* @param bottomBorder=false{Boolean} - A bottom border underneath the message. Generally used when you have links under the message
*/

Expand Down
5 changes: 5 additions & 0 deletions ui/lib/core/addon/components/shamir-flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export default Component.extend(DEFAULTS, {
},

onUpdate() {},
onLicenseError() {},
onShamirSuccess() {},
// can be overridden w/an attr
isComplete(data) {
Expand Down Expand Up @@ -88,6 +89,10 @@ export default Component.extend(DEFAULTS, {
if (e.httpStatus === 400) {
this.set('errors', e.errors);
} else {
// if licensing error, trigger parent method to handle
if (e.httpStatus === 500 && e.errors?.join(' ').includes('licensing is in an invalid state')) {
this.onLicenseError();
}
throw e;
}
},
Expand Down
2 changes: 1 addition & 1 deletion ui/lib/core/addon/templates/components/shamir-flow.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@
</div>
<div class="field">
<label for="key" class="is-label">
Master Key Portion
Unseal Key Portion
</label>
<div class="control">
{{input class="input"type="password" name="key" value=key data-test-shamir-input=true}}
Expand Down