This is an automated email from the ASF dual-hosted git repository.

harikrishna pushed a commit to branch ExtensionMaaS
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 24bd0be3096ada993d3ac32b766a00a8363cc40c
Author: Harikrishna Patnala <harikrishna.patn...@gmail.com>
AuthorDate: Fri Sep 26 08:04:50 2025 +0530

    Added redirect url for MaaS instance page
---
 extensions/MaaS/maas.py                 |  3 +++
 ui/src/components/view/ActionButton.vue |  4 +--
 ui/src/components/widgets/Console.vue   | 44 ++++++++++++++++++++++++++-------
 3 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/extensions/MaaS/maas.py b/extensions/MaaS/maas.py
index c950c93c7ce..1541d677946 100755
--- a/extensions/MaaS/maas.py
+++ b/extensions/MaaS/maas.py
@@ -139,12 +139,15 @@ class MaasManager:
         if json_data.get("cloudstack.vm.details", {}).get("nics"):
             json_data["cloudstack.vm.details"]["nics"][0]["mac"] = mac
 
+        console_url = 
f"http://{self.data['endpoint'].replace('http://','').replace('https://','')}:5240/MAAS/r/machine/{system_id}/summary"
+
         result = {
             "nics": json_data["cloudstack.vm.details"]["nics"],
             "details": {
                 "External:mac_address": mac,
                 "External:maas_system_id": system_id,
                 "External:hostname": hostname,
+                "External:console_url": console_url,
             },
         }
         succeed(result)
diff --git a/ui/src/components/view/ActionButton.vue 
b/ui/src/components/view/ActionButton.vue
index 7733efdf66e..14128a5ce55 100644
--- a/ui/src/components/view/ActionButton.vue
+++ b/ui/src/components/view/ActionButton.vue
@@ -17,7 +17,7 @@
 
 <template>
   <span class="row-action-button">
-    <a-tooltip arrowPointAtCenter placement="bottomRight" v-if="resource && 
resource.id && dataView && resource.hypervisor !== 'External'">
+    <a-tooltip arrowPointAtCenter placement="bottomRight" v-if="resource && 
resource.id && dataView">
       <template #title>
         {{ $t('label.view.console') }}
       </template>
@@ -29,7 +29,7 @@
         icon="code"
       />
     </a-tooltip>
-    <a-tooltip arrowPointAtCenter placement="bottomRight" v-if="resource && 
resource.id && dataView && resource.hypervisor !== 'External'">
+    <a-tooltip arrowPointAtCenter placement="bottomRight" v-if="resource && 
resource.id && dataView">
       <template #title>
         {{ $t('label.copy.consoleurl') }}
       </template>
diff --git a/ui/src/components/widgets/Console.vue 
b/ui/src/components/widgets/Console.vue
index 31105743795..edee7498991 100644
--- a/ui/src/components/widgets/Console.vue
+++ b/ui/src/components/widgets/Console.vue
@@ -17,9 +17,17 @@
 
 <template>
   <a
-    v-if="['vm', 'systemvm', 'router', 'ilbvm', 
'vnfapp'].includes($route.meta.name) && 'listVirtualMachines' in 
$store.getters.apis && 'createConsoleEndpoint' in $store.getters.apis"
+    v-if="['vm', 'systemvm', 'router', 'ilbvm', 
'vnfapp'].includes($route.meta.name) &&
+           'listVirtualMachines' in $store.getters.apis &&
+           'createConsoleEndpoint' in $store.getters.apis"
     @click="consoleUrl">
-    <a-button style="margin-left: 5px" shape="circle" type="dashed" 
:size="size" :disabled="['Stopped', 'Restoring', 'Error', 
'Destroyed'].includes(resource.state) || resource.hostcontrolstate === 
'Offline'" >
+    <a-button
+      style="margin-left: 5px"
+      shape="circle"
+      type="dashed"
+      :size="size"
+      :disabled="['Stopped', 'Restoring', 'Error', 
'Destroyed'].includes(resource.state) ||
+                 resource.hostcontrolstate === 'Offline'">
       <code-outlined v-if="!copyUrlToClipboard"/>
       <copy-outlined v-else />
     </a-button>
@@ -49,11 +57,29 @@ export default {
     }
   },
   methods: {
-    consoleUrl () {
-      const params = {}
-      params.virtualmachineid = this.resource.id
-      postAPI('createConsoleEndpoint', params).then(json => {
-        this.url = (json && json.createconsoleendpointresponse) ? 
json.createconsoleendpointresponse.consoleendpoint.url : '#/exception/404'
+    async consoleUrl () {
+      try {
+        const externalUrl = this.resource?.details?.['External:console_url']
+        if (externalUrl) {
+          this.url = externalUrl
+          if (this.copyUrlToClipboard) {
+            this.$copyText(this.url)
+            this.$message.success({
+              content: this.$t('label.copied.clipboard')
+            })
+          } else {
+            window.open(this.url, '_blank')
+          }
+          return
+        }
+
+        const params = { virtualmachineid: this.resource.id }
+        const json = await postAPI('createConsoleEndpoint', params)
+
+        this.url = (json && json.createconsoleendpointresponse)
+          ? json.createconsoleendpointresponse.consoleendpoint.url
+          : '#/exception/404'
+
         if (json.createconsoleendpointresponse.consoleendpoint.success) {
           if (this.copyUrlToClipboard) {
             this.$copyText(this.url)
@@ -69,9 +95,9 @@ export default {
             description: 
json.createconsoleendpointresponse.consoleendpoint.details
           })
         }
-      }).catch(error => {
+      } catch (error) {
         this.$notifyError(error)
-      })
+      }
     }
   },
   computed: {

Reply via email to