blob: f66f1264697001af207daf2587db68e39c58e46a [file] [log] [blame]
// 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();
}
}