package io.cattle.platform.docker.machine.api;
import static io.cattle.platform.core.constants.MachineConstants.*;
import io.cattle.platform.core.constants.HostConstants;
import io.cattle.platform.core.constants.MachineConstants;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.PhysicalHost;
import io.cattle.platform.object.util.DataUtils;
import io.github.ibuildthecloud.gdapi.context.ApiContext;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
import io.github.ibuildthecloud.gdapi.model.Resource;
import io.github.ibuildthecloud.gdapi.model.Schema;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.response.ResourceOutputFilter;
import org.apache.commons.lang3.StringUtils;
public class MachineLinkFilter implements ResourceOutputFilter {
@Override
public Resource filter(ApiRequest request, Object original, Resource converted) {
boolean add = false;
if (original instanceof PhysicalHost || original instanceof Host) {
if (StringUtils.isNotEmpty((String) DataUtils.getFields(original).get(EXTRACTED_CONFIG_FIELD))) {
add = canAccessConfig();
}
if (!add && original instanceof Host && StringUtils.isNotEmpty((String) converted.getFields().get(MachineConstants.FIELD_DRIVER))) {
add = canAccessConfig();
}
}
if (add) {
converted.getLinks().put(CONFIG_LINK, ApiContext.getUrlBuilder().resourceLink(converted, CONFIG_LINK));
}
return converted;
}
public static boolean canAccessConfig() {
SchemaFactory schemaFactory = ApiContext.getSchemaFactory();
Schema machineSchema = schemaFactory == null ? null :schemaFactory.getSchema(KIND_MACHINE);
return machineSchema != null && machineSchema.getCollectionMethods().contains(Schema.Method.POST.toString());
}
@Override
public String[] getTypes() {
return new String[] { KIND_MACHINE, HostConstants.TYPE };
}
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[0];
}
}