mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
db, server: refactor host_view to prevent duplicate entries (#4796)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
This commit is contained in:
parent
0d72886ee3
commit
5fd970d88f
@ -419,3 +419,95 @@ DROP TABLE IF EXISTS `cloud`.`swift`;
|
|||||||
ALTER TABLE `cloud`.`snapshots` DROP FOREIGN KEY `fk_snapshots__s3_id` ;
|
ALTER TABLE `cloud`.`snapshots` DROP FOREIGN KEY `fk_snapshots__s3_id` ;
|
||||||
ALTER TABLE `cloud`.`snapshots` DROP COLUMN `s3_id` ;
|
ALTER TABLE `cloud`.`snapshots` DROP COLUMN `s3_id` ;
|
||||||
DROP TABLE IF EXISTS `cloud`.`s3`;
|
DROP TABLE IF EXISTS `cloud`.`s3`;
|
||||||
|
|
||||||
|
-- Re-create host view to prevent multiple entries for hosts with multiple tags
|
||||||
|
DROP VIEW IF EXISTS `cloud`.`host_view`;
|
||||||
|
CREATE VIEW `cloud`.`host_view` AS
|
||||||
|
SELECT
|
||||||
|
host.id,
|
||||||
|
host.uuid,
|
||||||
|
host.name,
|
||||||
|
host.status,
|
||||||
|
host.disconnected,
|
||||||
|
host.type,
|
||||||
|
host.private_ip_address,
|
||||||
|
host.version,
|
||||||
|
host.hypervisor_type,
|
||||||
|
host.hypervisor_version,
|
||||||
|
host.capabilities,
|
||||||
|
host.last_ping,
|
||||||
|
host.created,
|
||||||
|
host.removed,
|
||||||
|
host.resource_state,
|
||||||
|
host.mgmt_server_id,
|
||||||
|
host.cpu_sockets,
|
||||||
|
host.cpus,
|
||||||
|
host.speed,
|
||||||
|
host.ram,
|
||||||
|
cluster.id cluster_id,
|
||||||
|
cluster.uuid cluster_uuid,
|
||||||
|
cluster.name cluster_name,
|
||||||
|
cluster.cluster_type,
|
||||||
|
data_center.id data_center_id,
|
||||||
|
data_center.uuid data_center_uuid,
|
||||||
|
data_center.name data_center_name,
|
||||||
|
data_center.networktype data_center_type,
|
||||||
|
host_pod_ref.id pod_id,
|
||||||
|
host_pod_ref.uuid pod_uuid,
|
||||||
|
host_pod_ref.name pod_name,
|
||||||
|
GROUP_CONCAT(DISTINCT(host_tags.tag)) AS tag,
|
||||||
|
guest_os_category.id guest_os_category_id,
|
||||||
|
guest_os_category.uuid guest_os_category_uuid,
|
||||||
|
guest_os_category.name guest_os_category_name,
|
||||||
|
mem_caps.used_capacity memory_used_capacity,
|
||||||
|
mem_caps.reserved_capacity memory_reserved_capacity,
|
||||||
|
cpu_caps.used_capacity cpu_used_capacity,
|
||||||
|
cpu_caps.reserved_capacity cpu_reserved_capacity,
|
||||||
|
async_job.id job_id,
|
||||||
|
async_job.uuid job_uuid,
|
||||||
|
async_job.job_status job_status,
|
||||||
|
async_job.account_id job_account_id,
|
||||||
|
oobm.enabled AS `oobm_enabled`,
|
||||||
|
oobm.power_state AS `oobm_power_state`,
|
||||||
|
ha_config.enabled AS `ha_enabled`,
|
||||||
|
ha_config.ha_state AS `ha_state`,
|
||||||
|
ha_config.provider AS `ha_provider`,
|
||||||
|
`last_annotation_view`.`annotation` AS `annotation`,
|
||||||
|
`last_annotation_view`.`created` AS `last_annotated`,
|
||||||
|
`user`.`username` AS `username`
|
||||||
|
FROM
|
||||||
|
`cloud`.`host`
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`cluster` ON host.cluster_id = cluster.id
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`data_center` ON host.data_center_id = data_center.id
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`host_pod_ref` ON host.pod_id = host_pod_ref.id
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`host_details` ON host.id = host_details.host_id
|
||||||
|
AND host_details.name = 'guest.os.category.id'
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`guest_os_category` ON guest_os_category.id = CONVERT ( host_details.value, UNSIGNED )
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`host_tags` ON host_tags.host_id = host.id
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`op_host_capacity` mem_caps ON host.id = mem_caps.host_id
|
||||||
|
AND mem_caps.capacity_type = 0
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`op_host_capacity` cpu_caps ON host.id = cpu_caps.host_id
|
||||||
|
AND cpu_caps.capacity_type = 1
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`async_job` ON async_job.instance_id = host.id
|
||||||
|
AND async_job.instance_type = 'Host'
|
||||||
|
AND async_job.job_status = 0
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`oobm` ON oobm.host_id = host.id
|
||||||
|
left join
|
||||||
|
`cloud`.`ha_config` ON ha_config.resource_id=host.id
|
||||||
|
and ha_config.resource_type='Host'
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`last_annotation_view` ON `last_annotation_view`.`entity_uuid` = `host`.`uuid`
|
||||||
|
LEFT JOIN
|
||||||
|
`cloud`.`user` ON `user`.`uuid` = `last_annotation_view`.`user_uuid`
|
||||||
|
GROUP BY
|
||||||
|
`host`.`id`;
|
||||||
|
|||||||
@ -1891,18 +1891,10 @@ public class ApiDBUtils {
|
|||||||
return s_hostJoinDao.newHostResponse(vr, details);
|
return s_hostJoinDao.newHostResponse(vr, details);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HostResponse fillHostDetails(HostResponse vrData, HostJoinVO vr) {
|
|
||||||
return s_hostJoinDao.setHostResponse(vrData, vr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HostForMigrationResponse newHostForMigrationResponse(HostJoinVO vr, EnumSet<HostDetails> details) {
|
public static HostForMigrationResponse newHostForMigrationResponse(HostJoinVO vr, EnumSet<HostDetails> details) {
|
||||||
return s_hostJoinDao.newHostForMigrationResponse(vr, details);
|
return s_hostJoinDao.newHostForMigrationResponse(vr, details);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HostForMigrationResponse fillHostForMigrationDetails(HostForMigrationResponse vrData, HostJoinVO vr) {
|
|
||||||
return s_hostJoinDao.setHostForMigrationResponse(vrData, vr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<HostJoinVO> newHostView(Host vr) {
|
public static List<HostJoinVO> newHostView(Host vr) {
|
||||||
return s_hostJoinDao.newHostView(vr);
|
return s_hostJoinDao.newHostView(vr);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -242,14 +242,7 @@ public class ViewResponseHelper {
|
|||||||
Hashtable<Long, HostResponse> vrDataList = new Hashtable<Long, HostResponse>();
|
Hashtable<Long, HostResponse> vrDataList = new Hashtable<Long, HostResponse>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (HostJoinVO vr : hosts) {
|
for (HostJoinVO vr : hosts) {
|
||||||
HostResponse vrData = vrDataList.get(vr.getId());
|
HostResponse vrData = ApiDBUtils.newHostResponse(vr, details);
|
||||||
if (vrData == null) {
|
|
||||||
// first time encountering this vm
|
|
||||||
vrData = ApiDBUtils.newHostResponse(vr, details);
|
|
||||||
} else {
|
|
||||||
// update tags
|
|
||||||
vrData = ApiDBUtils.fillHostDetails(vrData, vr);
|
|
||||||
}
|
|
||||||
vrDataList.put(vr.getId(), vrData);
|
vrDataList.put(vr.getId(), vrData);
|
||||||
}
|
}
|
||||||
return new ArrayList<HostResponse>(vrDataList.values());
|
return new ArrayList<HostResponse>(vrDataList.values());
|
||||||
@ -259,14 +252,7 @@ public class ViewResponseHelper {
|
|||||||
Hashtable<Long, HostForMigrationResponse> vrDataList = new Hashtable<Long, HostForMigrationResponse>();
|
Hashtable<Long, HostForMigrationResponse> vrDataList = new Hashtable<Long, HostForMigrationResponse>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (HostJoinVO vr : hosts) {
|
for (HostJoinVO vr : hosts) {
|
||||||
HostForMigrationResponse vrData = vrDataList.get(vr.getId());
|
HostForMigrationResponse vrData = ApiDBUtils.newHostForMigrationResponse(vr, details);
|
||||||
if (vrData == null) {
|
|
||||||
// first time encountering this vm
|
|
||||||
vrData = ApiDBUtils.newHostForMigrationResponse(vr, details);
|
|
||||||
} else {
|
|
||||||
// update tags
|
|
||||||
vrData = ApiDBUtils.fillHostForMigrationDetails(vrData, vr);
|
|
||||||
}
|
|
||||||
vrDataList.put(vr.getId(), vrData);
|
vrDataList.put(vr.getId(), vrData);
|
||||||
}
|
}
|
||||||
return new ArrayList<HostForMigrationResponse>(vrDataList.values());
|
return new ArrayList<HostForMigrationResponse>(vrDataList.values());
|
||||||
|
|||||||
@ -31,12 +31,8 @@ public interface HostJoinDao extends GenericDao<HostJoinVO, Long> {
|
|||||||
|
|
||||||
HostResponse newHostResponse(HostJoinVO host, EnumSet<HostDetails> details);
|
HostResponse newHostResponse(HostJoinVO host, EnumSet<HostDetails> details);
|
||||||
|
|
||||||
HostResponse setHostResponse(HostResponse response, HostJoinVO host);
|
|
||||||
|
|
||||||
HostForMigrationResponse newHostForMigrationResponse(HostJoinVO host, EnumSet<HostDetails> details);
|
HostForMigrationResponse newHostForMigrationResponse(HostJoinVO host, EnumSet<HostDetails> details);
|
||||||
|
|
||||||
HostForMigrationResponse setHostForMigrationResponse(HostForMigrationResponse response, HostJoinVO host);
|
|
||||||
|
|
||||||
List<HostJoinVO> newHostView(Host group);
|
List<HostJoinVO> newHostView(Host group);
|
||||||
|
|
||||||
List<HostJoinVO> searchByIds(Long... ids);
|
List<HostJoinVO> searchByIds(Long... ids);
|
||||||
|
|||||||
@ -18,6 +18,7 @@ package com.cloud.api.query.dao;
|
|||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -93,6 +94,18 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
|
|||||||
this._count = "select count(distinct id) from host_view WHERE ";
|
this._count = "select count(distinct id) from host_view WHERE ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean containsHostHATag(final String tags) {
|
||||||
|
boolean result = false;
|
||||||
|
String haTag = ApiDBUtils.getHaTag();
|
||||||
|
if (StringUtils.isNotEmpty(haTag) && StringUtils.isNotEmpty(tags)) {
|
||||||
|
List<String> tagsList = Arrays.asList(tags.split(","));
|
||||||
|
if (tagsList.contains(haTag)) {
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HostResponse newHostResponse(HostJoinVO host, EnumSet<HostDetails> details) {
|
public HostResponse newHostResponse(HostJoinVO host, EnumSet<HostDetails> details) {
|
||||||
HostResponse hostResponse = new HostResponse();
|
HostResponse hostResponse = new HostResponse();
|
||||||
@ -180,13 +193,7 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
|
|||||||
|
|
||||||
String hostTags = host.getTag();
|
String hostTags = host.getTag();
|
||||||
hostResponse.setHostTags(hostTags);
|
hostResponse.setHostTags(hostTags);
|
||||||
|
hostResponse.setHaHost(containsHostHATag(hostTags));
|
||||||
hostResponse.setHaHost(false);
|
|
||||||
String haTag = ApiDBUtils.getHaTag();
|
|
||||||
if (StringUtils.isNotEmpty(haTag) && StringUtils.isNotEmpty(hostTags) &&
|
|
||||||
haTag.equalsIgnoreCase(hostTags)) {
|
|
||||||
hostResponse.setHaHost(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
hostResponse.setHypervisorVersion(host.getHypervisorVersion());
|
hostResponse.setHypervisorVersion(host.getHypervisorVersion());
|
||||||
|
|
||||||
@ -268,26 +275,6 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
|
|||||||
return hostResponse;
|
return hostResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public HostResponse setHostResponse(HostResponse response, HostJoinVO host) {
|
|
||||||
String tag = host.getTag();
|
|
||||||
if (StringUtils.isNotEmpty(tag)) {
|
|
||||||
if (StringUtils.isNotEmpty(response.getHostTags())) {
|
|
||||||
response.setHostTags(response.getHostTags() + "," + tag);
|
|
||||||
} else {
|
|
||||||
response.setHostTags(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Boolean.FALSE.equals(response.getHaHost())) {
|
|
||||||
String haTag = ApiDBUtils.getHaTag();
|
|
||||||
if (StringUtils.isNotEmpty(haTag) && haTag.equalsIgnoreCase(tag)) {
|
|
||||||
response.setHaHost(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HostForMigrationResponse newHostForMigrationResponse(HostJoinVO host, EnumSet<HostDetails> details) {
|
public HostForMigrationResponse newHostForMigrationResponse(HostJoinVO host, EnumSet<HostDetails> details) {
|
||||||
HostForMigrationResponse hostResponse = new HostForMigrationResponse();
|
HostForMigrationResponse hostResponse = new HostForMigrationResponse();
|
||||||
@ -339,13 +326,7 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
|
|||||||
|
|
||||||
String hostTags = host.getTag();
|
String hostTags = host.getTag();
|
||||||
hostResponse.setHostTags(hostTags);
|
hostResponse.setHostTags(hostTags);
|
||||||
|
hostResponse.setHaHost(containsHostHATag(hostTags));
|
||||||
hostResponse.setHaHost(false);
|
|
||||||
String haTag = ApiDBUtils.getHaTag();
|
|
||||||
if (StringUtils.isNotEmpty(haTag) && StringUtils.isNotEmpty(hostTags) &&
|
|
||||||
haTag.equalsIgnoreCase(hostTags)) {
|
|
||||||
hostResponse.setHaHost(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
hostResponse.setHypervisorVersion(host.getHypervisorVersion());
|
hostResponse.setHypervisorVersion(host.getHypervisorVersion());
|
||||||
|
|
||||||
@ -410,26 +391,6 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
|
|||||||
return hostResponse;
|
return hostResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public HostForMigrationResponse setHostForMigrationResponse(HostForMigrationResponse response, HostJoinVO host) {
|
|
||||||
String tag = host.getTag();
|
|
||||||
if (tag != null) {
|
|
||||||
if (response.getHostTags() != null && response.getHostTags().length() > 0) {
|
|
||||||
response.setHostTags(response.getHostTags() + "," + tag);
|
|
||||||
} else {
|
|
||||||
response.setHostTags(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Boolean.FALSE.equals(response.getHaHost())) {
|
|
||||||
String haTag = ApiDBUtils.getHaTag();
|
|
||||||
if (StringUtils.isNotEmpty(haTag) && haTag.equalsIgnoreCase(tag)) {
|
|
||||||
response.setHaHost(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<HostJoinVO> newHostView(Host host) {
|
public List<HostJoinVO> newHostView(Host host) {
|
||||||
SearchCriteria<HostJoinVO> sc = hostIdSearch.create();
|
SearchCriteria<HostJoinVO> sc = hostIdSearch.create();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user