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/replication/primary reindexing #8906

14 changes: 14 additions & 0 deletions ui/app/adapters/replication-mode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import ApplicationAdapter from './application';

export default ApplicationAdapter.extend({
getStatusUrl(mode) {
return this.buildURL() + `/replication/${mode}/status`;
},

fetchStatus(mode) {
let url = this.getStatusUrl(mode);
return this.ajax(url, 'GET', { unauthenticated: true }).then(resp => {
return resp.data;
});
},
});
38 changes: 38 additions & 0 deletions ui/app/models/replication-mode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import DS from 'ember-data';
const { attr } = DS;

/* sample response

{
"request_id": "d81bba81-e8a1-0ee9-240e-a77d36e3e08f",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"cluster_id": "ab7d4191-d1a3-b4d6-6297-5a41af6154ae",
"known_secondaries": [
"test"
],
"last_performance_wal": 72,
"last_reindex_epoch": "1588281113",
"last_wal": 73,
"merkle_root": "c8d258d376f01d98156f74e8d8f82ea2aca8dc4a",
"mode": "primary",
"primary_cluster_addr": "",
"reindex_building_progress": 26838,
"reindex_building_total": 305443,
"reindex_in_progress": true,
"reindex_stage": "building",
"state": "running"
},
"wrap_info": null,
"warnings": null,
"auth": null
}


*/

export default DS.Model.extend({
status: attr('object'),
});
12 changes: 12 additions & 0 deletions ui/app/serializers/replication-mode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import ApplicationSerializer from './application';

export default ApplicationSerializer.extend({
normalizeResponse(store, primaryModelClass, payload, id, requestType) {
const normalizedPayload = {
id: payload.id,
status: payload.data,
};

return this._super(store, primaryModelClass, normalizedPayload, id, requestType);
},
});
29 changes: 25 additions & 4 deletions ui/lib/core/addon/components/replication-dashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,35 @@ export default Component.extend({
data: null,
replicationDetails: null,
isSecondary: null,
dr: null,
isSyncing: computed('replicationDetails', 'isSecondary', function() {
const { state } = this.replicationDetails;
const isSecondary = this.isSecondary;
return isSecondary && state && clusterStates([state]).isSyncing;
}),
isReindexing: computed('data', function() {
// TODO: make this a real value
return false;
isReindexing: computed('replicationDetails', function() {
const { replicationDetails } = this;
return !!replicationDetails.reindex_in_progress;
}),
reindexingStage: computed('replicationDetails', function() {
const { replicationDetails } = this;
const stage = replicationDetails.reindex_stage;
// specify the stage if we have one
if (stage) {
return `: ${stage}`;
}
return '';
}),
reindexingProgress: computed('replicationDetails', function() {
// TODO: use this value to display a progress bar
const { replicationDetails } = this;
const { reindex_building_progress, reindex_building_total } = replicationDetails;
Copy link
Contributor

Choose a reason for hiding this comment

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

Small nit: these two lines can be combined like: const { reindex_building_progress, reindex_building_total } = this.replicationDetails;

let progress = '';

if (reindex_building_progress && reindex_building_total) {
// convert progress to a percentage
progress = (reindex_building_progress / reindex_building_total) * 100;
}

return progress;
}),
});
22 changes: 22 additions & 0 deletions ui/lib/core/addon/components/replication-page.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import Component from '@ember/component';
import { computed } from '@ember/object';
import layout from '../templates/components/replication-page';
import { inject as service } from '@ember/service';
import { task } from 'ember-concurrency';

const MODE = {
dr: 'Disaster Recovery',
Expand All @@ -9,6 +11,26 @@ const MODE = {

export default Component.extend({
layout,
store: service(),
reindexingDetails: null,

didReceiveAttrs() {
this._super(arguments);
this.getReplicationModeStatus.perform();
},
getReplicationModeStatus: task(function*() {
let resp;
const { replicationMode } = this.model;
try {
resp = yield this.get('store')
.adapterFor('replication-mode')
.fetchStatus(replicationMode);
} catch (e) {
console.log(e);
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we want to set some sort of error on the page if we aren't able to get the status? Or is that even a realistic scenario?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

great question! i think we should be fine in this scenario because if we can't find the reindexing status we just wouldn't show the reindexing alert at the top of the page. the only reason i could see us getting an API error here is if the replication mode wasn't set, but i don't think that should ever happen 'cause these components are only used on pages where replication is already enabled & thus the mode is set. :)

}
this.set('reindexingDetails', resp);
}),

replicationMode: computed('model.{replicationMode}', function() {
// dr or performance 🤯
let mode = this.model.replicationMode;
Expand Down
1 change: 0 additions & 1 deletion ui/lib/core/addon/mixins/replication-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ export default Mixin.create({
}, {});
delete data.replicationMode;
}

return yield this.save.perform(action, replicationMode, clusterMode, data);
}),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@
{{/if}}
{{/if}}

{{!-- TODO check for actual reindexing status --}}
{{#if isReindexing}}
<AlertBanner
@title="Re-indexing in progress: Scanning"
@title={{concat "Re-indexing in progress" reindexingStage}}
@type="info"
@secondIconType="loading"
@message="This can cause a delay depending on the size of the data store. You can use Vault during this time."/>
Expand Down
23 changes: 16 additions & 7 deletions ui/lib/core/addon/templates/components/replication-page.hbs
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
<div class="replication-page">
{{yield (hash
header=(component 'replication-header' data=model title=replicationMode isSecondary=isSecondary)
toggle=(component 'replication-toggle')
dashboard=(component 'replication-dashboard' data=model isSecondary=isSecondary replicationDetails=replicationDetails clusterMode=clusterMode)
isDisabled=isDisabled
message=message
)}}
{{yield
(hash
header=(component 'replication-header' data=model title=replicationMode isSecondary=isSecondary)
toggle=(component 'replication-toggle')
dashboard=(component
'replication-dashboard'
data=model
isSecondary=isSecondary
replicationDetails=replicationDetails
clusterMode=clusterMode
reindexingDetails=reindexingDetails
)
isDisabled=isDisabled
message=message
)
}}
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@
{{#if (eq replicationAttrs.mode 'initializing')}}
The cluster is initializing replication. This may take some time.
{{else}}
<p>{{cluster.replicationModeStatus.cluster_id}}</p>
<div class="replication">
<ReplicationPage @model={{cluster}} as |Page|>
<Page.toggle />
Expand Down