package io.cattle.platform.iaas.api.filter.instance; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.dao.AgentDao; import io.cattle.platform.core.model.Image; import io.cattle.platform.core.model.Instance; import io.cattle.platform.iaas.api.filter.common.AbstractDefaultResourceManagerFilter; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.util.DataUtils; import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException; import io.github.ibuildthecloud.gdapi.exception.ValidationErrorException; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManagerLocator; import io.github.ibuildthecloud.gdapi.util.ResponseCodes; import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes; import javax.inject.Inject; import com.netflix.config.DynamicBooleanProperty; public class InstanceImageValidationFilter extends AbstractDefaultResourceManagerFilter { private static final DynamicBooleanProperty REQUIRE_INSTANCE_IMAGE = ArchaiusUtil.getBoolean("api.instance.require.image"); ResourceManagerLocator locator; ObjectManager objectManager; AgentDao agentDao; @Override public String[] getTypes() { return new String[] { "container", "virtualMachine" }; } @Override public Class<?>[] getTypeClasses() { return new Class<?>[] { Instance.class }; } @Override public Object create(String type, ApiRequest request, ResourceManager next) { Instance container = request.proxyRequestObject(Instance.class); if (REQUIRE_INSTANCE_IMAGE.get()) { Long imageId = container.getImageId(); String imageUuid = DataUtils.getFieldFromRequest(request, InstanceConstants.FIELD_IMAGE_UUID, String.class); if (imageId == null && imageUuid == null) { throw new ValidationErrorException(ValidationErrorCodes.MISSING_REQUIRED, InstanceConstants.FIELD_IMAGE_UUID); } } Long imageId = container.getImageId(); Image image = getObjectManager().loadResource(Image.class, imageId); if (image != null && image.getInstanceKind() != null) { if (!image.getInstanceKind().equals(type)) { throw new ClientVisibleException(ResponseCodes.UNPROCESSABLE_ENTITY, "InvalidImageInstanceKind"); } } return super.create(type, request, next); } public ObjectManager getObjectManager() { return objectManager; } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } }