// 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.affinity.dao; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; import org.apache.cloudstack.affinity.AffinityGroupVO; import com.cloud.utils.Pair; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.TransactionLegacy; public class AffinityGroupVMMapDaoImpl extends GenericDaoBase<AffinityGroupVMMapVO, Long> implements AffinityGroupVMMapDao { private SearchBuilder<AffinityGroupVMMapVO> ListByVmId; private SearchBuilder<AffinityGroupVMMapVO> ListByVmIdGroupId; protected GenericSearchBuilder<AffinityGroupVMMapVO, Long> CountSGForVm; private GenericSearchBuilder<AffinityGroupVMMapVO, Long> ListVmIdByAffinityGroup; private SearchBuilder<AffinityGroupVMMapVO> ListByAffinityGroup; private SearchBuilder<AffinityGroupVMMapVO> ListByVmIdType; private GenericSearchBuilder<AffinityGroupVMMapVO, Long> ListAffinityGroupIdByVm; @Inject protected AffinityGroupDao _affinityGroupDao; public AffinityGroupVMMapDaoImpl() { } @PostConstruct protected void init() { ListVmIdByAffinityGroup = createSearchBuilder(Long.class); ListVmIdByAffinityGroup.and("affinityGroupId", ListVmIdByAffinityGroup.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); ListVmIdByAffinityGroup.selectFields(ListVmIdByAffinityGroup.entity().getInstanceId()); ListVmIdByAffinityGroup.done(); ListByAffinityGroup = createSearchBuilder(); ListByAffinityGroup.and("affinityGroupId", ListByAffinityGroup.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); ListByAffinityGroup.done(); ListByVmId = createSearchBuilder(); ListByVmId.and("instanceId", ListByVmId.entity().getInstanceId(), SearchCriteria.Op.EQ); ListByVmId.done(); ListByVmIdGroupId = createSearchBuilder(); ListByVmIdGroupId.and("instanceId", ListByVmIdGroupId.entity().getInstanceId(), SearchCriteria.Op.EQ); ListByVmIdGroupId.and("affinityGroupId", ListByVmIdGroupId.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); ListByVmIdGroupId.done(); SearchBuilder<AffinityGroupVO> groupSearch = _affinityGroupDao.createSearchBuilder(); groupSearch.and("type", groupSearch.entity().getType(), SearchCriteria.Op.EQ); ListByVmIdType = createSearchBuilder(); ListByVmIdType.and("instanceId", ListByVmIdType.entity().getInstanceId(), SearchCriteria.Op.EQ); ListByVmIdType.join("groupSearch", groupSearch, ListByVmIdType.entity().getAffinityGroupId(), groupSearch.entity().getId(), JoinType.INNER); ListByVmIdType.done(); CountSGForVm = createSearchBuilder(Long.class); CountSGForVm.select(null, Func.COUNT, null); CountSGForVm.and("vmId", CountSGForVm.entity().getInstanceId(), SearchCriteria.Op.EQ); CountSGForVm.done(); ListAffinityGroupIdByVm = createSearchBuilder(Long.class); ListAffinityGroupIdByVm.and("instanceId", ListAffinityGroupIdByVm.entity().getInstanceId(), SearchCriteria.Op.EQ); ListAffinityGroupIdByVm.selectFields(ListAffinityGroupIdByVm.entity().getAffinityGroupId()); ListAffinityGroupIdByVm.done(); } @Override public List<AffinityGroupVMMapVO> listByAffinityGroup(long affinityGroupId) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByAffinityGroup.create(); sc.setParameters("affinityGroupId", affinityGroupId); return listBy(sc); } @Override public List<AffinityGroupVMMapVO> listByInstanceId(long vmId) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); return listBy(sc); } @Override public Pair<List<AffinityGroupVMMapVO>, Integer> listByInstanceId(long instanceId, Filter filter) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByVmId.create(); sc.setParameters("instanceId", instanceId); return this.searchAndCount(sc, filter); } @Override public int deleteVM(long instanceId) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByVmId.create(); sc.setParameters("instanceId", instanceId); return super.expunge(sc); } @Override public List<Long> listVmIdsByAffinityGroup(long affinityGroupId) { SearchCriteria<Long> sc = ListVmIdByAffinityGroup.create(); sc.setParameters("affinityGroupId", affinityGroupId); return customSearchIncludingRemoved(sc, null); } @Override public AffinityGroupVMMapVO findByVmIdGroupId(long instanceId, long affinityGroupId) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByVmIdGroupId.create(); sc.setParameters("affinityGroupId", affinityGroupId); sc.setParameters("instanceId", instanceId); return findOneIncludingRemovedBy(sc); } @Override public long countAffinityGroupsForVm(long instanceId) { SearchCriteria<Long> sc = CountSGForVm.create(); sc.setParameters("vmId", instanceId); return customSearch(sc, null).get(0); } @Override public List<AffinityGroupVMMapVO> findByVmIdType(long instanceId, String type) { SearchCriteria<AffinityGroupVMMapVO> sc = ListByVmIdType.create(); sc.setParameters("instanceId", instanceId); sc.setJoinParameters("groupSearch", "type", type); return listBy(sc); } @Override public List<Long> listAffinityGroupIdsByVmId(long instanceId) { SearchCriteria<Long> sc = ListAffinityGroupIdByVm.create(); sc.setParameters("instanceId", instanceId); return customSearchIncludingRemoved(sc, null); } @Override public void updateMap(Long vmId, List<Long> affinityGroupIds) { TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start(); SearchCriteria<AffinityGroupVMMapVO> sc = createSearchCriteria(); sc.addAnd("instanceId", SearchCriteria.Op.EQ, vmId); expunge(sc); for (Long groupId : affinityGroupIds) { AffinityGroupVMMapVO vo = new AffinityGroupVMMapVO(groupId, vmId); persist(vo); } txn.commit(); } }