//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 com.cloud.gpu.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import javax.inject.Inject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.agent.api.VgpuTypesInfo; import com.cloud.gpu.HostGpuGroupsVO; import com.cloud.gpu.VGPUTypesVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.exception.CloudRuntimeException; @Component public class VGPUTypesDaoImpl extends GenericDaoBase<VGPUTypesVO, Long> implements VGPUTypesDao { private static final Logger s_logger = Logger.getLogger(VGPUTypesDaoImpl.class); private final SearchBuilder<VGPUTypesVO> _searchByGroupId; private final SearchBuilder<VGPUTypesVO> _searchByGroupIdVGPUType; @Inject protected HostGpuGroupsDao _hostGpuGroupsDao; private static final String LIST_ZONE_POD_CLUSTER_WIDE_GPU_CAPACITIES = "SELECT host_gpu_groups.group_name, vgpu_type, max_vgpu_per_pgpu, SUM(remaining_capacity) AS remaining_capacity, SUM(max_capacity) AS total_capacity FROM" + " `cloud`.`vgpu_types` INNER JOIN `cloud`.`host_gpu_groups` ON vgpu_types.gpu_group_id = host_gpu_groups.id INNER JOIN `cloud`.`host`" + " ON host_gpu_groups.host_id = host.id WHERE host.type = 'Routing' AND host.data_center_id = ?"; public VGPUTypesDaoImpl() { _searchByGroupId = createSearchBuilder(); _searchByGroupId.and("groupId", _searchByGroupId.entity().getGpuGroupId(), SearchCriteria.Op.EQ); _searchByGroupId.done(); _searchByGroupIdVGPUType = createSearchBuilder(); _searchByGroupIdVGPUType.and("groupId", _searchByGroupIdVGPUType.entity().getGpuGroupId(), SearchCriteria.Op.EQ); _searchByGroupIdVGPUType.and("vgpuType", _searchByGroupIdVGPUType.entity().getVgpuType(), SearchCriteria.Op.EQ); _searchByGroupIdVGPUType.done(); } @Override public List<VgpuTypesInfo> listGPUCapacities(Long dcId, Long podId, Long clusterId) { StringBuilder finalQuery = new StringBuilder(); TransactionLegacy txn = TransactionLegacy.currentTxn(); PreparedStatement pstmt = null; List<Long> resourceIdList = new ArrayList<Long>(); ArrayList<VgpuTypesInfo> result = new ArrayList<VgpuTypesInfo>(); resourceIdList.add(dcId); finalQuery.append(LIST_ZONE_POD_CLUSTER_WIDE_GPU_CAPACITIES); if (podId != null) { finalQuery.append(" AND host.pod_id = ?"); resourceIdList.add(podId); } if (clusterId != null) { finalQuery.append(" AND host.cluster_id = ?"); resourceIdList.add(clusterId); } finalQuery.append(" GROUP BY host_gpu_groups.group_name, vgpu_type"); try { pstmt = txn.prepareAutoCloseStatement(finalQuery.toString()); for (int i = 0; i < resourceIdList.size(); i++) { pstmt.setLong(1 + i, resourceIdList.get(i)); } ResultSet rs = pstmt.executeQuery(); while (rs.next()) { VgpuTypesInfo gpuCapacity = new VgpuTypesInfo(rs.getString(1), rs.getString(2), null, null, null, null, rs.getLong(3), rs.getLong(4), rs.getLong(5)); result.add(gpuCapacity); } return result; } catch (SQLException e) { throw new CloudRuntimeException("DB Exception on: " + finalQuery, e); } catch (Throwable e) { throw new CloudRuntimeException("Caught: " + finalQuery, e); } } @Override public List<VGPUTypesVO> listByGroupId(long groupId) { SearchCriteria<VGPUTypesVO> sc = _searchByGroupId.create(); sc.setParameters("groupId", groupId); return listBy(sc); } @Override public VGPUTypesVO findByGroupIdVGPUType(long groupId, String vgpuType) { SearchCriteria<VGPUTypesVO> sc = _searchByGroupIdVGPUType.create(); sc.setParameters("groupId", groupId); sc.setParameters("vgpuType", vgpuType); return findOneBy(sc); } @Override public void persist(long hostId, HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails) { Iterator<Entry<String, HashMap<String, VgpuTypesInfo>>> it1 = groupDetails.entrySet().iterator(); while (it1.hasNext()) { Entry<String, HashMap<String, VgpuTypesInfo>> entry = it1.next(); HostGpuGroupsVO gpuGroup = _hostGpuGroupsDao.findByHostIdGroupName(hostId, entry.getKey()); HashMap<String, VgpuTypesInfo> values = entry.getValue(); Iterator<Entry<String, VgpuTypesInfo>> it2 = values.entrySet().iterator(); while (it2.hasNext()) { Entry<String, VgpuTypesInfo> record = it2.next(); VgpuTypesInfo details = record.getValue(); VGPUTypesVO vgpuType = null; if ((vgpuType = findByGroupIdVGPUType(gpuGroup.getId(), record.getKey())) == null) { persist(new VGPUTypesVO(gpuGroup.getId(), record.getKey(), details.getVideoRam(), details.getMaxHeads(), details.getMaxResolutionX(), details.getMaxResolutionY(), details.getMaxVpuPerGpu(), details.getRemainingCapacity(), details.getMaxCapacity())); } else { vgpuType.setRemainingCapacity(details.getRemainingCapacity()); vgpuType.setMaxCapacity(details.getMaxCapacity()); update(vgpuType.getId(), vgpuType); } } } } }