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

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


The following commit(s) were added to refs/heads/master by this push:
     new 58466c8  api: add command to list management servers (#3150)
58466c8 is described below

commit 58466c89540aeb643abf47dacb2fe249eca48479
Author: dahn <daan.hoogl...@gmail.com>
AuthorDate: Fri Feb 1 19:23:39 2019 +0100

    api: add command to list management servers (#3150)
    
    * api: add command to list management servers
    
    * api: add number of mangement servers in listInfrastructure command
    
    * ui: add block for mangement servers on infra page
    
    * api name resolution method cleanup
---
 .../apache/cloudstack/api/ApiCommandJobType.java   |  3 +-
 .../apache/cloudstack/api/ResponseGenerator.java   |  4 ++
 .../api/command/admin/management/ListMgmtsCmd.java | 79 ++++++++++++++++++++++
 .../api/response/ManagementServerResponse.java     | 59 ++++++++++++++++
 .../management}/ManagementServerHost.java          | 12 ++--
 .../management/ManagementServerHostPeer.java       | 17 +++--
 .../org/apache/cloudstack/query/QueryService.java  |  4 ++
 .../agent/manager/ClusteredAgentManagerImpl.java   |  2 +-
 .../vm/ClusteredVirtualMachineManagerImpl.java     |  2 +-
 .../com/cloud/upgrade/dao/Upgrade41120to41200.java | 13 ++++
 .../resources/META-INF/db/schema-41120to41200.sql  |  5 +-
 framework/cluster/pom.xml                          |  3 +-
 .../com/cloud/cluster/ClusterFenceManagerImpl.java |  1 +
 .../java/com/cloud/cluster/ClusterManager.java     |  1 +
 .../java/com/cloud/cluster/ClusterManagerImpl.java |  7 +-
 .../com/cloud/cluster/ClusterManagerListener.java  |  2 +
 .../cloud/cluster/ManagementServerHostPeerVO.java  |  9 ++-
 .../com/cloud/cluster/ManagementServerHostVO.java  | 16 +++++
 .../cloud/cluster/dao/ManagementServerHostDao.java |  4 +-
 .../cluster/dao/ManagementServerHostDaoImpl.java   |  4 +-
 .../cluster/dao/ManagementServerHostPeerDao.java   |  2 +-
 .../dao/ManagementServerHostPeerDaoImpl.java       |  2 +-
 .../framework/jobs/impl/AsyncJobManagerImpl.java   |  2 +-
 .../vmware/manager/VmwareManagerImpl.java          |  2 +-
 .../cloudstack/metrics/MetricsServiceImpl.java     |  4 ++
 .../response/InfrastructureResponse.java           |  8 +++
 .../main/java/com/cloud/api/ApiResponseHelper.java | 10 +++
 .../java/com/cloud/api/query/QueryManagerImpl.java | 24 +++++++
 .../com/cloud/ha/HighAvailabilityManagerImpl.java  |  2 +-
 .../java/com/cloud/server/LockMasterListener.java  |  2 +-
 .../com/cloud/server/ManagementServerImpl.java     |  2 +
 .../java/com/cloud/storage/StorageManagerImpl.java |  2 +-
 .../org/apache/cloudstack/ha/HAManagerImpl.java    |  2 +-
 tools/apidoc/gen_toc.py                            |  3 +-
 ui/css/cloudstack3.css                             |  3 +-
 ui/index.html                                      |  9 +++
 ui/l10n/en.js                                      |  2 +
 ui/l10n/fr_FR.js                                   |  2 +
 ui/scripts/system.js                               | 38 +++++++++++
 .../main/java/com/cloud/utils/net/NetUtils.java    | 12 ++++
 40 files changed, 346 insertions(+), 34 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java 
b/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java
index b95831b..d35598b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiCommandJobType.java
@@ -52,5 +52,6 @@ public enum ApiCommandJobType {
     DedicatedGuestVlanRange,
     GuestOs,
     GuestOsMapping,
-    Network
+    Network,
+    Management
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java 
b/api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java
index 4fb248c..80d6d4b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ResponseGenerator.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.api.ApiConstants.HostDetails;
@@ -64,6 +65,7 @@ import 
org.apache.cloudstack.api.response.LBHealthCheckResponse;
 import org.apache.cloudstack.api.response.LBStickinessResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.cloudstack.api.response.ManagementServerResponse;
 import org.apache.cloudstack.api.response.NetworkACLItemResponse;
 import org.apache.cloudstack.api.response.NetworkACLResponse;
 import org.apache.cloudstack.api.response.NetworkOfferingResponse;
@@ -462,4 +464,6 @@ public interface ResponseGenerator {
     ListResponse<UpgradeRouterTemplateResponse> 
createUpgradeRouterTemplateResponse(List<Long> jobIds);
 
     SSHKeyPairResponse createSSHKeyPairResponse(SSHKeyPair sshkeyPair, boolean 
privatekey);
+
+    ManagementServerResponse createManagementResponse(ManagementServerHost 
mgmt);
 }
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java
new file mode 100644
index 0000000..1be4919
--- /dev/null
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java
@@ -0,0 +1,79 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.command.admin.management;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ManagementServerResponse;
+import org.apache.log4j.Logger;
+
+@APICommand(name = ListMgmtsCmd.APINAME, description = "Lists management 
servers.", responseObject = ManagementServerResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class ListMgmtsCmd extends BaseListCmd {
+    public static final Logger s_logger = 
Logger.getLogger(ListMgmtsCmd.class.getName());
+
+    public static final String APINAME = "listManagementServers";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = 
HostResponse.class, description = "the id of the management server")
+    private Long id;
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, 
description = "the name of the management server")
+    private String hostName;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public ApiCommandJobType getInstanceType() {
+        return ApiCommandJobType.Host;
+    }
+
+    @Override
+    public void execute() {
+        ListResponse<ManagementServerResponse> response = 
_queryService.listManagementServers(this);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}
diff --git 
a/api/src/main/java/org/apache/cloudstack/api/response/ManagementServerResponse.java
 
b/api/src/main/java/org/apache/cloudstack/api/response/ManagementServerResponse.java
new file mode 100644
index 0000000..efb7d87
--- /dev/null
+++ 
b/api/src/main/java/org/apache/cloudstack/api/response/ManagementServerResponse.java
@@ -0,0 +1,59 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.response;
+
+import org.apache.cloudstack.management.ManagementServerHost;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+@EntityReference(value = ManagementServerHost.class)
+public class ManagementServerResponse extends BaseResponse {
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the management server")
+    private String id;
+
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "the name of the management server")
+    private String name;
+
+    @SerializedName(ApiConstants.STATE)
+    @Param(description = "the state of the management server")
+    private ManagementServerHost.State state;
+
+    @SerializedName(ApiConstants.VERSION)
+    @Param(description = "the version of the management server")
+    private String version;
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setState(ManagementServerHost.State state) {
+        this.state = state;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+}
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHost.java 
b/api/src/main/java/org/apache/cloudstack/management/ManagementServerHost.java
similarity index 88%
rename from 
framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHost.java
rename to 
api/src/main/java/org/apache/cloudstack/management/ManagementServerHost.java
index 7fc57b7..11e1cae 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHost.java
+++ 
b/api/src/main/java/org/apache/cloudstack/management/ManagementServerHost.java
@@ -14,19 +14,23 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.cluster;
+package org.apache.cloudstack.management;
 
 public interface ManagementServerHost {
+    enum State {
+        Up, Down
+    }
+
     long getId();
 
-    public static enum State {
-        Up, Starting, Down
-    };
+    String getUuid();
 
     long getMsid();
 
     State getState();
 
+    String getName();
+
     String getVersion();
 
     String getServiceIP();
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java 
b/api/src/main/java/org/apache/cloudstack/management/ManagementServerHostPeer.java
similarity index 70%
copy from 
framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java
copy to 
api/src/main/java/org/apache/cloudstack/management/ManagementServerHostPeer.java
index 2fe1f24..d41d1b7 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java
+++ 
b/api/src/main/java/org/apache/cloudstack/management/ManagementServerHostPeer.java
@@ -14,14 +14,17 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
-package com.cloud.cluster;
+package org.apache.cloudstack.management;
 
-import java.util.List;
+import org.apache.cloudstack.api.InternalIdentity;
 
-public interface ClusterManagerListener {
-    void onManagementNodeJoined(List<? extends ManagementServerHost> nodeList, 
long selfNodeId);
+import java.util.Date;
 
-    void onManagementNodeLeft(List<? extends ManagementServerHost> nodeList, 
long selfNodeId);
+public interface ManagementServerHostPeer extends InternalIdentity {
 
-    void onManagementNodeIsolated();
-}
+    long getOwnerMshost();
+    long getPeerMshost();
+    long getPeerRunid();
+    ManagementServerHost.State getPeerState();
+    Date getLastUpdateTime();
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/query/QueryService.java 
b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
index de9fbb5..ac29dff 100644
--- a/api/src/main/java/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
@@ -23,6 +23,7 @@ import 
org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.host.ListHostTagsCmd;
 import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
+import org.apache.cloudstack.api.command.admin.management.ListMgmtsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd;
 import 
org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd;
@@ -58,6 +59,7 @@ import org.apache.cloudstack.api.response.HostTagResponse;
 import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ManagementServerResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
 import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
@@ -141,4 +143,6 @@ public interface QueryService {
     ListResponse<StorageTagResponse> searchForStorageTags(ListStorageTagsCmd 
cmd);
 
     ListResponse<HostTagResponse> searchForHostTags(ListHostTagsCmd cmd);
+
+    ListResponse<ManagementServerResponse> listManagementServers(ListMgmtsCmd 
cmd);
 }
diff --git 
a/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
 
b/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
index d0cced3..7a16971 100644
--- 
a/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
@@ -69,7 +69,7 @@ import com.cloud.cluster.ClusterManager;
 import com.cloud.cluster.ClusterManagerListener;
 import com.cloud.cluster.ClusterServicePdu;
 import com.cloud.cluster.ClusteredAgentRebalanceService;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.cluster.ManagementServerHostVO;
 import com.cloud.cluster.agentlb.AgentLoadBalancerPlanner;
 import com.cloud.cluster.agentlb.HostTransferMapVO;
diff --git 
a/engine/orchestration/src/main/java/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
 
b/engine/orchestration/src/main/java/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
index 77c69f3..b8995f6 100644
--- 
a/engine/orchestration/src/main/java/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/vm/ClusteredVirtualMachineManagerImpl.java
@@ -24,7 +24,7 @@ import javax.naming.ConfigurationException;
 
 import com.cloud.cluster.ClusterManager;
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 
 public class ClusteredVirtualMachineManagerImpl extends 
VirtualMachineManagerImpl implements ClusterManagerListener {
 
diff --git 
a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41120to41200.java 
b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41120to41200.java
index 88cffb7..f68f04a 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41120to41200.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41120to41200.java
@@ -19,11 +19,16 @@ package com.cloud.upgrade.dao;
 
 import java.io.InputStream;
 import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.log4j.Logger;
 
 public class Upgrade41120to41200 implements DbUpgrade {
 
+    final static Logger LOG = Logger.getLogger(Upgrade41120to41200.class);
+
     @Override
     public String[] getUpgradableVersionRange() {
         return new String[] {"4.11.2.0", "4.12.0.0"};
@@ -52,7 +57,15 @@ public class Upgrade41120to41200 implements DbUpgrade {
 
     @Override
     public void performDataMigration(Connection conn) {
+        updateManagementServerHostUuid(conn);
+    }
 
+    private void updateManagementServerHostUuid(Connection conn) {
+        try (final PreparedStatement updateStatement = 
conn.prepareStatement("UPDATE cloud.mshost SET uuid=UUID()")) {
+            updateStatement.executeUpdate();
+        } catch (SQLException e) {
+            LOG.error("Failed to add an UUID to each management server.", e);
+        }
     }
 
     @Override
diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-41120to41200.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-41120to41200.sql
index fb588e8..cf11d8f 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41120to41200.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41120to41200.sql
@@ -48,4 +48,7 @@ INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, 
display_name, crea
 INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, 
hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) 
VALUES (UUID(), 'KVM', 'default', 'Windows Server 2019', 276, now(), 0);
 
 -- changed fingerprint type to TEXT, it avoids db exception when creating the 
certificate issue #3123
-ALTER TABLE `cloud`.`sslcerts` MODIFY `fingerprint` TEXT;
\ No newline at end of file
+ALTER TABLE `cloud`.`sslcerts` MODIFY `fingerprint` TEXT;
+
+-- PR#2578 New column for listManagementServers API call
+ALTER TABLE `mshost` ADD COLUMN `uuid` varchar(40) AFTER `name`;
diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml
index c9b61d6..853d9f0 100644
--- a/framework/cluster/pom.xml
+++ b/framework/cluster/pom.xml
@@ -47,8 +47,7 @@
             <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-api</artifactId>
             <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
         </dependency>
     </dependencies>
+
 </project>
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterFenceManagerImpl.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterFenceManagerImpl.java
index 0b14be8..4f5e034 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterFenceManagerImpl.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterFenceManagerImpl.java
@@ -22,6 +22,7 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManager.java 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManager.java
index 86d6fb3..c4a800c 100644
--- a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManager.java
+++ b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManager.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.cluster;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import org.apache.cloudstack.framework.config.ConfigKey;
 
 import com.cloud.utils.component.Manager;
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
index d4717ca..8786bfd 100644
--- a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
@@ -31,6 +31,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -39,6 +40,7 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -951,7 +953,7 @@ public class ClusterManagerImpl extends ManagerBase 
implements ClusterManager, C
                     mshost = new ManagementServerHostVO();
                     mshost.setMsid(_msId);
                     mshost.setRunid(_runId);
-                    mshost.setName(NetUtils.getHostName());
+                    mshost.setName(NetUtils.getCanonicalHostName());
                     mshost.setVersion(version);
                     mshost.setServiceIP(_clusterNodeIP);
                     
mshost.setServicePort(_currentServiceAdapter.getServicePort());
@@ -959,12 +961,13 @@ public class ClusterManagerImpl extends ManagerBase 
implements ClusterManager, C
                     mshost.setRemoved(null);
                     mshost.setAlertCount(0);
                     mshost.setState(ManagementServerHost.State.Up);
+                    mshost.setUuid(UUID.randomUUID().toString());
                     _mshostDao.persist(mshost);
                     if (s_logger.isInfoEnabled()) {
                         s_logger.info("New instance of management server msid 
" + _msId + ", runId " + _runId + " is being started");
                     }
                 } else {
-                    _mshostDao.update(mshost.getId(), _runId, 
NetUtils.getHostName(), version, _clusterNodeIP, 
_currentServiceAdapter.getServicePort(),
+                    _mshostDao.update(mshost.getId(), _runId, 
NetUtils.getCanonicalHostName(), version, _clusterNodeIP, 
_currentServiceAdapter.getServicePort(),
                             DateUtil.currentGMTTime());
                     if (s_logger.isInfoEnabled()) {
                         s_logger.info("Management server " + _msId + ", runId 
" + _runId + " is being started");
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java
index 2fe1f24..61af3ef 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerListener.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.cluster;
 
+import org.apache.cloudstack.management.ManagementServerHost;
+
 import java.util.List;
 
 public interface ClusterManagerListener {
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostPeerVO.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostPeerVO.java
index 5b7e988..a381bb4 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostPeerVO.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostPeerVO.java
@@ -29,11 +29,13 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import org.apache.cloudstack.management.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHostPeer;
 import com.cloud.utils.DateUtil;
 
 @Entity
 @Table(name = "mshost_peer")
-public class ManagementServerHostPeerVO {
+public class ManagementServerHostPeerVO implements ManagementServerHostPeer {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -77,6 +79,7 @@ public class ManagementServerHostPeerVO {
         this.id = id;
     }
 
+    @Override
     public long getOwnerMshost() {
         return ownerMshost;
     }
@@ -85,6 +88,7 @@ public class ManagementServerHostPeerVO {
         this.ownerMshost = ownerMshost;
     }
 
+    @Override
     public long getPeerMshost() {
         return peerMshost;
     }
@@ -93,6 +97,7 @@ public class ManagementServerHostPeerVO {
         this.peerMshost = peerMshost;
     }
 
+    @Override
     public long getPeerRunid() {
         return peerRunid;
     }
@@ -101,6 +106,7 @@ public class ManagementServerHostPeerVO {
         this.peerRunid = peerRunid;
     }
 
+    @Override
     public ManagementServerHost.State getPeerState() {
         return peerState;
     }
@@ -109,6 +115,7 @@ public class ManagementServerHostPeerVO {
         this.peerState = peerState;
     }
 
+    @Override
     public Date getLastUpdateTime() {
         return lastUpdateTime;
     }
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostVO.java 
b/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostVO.java
index f93c2ac..121b939 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostVO.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/ManagementServerHostVO.java
@@ -17,6 +17,7 @@
 package com.cloud.cluster;
 
 import java.util.Date;
+import java.util.UUID;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -29,6 +30,7 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.utils.db.GenericDao;
 
 @Entity
@@ -40,6 +42,9 @@ public class ManagementServerHostVO implements 
ManagementServerHost {
     @Column(name = "id")
     private long id;
 
+    @Column(name = "uuid")
+    private String uuid;
+
     @Column(name = "msid", updatable = true, nullable = false)
     private long msid;
 
@@ -81,6 +86,7 @@ public class ManagementServerHostVO implements 
ManagementServerHost {
         this.serviceIP = serviceIP;
         this.servicePort = servicePort;
         lastUpdateTime = updateTime;
+        this.uuid = UUID.randomUUID().toString();
     }
 
     @Override
@@ -92,6 +98,15 @@ public class ManagementServerHostVO implements 
ManagementServerHost {
         this.id = id;
     }
 
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
     public long getRunid() {
         return runid;
     }
@@ -109,6 +124,7 @@ public class ManagementServerHostVO implements 
ManagementServerHost {
         this.msid = msid;
     }
 
+    @Override
     public String getName() {
         return name;
     }
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java
index d6b25c1..6108269 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDao.java
@@ -19,8 +19,8 @@ package com.cloud.cluster.dao;
 import java.util.Date;
 import java.util.List;
 
-import com.cloud.cluster.ManagementServerHost;
-import com.cloud.cluster.ManagementServerHost.State;
+import org.apache.cloudstack.management.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost.State;
 import com.cloud.cluster.ManagementServerHostVO;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDao;
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
index 3ab4d97..74f8481 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
@@ -28,8 +28,8 @@ import java.util.TimeZone;
 import org.apache.log4j.Logger;
 
 import com.cloud.cluster.ClusterInvalidSessionException;
-import com.cloud.cluster.ManagementServerHost;
-import com.cloud.cluster.ManagementServerHost.State;
+import org.apache.cloudstack.management.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost.State;
 import com.cloud.cluster.ManagementServerHostVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.DB;
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDao.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDao.java
index 6d21049..f799116 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDao.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDao.java
@@ -16,7 +16,7 @@
 // under the License.
 package com.cloud.cluster.dao;
 
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.cluster.ManagementServerHostPeerVO;
 import com.cloud.utils.db.GenericDao;
 
diff --git 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
index a43fcfc..a7a56c7 100644
--- 
a/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
+++ 
b/framework/cluster/src/main/java/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
@@ -21,7 +21,7 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.cluster.ManagementServerHostPeerVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
diff --git 
a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
 
b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 1be3eed..378e2f5 100644
--- 
a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ 
b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -62,7 +62,7 @@ import 
org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.slf4j.MDC;
 
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.Snapshot;
 import com.cloud.storage.dao.SnapshotDao;
diff --git 
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
 
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 643d3ce..23758d5 100644
--- 
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ 
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -62,7 +62,7 @@ import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.api.query.dao.TemplateJoinDao;
 import com.cloud.cluster.ClusterManager;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.cluster.dao.ManagementServerHostPeerDao;
 import com.cloud.configuration.Config;
 import com.cloud.dc.ClusterDetailsDao;
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
index 8b76a17..37f1f55 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
@@ -25,6 +25,7 @@ import com.cloud.capacity.Capacity;
 import com.cloud.capacity.CapacityManager;
 import com.cloud.capacity.dao.CapacityDao;
 import com.cloud.capacity.dao.CapacityDaoImpl;
+import com.cloud.cluster.dao.ManagementServerHostDao;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
@@ -95,6 +96,8 @@ public class MetricsServiceImpl extends 
ComponentLifecycleBase implements Metric
     private DomainRouterDao domainRouterDao;
     @Inject
     private CapacityDao capacityDao;
+    @Inject
+    private ManagementServerHostDao managementServerHostDao;
 
     protected MetricsServiceImpl() {
         super();
@@ -138,6 +141,7 @@ public class MetricsServiceImpl extends 
ComponentLifecycleBase implements Metric
             }
         }
         response.setCpuSockets(cpuSockets);
+        
response.setManagementServers(managementServerHostDao.listAll().size());
         return response;
     }
 
diff --git 
a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
 
b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
index a4db345..03b54ab 100644
--- 
a/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
+++ 
b/plugins/metrics/src/main/java/org/apache/cloudstack/response/InfrastructureResponse.java
@@ -59,6 +59,10 @@ public class InfrastructureResponse extends BaseResponse {
     @Param(description = "Number of cpu sockets")
     private Integer cpuSockets;
 
+    @SerializedName("managementservers")
+    @Param(description = "Number of management servers")
+    private Integer managementServers;
+
     public InfrastructureResponse() {
         setObjectName("infrastructure");
     }
@@ -98,4 +102,8 @@ public class InfrastructureResponse extends BaseResponse {
     public void setCpuSockets(final Integer cpuSockets) {
         this.cpuSockets = cpuSockets;
     }
+
+    public void setManagementServers(Integer managementServers) {
+        this.managementServers = managementServers;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java 
b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index 153eafd..0b310c0 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.api;
 
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.agent.api.VgpuTypesInfo;
@@ -235,6 +236,7 @@ import 
org.apache.cloudstack.api.response.LBStickinessPolicyResponse;
 import org.apache.cloudstack.api.response.LBStickinessResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.LoadBalancerResponse;
+import org.apache.cloudstack.api.response.ManagementServerResponse;
 import org.apache.cloudstack.api.response.NetworkACLItemResponse;
 import org.apache.cloudstack.api.response.NetworkACLResponse;
 import org.apache.cloudstack.api.response.NetworkOfferingResponse;
@@ -3975,4 +3977,12 @@ public class ApiResponseHelper implements 
ResponseGenerator {
         response.setDomainName(domain.getName());
         return response;
     }
+    public ManagementServerResponse 
createManagementResponse(ManagementServerHost mgmt) {
+        ManagementServerResponse response = new ManagementServerResponse();
+        response.setId(mgmt.getUuid());
+        response.setName(mgmt.getName());
+        response.setVersion(mgmt.getVersion());
+        response.setState(mgmt.getState());
+        return response;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java 
b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
index f75f711..91e0466 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -25,6 +25,8 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
+import com.cloud.cluster.ManagementServerHostVO;
+import com.cloud.cluster.dao.ManagementServerHostDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -41,6 +43,7 @@ import 
org.apache.cloudstack.api.command.admin.host.ListHostTagsCmd;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
 import org.apache.cloudstack.api.command.admin.iso.ListIsosCmdByAdmin;
+import org.apache.cloudstack.api.command.admin.management.ListMgmtsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd;
 import 
org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd;
@@ -80,6 +83,7 @@ import org.apache.cloudstack.api.response.HostTagResponse;
 import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ManagementServerResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
 import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
@@ -376,6 +380,9 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
     @Inject
     private EntityManager _entityMgr;
 
+    @Inject
+    ManagementServerHostDao managementServerHostDao;
+
     /*
      * (non-Javadoc)
      *
@@ -3684,6 +3691,23 @@ public class QueryManagerImpl extends 
MutualExclusiveIdsManagerBase implements Q
     }
 
     @Override
+    public ListResponse<ManagementServerResponse> 
listManagementServers(ListMgmtsCmd cmd) {
+        ListResponse<ManagementServerResponse> response = new ListResponse<>();
+        List<ManagementServerResponse> result = new ArrayList<>();
+        for (ManagementServerHostVO mgmt : managementServerHostDao.listAll()) {
+            ManagementServerResponse mgmtResponse = new 
ManagementServerResponse();
+            mgmtResponse.setId(mgmt.getUuid());
+            mgmtResponse.setName(mgmt.getName());
+            mgmtResponse.setState(mgmt.getState());
+            mgmtResponse.setVersion(mgmt.getVersion());
+            mgmtResponse.setObjectName("managementserver");
+            result.add(mgmtResponse);
+        }
+        response.setResponses(result);
+        return response;
+     }
+
+    @Override
     public String getConfigComponentName() {
         return QueryService.class.getSimpleName();
     }
diff --git a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java 
b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
index d4356f6..49211f5 100644
--- a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -38,7 +38,7 @@ import 
org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import com.cloud.agent.AgentManager;
 import com.cloud.alert.AlertManager;
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.configuration.Config;
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.DataCenterVO;
diff --git a/server/src/main/java/com/cloud/server/LockMasterListener.java 
b/server/src/main/java/com/cloud/server/LockMasterListener.java
index 8c8ff91..27cf74f 100644
--- a/server/src/main/java/com/cloud/server/LockMasterListener.java
+++ b/server/src/main/java/com/cloud/server/LockMasterListener.java
@@ -19,7 +19,7 @@ package com.cloud.server;
 import java.util.List;
 
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.utils.db.Merovingian2;
 
 /**
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java 
b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index d54e84f..0b846b9 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -105,6 +105,7 @@ import 
org.apache.cloudstack.api.command.admin.iso.ListIsoPermissionsCmdByAdmin;
 import org.apache.cloudstack.api.command.admin.iso.ListIsosCmdByAdmin;
 import org.apache.cloudstack.api.command.admin.iso.RegisterIsoCmdByAdmin;
 import 
org.apache.cloudstack.api.command.admin.loadbalancer.ListLoadBalancerRuleInstancesCmdByAdmin;
+import org.apache.cloudstack.api.command.admin.management.ListMgmtsCmd;
 import org.apache.cloudstack.api.command.admin.network.AddNetworkDeviceCmd;
 import 
org.apache.cloudstack.api.command.admin.network.AddNetworkServiceProviderCmd;
 import 
org.apache.cloudstack.api.command.admin.network.CreateManagementNetworkIpRangeCmd;
@@ -3068,6 +3069,7 @@ public class ManagementServerImpl extends ManagerBase 
implements ManagementServe
         cmdList.add(CreateManagementNetworkIpRangeCmd.class);
         cmdList.add(DeleteManagementNetworkIpRangeCmd.class);
         cmdList.add(UploadTemplateDirectDownloadCertificate.class);
+        cmdList.add(ListMgmtsCmd.class);
 
         // Out-of-band management APIs for admins
         cmdList.add(EnableOutOfBandManagementForHostCmd.class);
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java 
b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 1f704eb..a299540 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -115,7 +115,7 @@ import com.cloud.capacity.CapacityState;
 import com.cloud.capacity.CapacityVO;
 import com.cloud.capacity.dao.CapacityDao;
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.ConfigurationManagerImpl;
diff --git a/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java 
b/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java
index 86ac037..ab269b1 100644
--- a/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/ha/HAManagerImpl.java
@@ -60,7 +60,7 @@ import 
org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.apache.log4j.Logger;
 
 import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ManagementServerHost;
+import org.apache.cloudstack.management.ManagementServerHost;
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.DataCenter;
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index 3bf52a3..1b2a979 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -190,7 +190,8 @@ known_categories = {
     'listElastistorInterface': 'Misc',
     'cloudian': 'Cloudian',
     'Sioc' : 'Sioc',
-    'Diagnostics': 'Diagnostics'
+    'Diagnostics': 'Diagnostics',
+    'Management': 'Management',
     }
 
 
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index ad1f624..5294f56 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -9739,7 +9739,8 @@ div#details-tab-aclRules td.cidrlist span {
   top: 68px;
 }
 
-.system-dashboard.zone .status_box li.system-vms .icon {
+.system-dashboard.zone .status_box li.system-vms .icon,
+.system-dashboard.zone .status_box li.management-servers .icon {
   background-position: -408px -399px;
 }
 
diff --git a/ui/index.html b/ui/index.html
index bfc026f..6e33598 100644
--- a/ui/index.html
+++ b/ui/index.html
@@ -1218,6 +1218,15 @@
                                   view-all-title="label.sockets"
                                   view-all-target="sockets"><translate 
key="label.view.all"/></span>
                         </li>
+                        <li class="block management-servers">
+                            <span class="header"><translate 
key="label.management.servers"/></span>
+                            <span class="icon">&nbsp;</span>
+                            <span class="overview total" 
data-item="managementServerCount"></span>
+                            <span class="button view-all clusters"
+                                  tr="label.management.servers" 
trf="view-all-title"
+                                  view-all-title="label.management.servers"
+                                  
view-all-target="managementServers"><translate key="label.view.all"/></span>
+                        </li>
                     </ul>
                 </div>
             </div>
diff --git a/ui/l10n/en.js b/ui/l10n/en.js
index 46b9244..eb7b822 100644
--- a/ui/l10n/en.js
+++ b/ui/l10n/en.js
@@ -1017,6 +1017,7 @@ var dictionary = {
 "label.management.ips":"Management IP Addresses",
 "label.management.server":"Management Server",
 "label.mac.address": "MAC Address",
+"label.management.servers":"Management Servers",
 "label.mac.address.changes":"MAC Address Changes",
 "label.max.cpus":"Max. CPU cores",
 "label.max.guest.limit":"Max guest limit",
@@ -1225,6 +1226,7 @@ var dictionary = {
 "label.number.of.clusters":"Number of Clusters",
 "label.number.of.cpu.sockets":"The Number of CPU Sockets",
 "label.number.of.hosts":"Number of Hosts",
+"label.number.of.management.servers":"Number of Management Servers",
 "label.number.of.pods":"Number of Pods",
 "label.number.of.system.vms":"Number of System VMs",
 "label.number.of.virtual.routers":"Number of Virtual Routers",
diff --git a/ui/l10n/fr_FR.js b/ui/l10n/fr_FR.js
index 8ecf80d..88b6cad 100644
--- a/ui/l10n/fr_FR.js
+++ b/ui/l10n/fr_FR.js
@@ -984,6 +984,7 @@ var dictionary = {
     "label.management": "Administration",
     "label.management.ips": "Adresses IP de gestion",
     "label.management.server": "Serveur de gestion",
+    "label.management.servers": "Serveurs de gestion",
     "label.max.cpus": "Nombre coeurs CPU max.",
     "label.max.guest.limit": "Nombre maximum d'invités",
     "label.max.instances": "Instance Max.",
@@ -1184,6 +1185,7 @@ var dictionary = {
     "label.number.of.clusters": "Nombre de clusters",
     "label.number.of.cpu.sockets": "Le nombre de sockets CPU",
     "label.number.of.hosts": "Nombre d'Hôtes",
+    "label.number.of.management.servers":"Nombre de serveurs de gestion",
     "label.number.of.pods": "Nombre de Pods",
     "label.number.of.system.vms": "Nombre de VM Système",
     "label.number.of.virtual.routers": "Nombre de routeurs virtuels",
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index c1c693f..e721581 100755
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -279,6 +279,7 @@
                         data.systemVmCount = response.systemvms;
                         data.virtualRouterCount = response.routers;
                         data.socketCount = response.cpusockets;
+                        data.managementServerCount = 
response.managementservers;
                         args.response.success({
                             data: data
                         });
@@ -9956,6 +9957,40 @@
                             };
 
                             return listView;
+                        },
+
+                        managementServers: function () {
+                            var listView = {
+                                id: 'managementservers',
+                                fields: {
+                                    name: {
+                                        label: 'label.name'
+                                    },
+                                    id: {
+                                        label: 'label.uuid'
+                                    },
+                                    state: {
+                                        label: 'label.state',
+                                        indicator: {
+                                            'Up': 'on',
+                                            'Down': 'off'
+                                        }
+                                    },
+                                    version: {
+                                        label: 'label.version'
+                                    }
+                                },
+                                dataProvider: function (args) {
+                                        $.ajax({
+                                            url: 
createURL('listManagementServers'),
+                                            async: false,
+                                            success: function (json) {
+                                                args.response.success({ data: 
json.listmanagementserversresponse.managementserver });
+                                            }
+                                        });
+                                    }
+                                };
+                            return listView;
                         }
                     }
                 }
@@ -17854,6 +17889,9 @@
                                     },
                                     cpusockets: {
                                         label: 'label.number.of.cpu.sockets'
+                                    },
+                                    managementServers: {
+                                        label: 
'label.number.of.management.servers'
                                     }
                                 }, {
 
diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java 
b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
index 72f6583b..dce6c25 100644
--- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
@@ -117,6 +117,18 @@ public class NetUtils {
         return "localhost";
     }
 
+    public static String getCanonicalHostName() {
+        try {
+            InetAddress localAddr = InetAddress.getLocalHost();
+            if (localAddr != null) {
+                return localAddr.getCanonicalHostName();
+            }
+        } catch (UnknownHostException e) {
+            s_logger.warn("UnknownHostException when trying to get canonical 
host name. ", e);
+        }
+        return "localhost";
+    }
+
     public static InetAddress getLocalInetAddress() {
         try {
             return InetAddress.getLocalHost();

Reply via email to