package io.cattle.platform.iaas.api.filter.hosts;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.constants.HostConstants;
import io.cattle.platform.core.constants.MachineConstants;
import io.cattle.platform.core.dao.HostDao;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.PhysicalHost;
import io.cattle.platform.iaas.api.filter.common.CachedOutputFilter;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.util.DataUtils;
import io.cattle.platform.util.type.Priority;
import io.github.ibuildthecloud.gdapi.context.ApiContext;
import io.github.ibuildthecloud.gdapi.model.Resource;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
public class HostsFilter extends CachedOutputFilter<HostsFilter.Data> implements Priority {
@Inject
HostDao hostDao;
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[] { Host.class };
}
@Override
public String[] getTypes() {
return new String[] {};
}
@Override
public Resource filter(ApiRequest request, Object original, Resource converted) {
if (request != null && "v1".equals(request.getVersion())) {
return converted;
}
if (original instanceof Host) {
Host host = (Host)original;
Data data = getCached(request);
if (data == null) {
return converted;
}
PhysicalHost physicalHost = data.physicalHosts.get(host.getPhysicalHostId());
Map<String, Object> fields = converted.getFields();
fields.put(HostConstants.FIELD_INSTANCE_IDS, data.instancesPerHost.get(host.getId()));
if (physicalHost != null) {
Map<String, Object> phFields = DataUtils.getFields(physicalHost);
for (Map.Entry<String, Object> entry : phFields.entrySet()) {
if (entry.getValue() == null || MachineConstants.EXTRACTED_CONFIG_FIELD.equals(entry.getKey())) {
continue;
}
String key = entry.getKey();
if (key.equals(MachineConstants.FIELD_DRIVER) || key.endsWith(MachineConstants.CONFIG_FIELD_SUFFIX)) {
fields.put(key, entry.getValue());
}
}
}
String agentState = host.getAgentState();
if (CommonStatesConstants.ACTIVE.equals(host.getState()) && StringUtils.isNotBlank(agentState)) {
fields.put(ObjectMetaDataManager.STATE_FIELD, agentState);
}
}
return converted;
}
@Override
protected HostsFilter.Data newObject(ApiRequest apiRequest) {
List<Long> ids = getIds(apiRequest);
Data data = new Data();
data.instancesPerHost = hostDao.getInstancesPerHost(ids, ApiContext.getContext().getIdFormatter());
data.physicalHosts = hostDao.getPhysicalHostsForHosts(ids);
return data;
}
@Override
protected Long getId(Object obj) {
if (obj instanceof Host) {
return ((Host) obj).getId();
}
return null;
}
static class Data {
Map<Long, List<Object>> instancesPerHost;
Map<Long, PhysicalHost> physicalHosts;
}
@Override
public int getPriority() {
return Priority.PRE;
}
}