/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; import { inject as service } from '@ember/service'; import { alias, and, equal, gte, not, or } from '@ember/object/computed'; import { get, computed } from '@ember/object'; export default Model.extend({ version: service(), nodes: hasMany('nodes', { async: false }), name: attr('string'), status: attr('string'), standby: attr('boolean'), type: attr('string'), license: attr('object'), /* Licensing concerns */ licenseExpiry: alias('license.expiry_time'), licenseState: alias('license.state'), needsInit: computed('nodes', 'nodes.@each.initialized', function () { // needs init if no nodes are initialized return this.nodes.isEvery('initialized', false); }), unsealed: computed('nodes', 'nodes.{[],@each.sealed}', function () { // unsealed if there's at least one unsealed node return !!this.nodes.findBy('sealed', false); }), sealed: not('unsealed'), leaderNode: computed('nodes', 'nodes.[]', function () { const nodes = this.nodes; if (nodes.get('length') === 1) { return nodes.get('firstObject'); } else { return nodes.findBy('isLeader'); } }), sealThreshold: alias('leaderNode.sealThreshold'), sealProgress: alias('leaderNode.progress'), sealType: alias('leaderNode.type'), storageType: alias('leaderNode.storageType'), hcpLinkStatus: alias('leaderNode.hcpLinkStatus'), hasProgress: gte('sealProgress', 1), usingRaft: equal('storageType', 'raft'), //replication mode - will only ever be 'unsupported' //otherwise the particular mode will have the relevant mode attr through replication-attributes mode: attr('string'), allReplicationDisabled: and('{dr,performance}.replicationDisabled'), anyReplicationEnabled: or('{dr,performance}.replicationEnabled'), dr: belongsTo('replication-attributes', { async: false, inverse: null }), performance: belongsTo('replication-attributes', { async: false, inverse: null }), // this service exposes what mode the UI is currently viewing // replicationAttrs will then return the relevant `replication-attributes` model rm: service('replication-mode'), drMode: alias('dr.mode'), replicationMode: alias('rm.mode'), replicationModeForDisplay: computed('replicationMode', function () { return this.replicationMode === 'dr' ? 'Disaster Recovery' : 'Performance'; }), replicationIsInitializing: computed('dr.mode', 'performance.mode', function () { // a mode of null only happens when a cluster is being initialized // otherwise the mode will be 'disabled', 'primary', 'secondary' return !this.dr.mode || !this.performance.mode; }), replicationAttrs: computed('dr.mode', 'performance.mode', 'replicationMode', function () { const replicationMode = this.replicationMode; return replicationMode ? get(this, replicationMode) : null; }), });