feat(sr): get the non-healthy vdi chains (#587)
See vatesfr/xo-web#2178
This commit is contained in:
parent
465c25e71c
commit
b9e2a28915
@ -817,3 +817,17 @@ reattachIso.params = {
|
|||||||
reattachIso.resolve = {
|
reattachIso.resolve = {
|
||||||
host: ['host', 'host', 'administrate']
|
host: ['host', 'host', 'administrate']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
|
export function getUnhealthyVdiChainsLength ({ sr }) {
|
||||||
|
return this.getXapi(sr).getUnhealthyVdiChainsLength(sr)
|
||||||
|
}
|
||||||
|
|
||||||
|
getUnhealthyVdiChainsLength.params = {
|
||||||
|
id: { type: 'string' }
|
||||||
|
}
|
||||||
|
|
||||||
|
getUnhealthyVdiChainsLength.resolve = {
|
||||||
|
sr: ['id', 'SR', 'operate']
|
||||||
|
}
|
||||||
|
@ -739,14 +739,16 @@ export default class Xapi extends XapiBase {
|
|||||||
return promise
|
return promise
|
||||||
}
|
}
|
||||||
|
|
||||||
_assertHealthyVdiChain (vdi, childrenMap) {
|
_assertHealthyVdiChain (vdi, cache) {
|
||||||
if (vdi == null) {
|
if (vdi == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vdi.managed) {
|
if (!vdi.managed) {
|
||||||
|
const { SR } = vdi
|
||||||
|
let childrenMap = cache[SR]
|
||||||
if (childrenMap === undefined) {
|
if (childrenMap === undefined) {
|
||||||
childrenMap = groupBy(vdi.$SR.$VDIs, _ => _.sm_config['vhd-parent'])
|
childrenMap = cache[SR] = groupBy(vdi.$SR.$VDIs, _ => _.sm_config['vhd-parent'])
|
||||||
}
|
}
|
||||||
|
|
||||||
// an unmanaged VDI should not have exactly one child: they
|
// an unmanaged VDI should not have exactly one child: they
|
||||||
@ -762,13 +764,14 @@ export default class Xapi extends XapiBase {
|
|||||||
|
|
||||||
this._assertHealthyVdiChain(
|
this._assertHealthyVdiChain(
|
||||||
this.getObjectByUuid(vdi.sm_config['vhd-parent'], null),
|
this.getObjectByUuid(vdi.sm_config['vhd-parent'], null),
|
||||||
childrenMap
|
cache
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
_assertHealthyVdiChains (vm) {
|
_assertHealthyVdiChains (vm) {
|
||||||
|
const cache = createRawObject()
|
||||||
forEach(vm.$VBDs, ({ $VDI }) => {
|
forEach(vm.$VBDs, ({ $VDI }) => {
|
||||||
this._assertHealthyVdiChain($VDI)
|
this._assertHealthyVdiChain($VDI, cache)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
import {
|
import {
|
||||||
|
forEach,
|
||||||
|
groupBy
|
||||||
|
} from 'lodash'
|
||||||
|
|
||||||
|
import {
|
||||||
|
createRawObject,
|
||||||
mapToArray
|
mapToArray
|
||||||
} from '../../utils'
|
} from '../../utils'
|
||||||
|
|
||||||
@ -49,5 +55,38 @@ export default {
|
|||||||
|
|
||||||
async unplugPbd (id) {
|
async unplugPbd (id) {
|
||||||
await this._unplugPbd(this.getObject(id))
|
await this._unplugPbd(this.getObject(id))
|
||||||
|
},
|
||||||
|
|
||||||
|
_getUnhealthyVdiChainLength (uuid, childrenMap, cache) {
|
||||||
|
let length = cache[uuid]
|
||||||
|
if (length === undefined) {
|
||||||
|
const children = childrenMap[uuid]
|
||||||
|
length = children !== undefined && children.length === 1
|
||||||
|
? 1
|
||||||
|
: 0
|
||||||
|
const parent = this.getObjectByUuid(uuid).sm_config['vhd-parent']
|
||||||
|
if (parent !== undefined) {
|
||||||
|
length += this._getUnhealthyVdiChainLength(parent, childrenMap, cache)
|
||||||
|
}
|
||||||
|
cache[uuid] = length
|
||||||
|
}
|
||||||
|
return length
|
||||||
|
},
|
||||||
|
|
||||||
|
getUnhealthyVdiChainsLength (sr) {
|
||||||
|
const vdis = this.getObject(sr).$VDIs
|
||||||
|
const unhealthyVdis = createRawObject()
|
||||||
|
const children = groupBy(vdis, 'sm_config.vhd-parent')
|
||||||
|
const cache = createRawObject()
|
||||||
|
forEach(vdis, vdi => {
|
||||||
|
if (vdi.managed && !vdi.is_a_snapshot) {
|
||||||
|
const { uuid } = vdi
|
||||||
|
const length = this._getUnhealthyVdiChainLength(uuid, children, cache)
|
||||||
|
if (length !== 0) {
|
||||||
|
unhealthyVdis[uuid] = length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return unhealthyVdis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user