package io.cattle.platform.metadata.dao.impl;
import static io.cattle.platform.core.model.tables.CredentialInstanceMapTable.*;
import static io.cattle.platform.core.model.tables.CredentialTable.*;
import static io.cattle.platform.core.model.tables.InstanceTable.*;
import static io.cattle.platform.core.model.tables.IpAddressNicMapTable.*;
import static io.cattle.platform.core.model.tables.IpAddressTable.*;
import static io.cattle.platform.core.model.tables.NetworkTable.*;
import static io.cattle.platform.core.model.tables.NicTable.*;
import static io.cattle.platform.core.model.tables.SubnetTable.*;
import static io.cattle.platform.core.model.tables.VolumeTable.*;
import io.cattle.platform.core.constants.CredentialConstants;
import io.cattle.platform.core.constants.IpAddressConstants;
import io.cattle.platform.core.dao.NetworkDao;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.Zone;
import io.cattle.platform.core.model.tables.CredentialTable;
import io.cattle.platform.core.model.tables.InstanceTable;
import io.cattle.platform.core.model.tables.IpAddressTable;
import io.cattle.platform.core.model.tables.NetworkTable;
import io.cattle.platform.core.model.tables.NicTable;
import io.cattle.platform.core.model.tables.SubnetTable;
import io.cattle.platform.core.model.tables.VolumeTable;
import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao;
import io.cattle.platform.db.jooq.mapper.AggregateMultiRecordMapper;
import io.cattle.platform.db.jooq.mapper.MultiRecordMapper;
import io.cattle.platform.metadata.dao.MetadataDao;
import io.cattle.platform.metadata.data.MetadataEntry;
import io.cattle.platform.object.ObjectManager;
import java.util.List;
import javax.inject.Inject;
import org.jooq.ResultQuery;
public class MetadataDaoImpl extends AbstractJooqDao implements MetadataDao {
NetworkDao networkDao;
ObjectManager objectManager;
private List<MetadataEntry> getMetaDataInternal(Instance agentInstance) {
MultiRecordMapper<MetadataEntry> mapper = new AggregateMultiRecordMapper<MetadataEntry>(MetadataEntry.class);
InstanceTable instance = mapper.add(INSTANCE);
NicTable nic = mapper.add(NIC);
IpAddressTable primaryIp = mapper.add(IP_ADDRESS);
VolumeTable volume = mapper.add(VOLUME);
CredentialTable credential = mapper.add(CREDENTIAL);
NetworkTable network = mapper.add(NETWORK);
SubnetTable subnet = mapper.add(SUBNET);
ResultQuery<?> q = create()
.select(mapper.fields())
.from(nic)
.join(instance)
.on(nic.INSTANCE_ID.eq(instance.ID))
.join(network)
.on(network.ID.eq(nic.NETWORK_ID))
.leftOuterJoin(volume)
.on(volume.INSTANCE_ID.eq(instance.ID)
.and(volume.REMOVED.isNull()))
.leftOuterJoin(CREDENTIAL_INSTANCE_MAP)
.on(CREDENTIAL_INSTANCE_MAP.INSTANCE_ID.eq(instance.ID)
.and(CREDENTIAL_INSTANCE_MAP.REMOVED.isNull()))
.leftOuterJoin(credential)
.on(CREDENTIAL_INSTANCE_MAP.CREDENTIAL_ID.eq(credential.ID)
.and(credential.REMOVED.isNull())
.and(credential.KIND.eq(CredentialConstants.KIND_SSH_KEY)))
.leftOuterJoin(IP_ADDRESS_NIC_MAP)
.on(IP_ADDRESS_NIC_MAP.NIC_ID.eq(nic.ID)
.and(IP_ADDRESS_NIC_MAP.REMOVED.isNull()))
.leftOuterJoin(primaryIp)
.on(IP_ADDRESS_NIC_MAP.IP_ADDRESS_ID.eq(primaryIp.ID)
.and(primaryIp.ROLE.in(IpAddressConstants.ROLE_PRIMARY, IpAddressConstants.ROLE_SECONDARY))
.and(primaryIp.REMOVED.isNull()))
.leftOuterJoin(subnet)
.on(primaryIp.SUBNET_ID.eq(subnet.ID))
.where(nic.INSTANCE_ID.eq(agentInstance.getId()).and(nic.REMOVED.isNull()));
return q.fetch().map(mapper);
}
@Override
public MetadataEntry getMetadataForInstance(Instance agentInstance) {
List<MetadataEntry> entries = getMetaDataInternal(agentInstance);
return entries.size() > 0 ? entries.get(0) : null;
}
@Override
public Zone getZone(Instance instance) {
return objectManager.loadResource(Zone.class, instance.getZoneId());
}
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
public NetworkDao getNetworkDao() {
return networkDao;
}
@Inject
public void setNetworkDao(NetworkDao networkDao) {
this.networkDao = networkDao;
}
}