package com.linkedin.pinot.controller.api.restlet.resources;
import com.linkedin.pinot.controller.helix.core.PinotResourceManagerResponse;
import java.io.File;
import java.io.IOException;
import com.linkedin.pinot.common.metrics.ControllerMeter;
import com.linkedin.pinot.controller.api.ControllerRestApplication;
import org.apache.commons.io.FileUtils;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Post;
import org.restlet.resource.Put;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linkedin.pinot.common.restlet.swagger.HttpVerb;
import com.linkedin.pinot.common.restlet.swagger.Parameter;
import com.linkedin.pinot.common.restlet.swagger.Paths;
import com.linkedin.pinot.common.restlet.swagger.Summary;
import com.linkedin.pinot.common.restlet.swagger.Tags;
public class PinotTableTenantConfigs extends BasePinotControllerRestletResource {
private static final Logger LOGGER = LoggerFactory.getLogger(PinotTableTenantConfigs.class);
private final File baseDataDir;
private final File tempDir;
public PinotTableTenantConfigs() throws IOException {
baseDataDir = new File(_controllerConf.getDataDir());
if (!baseDataDir.exists()) {
FileUtils.forceMkdir(baseDataDir);
}
tempDir = new File(baseDataDir, "schemasTemp");
if (!tempDir.exists()) {
FileUtils.forceMkdir(tempDir);
}
}
@Deprecated
@Override
@Put("json")
public Representation put(Representation entity) {
try {
return updateTenantConfig("dummy");
} catch (Exception e) {
LOGGER.error("Caught exception while updating tenant config " , e);
ControllerRestApplication.getControllerMetrics().addMeteredGlobalValue(ControllerMeter.CONTROLLER_TABLE_TENANT_UPDATE_ERROR, 1L);
setStatus(Status.SERVER_ERROR_INTERNAL);
return PinotSegmentUploadRestletResource.exceptionToStringRepresentation(e);
}
}
@Deprecated
@HttpVerb("put")
@Summary("DEPRECATED: Updates the tenant configuration for a table")
@Tags({"table"})
@Paths({
"/tables/{tableName}/tenantConfigs"
})
private Representation updateTenantConfig(
@Parameter(name = "tableName", in = "path", description = "The name of the table for which to update the tenant configuration", required = true)
String tableName) {
throw new UnsupportedOperationException("current tenant config updates are not supported");
}
@Override
@Post()
public Representation post(Representation entity) {
final String tableName = (String) getRequest().getAttributes().get("tableName");
try {
return rebuildBrokerResourceFromHelixTags(tableName);
} catch (Exception e) {
setStatus(Status.SERVER_ERROR_INTERNAL);
return PinotSegmentUploadRestletResource.exceptionToStringRepresentation(e);
}
}
@HttpVerb("post")
@Summary("Rebuild broker mapping from Helix tags")
@Tags({"table", "tenant"})
@Paths({
"/tables/{tableName}/rebuildBrokerResourceFromHelixTags"
})
private Representation rebuildBrokerResourceFromHelixTags(
@Parameter(name = "tableName", in = "path", description = "The name of the table for which to rebuild the broker mapping (eg. myTable_OFFLINE or myTable_REALTIME)", required = true)
String tableName
) {
final PinotResourceManagerResponse pinotResourceManagerResponse =
_pinotHelixResourceManager.rebuildBrokerResourceFromHelixTags(tableName);
if (!pinotResourceManagerResponse.isSuccessful()) {
setStatus(Status.SERVER_ERROR_INTERNAL);
}
return new StringRepresentation(pinotResourceManagerResponse.toString());
}
}