Skip to content

Commit 179ae8d

Browse files
committed
ui: show extensionresourcemap details for resource
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent d88a55a commit 179ae8d

3 files changed

Lines changed: 134 additions & 35 deletions

File tree

ui/src/components/view/DetailsTab.vue

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,6 @@
185185
</div>
186186
</div>
187187
</a-list-item>
188-
<a-list-item v-else-if="item === 'externaldetails' && ['host', 'computeoffering'].includes($route.meta.name) && filteredExternalDetails">
189-
<div>
190-
<strong>{{ ['host', 'computeoffering'].includes($route.meta.name) ? $t('label.externaldetails') : $t('label.configuration.details') }}</strong>
191-
<br/>
192-
<div>
193-
<object-list-table :data-map="filteredExternalDetails" />
194-
</div>
195-
</div>
196-
</a-list-item>
197188
<a-list-item v-else-if="item === 'parameters' && ['customaction'].includes($route.meta.name) && Array.isArray(dataResource[item]) && dataResource[item].length > 0">
198189
<div>
199190
<strong>{{ $t('label.' + String(item).toLowerCase()) }}</strong>
@@ -203,6 +194,9 @@
203194
</div>
204195
</div>
205196
</a-list-item>
197+
<external-configuration-details
198+
v-else-if="item === 'externaldetails' && (['host', 'computeoffering'].includes($route.meta.name) || (['cluster'].includes($route.meta.name) && dataResource.extensionid))"
199+
:resource="dataResource" />
206200
</template>
207201
<HostInfo :resource="dataResource" v-if="$route.meta.name === 'host' && 'listHosts' in $store.getters.apis" />
208202
<DedicateData :resource="dataResource" v-if="dedicatedSectionActive" />
@@ -214,7 +208,8 @@
214208
import DedicateData from './DedicateData'
215209
import HostInfo from '@/views/infra/HostInfo'
216210
import VmwareData from './VmwareData'
217-
import ObjectListTable from '@/components/view/ObjectListTable.vue'
211+
import ObjectListTable from '@/components/view/ObjectListTable'
212+
import ExternalConfigurationDetails from '@/views/extension/ExternalConfigurationDetails'
218213
import { genericCompare } from '@/utils/sort'
219214
220215
export default {
@@ -223,7 +218,8 @@ export default {
223218
DedicateData,
224219
HostInfo,
225220
VmwareData,
226-
ObjectListTable
221+
ObjectListTable,
222+
ExternalConfigurationDetails
227223
},
228224
props: {
229225
resource: {
@@ -267,7 +263,7 @@ export default {
267263
items.push('enddate')
268264
} else if (this.$route.meta.name === 'vm') {
269265
items.push('leaseexpirydate')
270-
} else if (['host', 'computeoffering'].includes(this.$route.meta.name)) {
266+
} else if (['cluster', 'host', 'computeoffering'].includes(this.$route.meta.name)) {
271267
items.push('externaldetails')
272268
}
273269
return items
@@ -391,28 +387,6 @@ export default {
391387
return routes.join('<br>')
392388
}
393389
return null
394-
},
395-
filteredExternalDetails () {
396-
const detailsKeys = {
397-
host: 'details',
398-
computeoffering: 'serviceofferingdetails'
399-
}
400-
const detailsKey = detailsKeys[this.$route.meta.name]
401-
if (!detailsKey || !this.dataResource) {
402-
return null
403-
}
404-
const details = this.dataResource[detailsKey]
405-
if (!details || typeof details !== 'object') {
406-
return null
407-
}
408-
const prefix = 'External:'
409-
const result = {}
410-
for (const key in details) {
411-
if (key.startsWith(prefix)) {
412-
result[key.substring(prefix.length)] = details[key]
413-
}
414-
}
415-
return Object.keys(result).length > 0 ? result : null
416390
}
417391
},
418392
created () {

ui/src/config/section/infra/clusters.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default {
3535
fields.push('zonename')
3636
return fields
3737
},
38-
details: ['name', 'id', 'allocationstate', 'clustertype', 'managedstate', 'arch', 'hypervisortype', 'externalprovisioner', 'podname', 'zonename', 'drsimbalance', 'storageaccessgroups', 'podstorageaccessgroups', 'zonestorageaccessgroups'],
38+
details: ['name', 'id', 'allocationstate', 'clustertype', 'managedstate', 'arch', 'hypervisortype', 'externalprovisioner', 'podname', 'zonename', 'drsimbalance', 'storageaccessgroups', 'podstorageaccessgroups', 'zonestorageaccessgroups', 'externaldetails'],
3939
related: [{
4040
name: 'host',
4141
title: 'label.hosts',
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
<template>
19+
<a-list-item v-if="['host', 'computeoffering'].includes($route.meta.name) && filteredExternalDetails">
20+
<div>
21+
<strong>{{ ['computeoffering'].includes($route.meta.name) ? $t('label.externaldetails') : $t('label.configuration.details') }}</strong>
22+
<div>
23+
<object-list-table :data-map="filteredExternalDetails" />
24+
</div>
25+
</div>
26+
</a-list-item>
27+
<a-list-item v-else-if="['cluster'].includes($route.meta.name)">
28+
<div>
29+
<strong>{{ $t('label.configuration.details') }}</strong>
30+
<div>
31+
<object-list-table :data-map="extensionResourceDetails" />
32+
</div>
33+
</div>
34+
</a-list-item>
35+
</template>
36+
37+
<script>
38+
import { getAPI } from '@/api'
39+
import ObjectListTable from '@/components/view/ObjectListTable'
40+
41+
export default {
42+
name: 'ExternalConfigurationDetails',
43+
components: {
44+
ObjectListTable
45+
},
46+
props: {
47+
resource: {
48+
type: Object,
49+
required: true
50+
}
51+
},
52+
data () {
53+
return {
54+
extension: {},
55+
loading: false
56+
}
57+
},
58+
created () {
59+
this.fetchData()
60+
},
61+
watch: {
62+
resource: {
63+
deep: true,
64+
handler (newItem, oldItem) {
65+
if (newItem && newItem.id !== oldItem.id) {
66+
this.fetchData()
67+
}
68+
}
69+
}
70+
},
71+
computed: {
72+
filteredExternalDetails () {
73+
const detailsKeys = {
74+
host: 'details',
75+
computeoffering: 'serviceofferingdetails'
76+
}
77+
const detailsKey = detailsKeys[this.$route.meta.name]
78+
if (!detailsKey || !this.resource) {
79+
return null
80+
}
81+
const details = this.resource[detailsKey]
82+
if (!details || typeof details !== 'object') {
83+
return null
84+
}
85+
const prefix = 'External:'
86+
const result = {}
87+
for (const key in details) {
88+
if (key.startsWith(prefix)) {
89+
result[key.substring(prefix.length)] = details[key]
90+
}
91+
}
92+
return Object.keys(result).length > 0 ? result : null
93+
},
94+
extensionResourceDetails () {
95+
if (!this.resource?.id || !this.extension?.resources) {
96+
return null
97+
}
98+
const resource = this.extension.resources.find(r => r.id === this.resource.id)
99+
if (!resource || !resource.details || typeof resource.details !== 'object') {
100+
return null
101+
}
102+
return resource.details
103+
}
104+
},
105+
methods: {
106+
fetchData () {
107+
if (!['cluster'].includes(this.$route.meta.name)) {
108+
return
109+
}
110+
this.loading = true
111+
const params = {
112+
id: this.resource.extensionid,
113+
details: 'resource'
114+
}
115+
getAPI('listExtensions', params).then(json => {
116+
this.extension = json.listextensionsresponse.extension[0]
117+
}).catch(error => {
118+
this.$notifyError(error)
119+
}).finally(() => {
120+
this.loading = false
121+
})
122+
}
123+
}
124+
}
125+
</script>

0 commit comments

Comments
 (0)