/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import Model, { attr } from '@ember-data/model'; import { match, not } from '@ember/object/computed'; import { computed } from '@ember/object'; export default Model.extend({ clusterId: attr('string'), clusterIdDisplay: computed('clusterId', 'mode', function () { const clusterId = this.clusterId; return clusterId ? clusterId.split('-')[0] : null; }), mode: attr('string'), replicationDisabled: match('mode', /disabled|unsupported/), replicationUnsupported: match('mode', /unsupported/), replicationEnabled: not('replicationDisabled'), // primary attrs isPrimary: match('mode', /primary/), knownSecondaries: attr('array'), secondaries: attr('array'), // secondary attrs isSecondary: match('mode', /secondary/), connection_state: attr('string'), modeForUrl: computed('isPrimary', 'isSecondary', 'mode', function () { const mode = this.mode; return mode === 'bootstrapping' ? 'bootstrapping' : (this.isSecondary && 'secondary') || (this.isPrimary && 'primary'); }), modeForHeader: computed('mode', function () { const mode = this.mode; if (!mode) { // mode will be false or undefined if it calls the status endpoint while still setting up the cluster return 'loading'; } return mode; }), secondaryId: attr('string'), primaryClusterAddr: attr('string'), knownPrimaryClusterAddrs: attr('array'), primaries: attr('array'), state: attr('string'), //stream-wal, merkle-diff, merkle-sync, idle lastRemoteWAL: attr('number'), // attrs on primary and secondary lastWAL: attr('number'), merkleRoot: attr('string'), merkleSyncProgress: attr('object'), get syncProgress() { const { state, merkleSyncProgress } = this; if (state !== 'merkle-sync' || !merkleSyncProgress) { return null; } const { sync_total_keys, sync_progress } = merkleSyncProgress; return { progress: sync_progress, total: sync_total_keys, }; }, syncProgressPercent: computed('syncProgress', function () { const syncProgress = this.syncProgress; if (!syncProgress) { return null; } const { progress, total } = syncProgress; return Math.floor(100 * (progress / total)); }), modeDisplay: computed('mode', function () { const displays = { disabled: 'Disabled', unknown: 'Unknown', bootstrapping: 'Bootstrapping', primary: 'Primary', secondary: 'Secondary', unsupported: 'Not supported', }; return displays[this.mode] || 'Disabled'; }), });