use of org.apache.ignite.internal.processors.rest.request.GridRestNodeStateBeforeStartRequest in project ignite by apache.
the class GridJettyRestHandler method createRequest.
/**
* Creates REST request.
*
* @param cmd Command.
* @param params Parameters.
* @param req Servlet request.
* @return REST request.
* @throws IgniteCheckedException If creation failed.
*/
@Nullable
private GridRestRequest createRequest(GridRestCommand cmd, Map<String, String> params, HttpServletRequest req) throws IgniteCheckedException {
GridRestRequest restReq;
switch(cmd) {
case GET_OR_CREATE_CACHE:
{
GridRestCacheRequest restReq0 = new GridRestCacheRequest();
restReq0.cacheName(params.get(CACHE_NAME_PARAM));
String templateName = params.get(TEMPLATE_NAME_PARAM);
if (!F.isEmpty(templateName))
restReq0.templateName(templateName);
String backups = params.get(BACKUPS_PARAM);
CacheConfigurationOverride cfg = new CacheConfigurationOverride();
// Set cache backups.
if (!F.isEmpty(backups)) {
try {
cfg.backups(Integer.parseInt(backups));
} catch (NumberFormatException e) {
throw new IgniteCheckedException("Failed to parse number of cache backups: " + backups, e);
}
}
// Set cache group name.
String cacheGrp = params.get(CACHE_GROUP_PARAM);
if (!F.isEmpty(cacheGrp))
cfg.cacheGroup(cacheGrp);
// Set cache data region name.
String dataRegion = params.get(DATA_REGION_PARAM);
if (!F.isEmpty(dataRegion))
cfg.dataRegion(dataRegion);
// Set cache write mode.
String wrtSyncMode = params.get(WRITE_SYNCHRONIZATION_MODE_PARAM);
if (!F.isEmpty(wrtSyncMode)) {
try {
cfg.writeSynchronizationMode(CacheWriteSynchronizationMode.valueOf(wrtSyncMode));
} catch (IllegalArgumentException e) {
throw new IgniteCheckedException("Failed to parse cache write synchronization mode: " + wrtSyncMode, e);
}
}
if (!cfg.isEmpty())
restReq0.configuration(cfg);
restReq = restReq0;
break;
}
case DESTROY_CACHE:
{
GridRestCacheRequest restReq0 = new GridRestCacheRequest();
restReq0.cacheName(params.get(CACHE_NAME_PARAM));
restReq = restReq0;
break;
}
case ATOMIC_DECREMENT:
case ATOMIC_INCREMENT:
{
DataStructuresRequest restReq0 = new DataStructuresRequest();
restReq0.key(params.get("key"));
restReq0.initial(longValue("init", params, null));
restReq0.delta(longValue("delta", params, null));
restReq = restReq0;
break;
}
case CACHE_CONTAINS_KEY:
case CACHE_CONTAINS_KEYS:
case CACHE_GET:
case CACHE_GET_ALL:
case CACHE_GET_AND_PUT:
case CACHE_GET_AND_REPLACE:
case CACHE_PUT_IF_ABSENT:
case CACHE_GET_AND_PUT_IF_ABSENT:
case CACHE_PUT:
case CACHE_PUT_ALL:
case CACHE_REMOVE:
case CACHE_REMOVE_VALUE:
case CACHE_REPLACE_VALUE:
case CACHE_GET_AND_REMOVE:
case CACHE_REMOVE_ALL:
case CACHE_CLEAR:
case CACHE_ADD:
case CACHE_CAS:
case CACHE_METRICS:
case CACHE_SIZE:
case CACHE_UPDATE_TLL:
case CACHE_METADATA:
case CACHE_REPLACE:
case CACHE_APPEND:
case CACHE_PREPEND:
{
GridRestCacheRequest restReq0 = new GridRestCacheRequest();
String cacheName = params.get(CACHE_NAME_PARAM);
restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
String keyType = params.get("keyType");
String valType = params.get("valueType");
Converter converter = new Converter(cacheName);
restReq0.key(converter.convert(keyType, params.get("key")));
restReq0.value(converter.convert(valType, params.get("val")));
restReq0.value2(converter.convert(valType, params.get("val2")));
Object val1 = converter.convert(valType, params.get("val1"));
if (val1 != null)
restReq0.value(val1);
// Cache operations via REST will use binary objects.
restReq0.cacheFlags(intValue("cacheFlags", params, KEEP_BINARIES_MASK));
restReq0.ttl(longValue("exp", params, null));
if (cmd == CACHE_GET_ALL || cmd == CACHE_PUT_ALL || cmd == CACHE_REMOVE_ALL || cmd == CACHE_CONTAINS_KEYS) {
List<Object> keys = converter.values(keyType, "k", params);
List<Object> vals = converter.values(valType, "v", params);
if (keys.size() < vals.size())
throw new IgniteCheckedException("Number of keys must be greater or equals to number of values.");
Map<Object, Object> map = U.newHashMap(keys.size());
Iterator<Object> keyIt = keys.iterator();
Iterator<Object> valIt = vals.iterator();
while (keyIt.hasNext()) map.put(keyIt.next(), valIt.hasNext() ? valIt.next() : null);
restReq0.values(map);
}
restReq = restReq0;
break;
}
case TOPOLOGY:
case NODE:
{
GridRestTopologyRequest restReq0 = new GridRestTopologyRequest();
restReq0.includeMetrics(Boolean.parseBoolean(params.get("mtr")));
restReq0.includeAttributes(Boolean.parseBoolean(params.get("attr")));
String caches = params.get("caches");
restReq0.includeCaches(caches == null || Boolean.parseBoolean(caches));
restReq0.nodeIp(params.get("ip"));
restReq0.nodeId(uuidValue("id", params));
restReq = restReq0;
break;
}
case EXE:
case RESULT:
case NOOP:
{
GridRestTaskRequest restReq0 = new GridRestTaskRequest();
restReq0.taskId(params.get("id"));
restReq0.taskName(params.get("name"));
restReq0.params(new Converter().values(null, "p", params));
restReq0.async(Boolean.parseBoolean(params.get("async")));
restReq0.timeout(longValue("timeout", params, 0L));
restReq = restReq0;
break;
}
case LOG:
{
GridRestLogRequest restReq0 = new GridRestLogRequest();
restReq0.path(params.get("path"));
restReq0.from(intValue("from", params, -1));
restReq0.to(intValue("to", params, -1));
restReq = restReq0;
break;
}
case DATA_REGION_METRICS:
case DATA_STORAGE_METRICS:
case NAME:
case VERSION:
case PROBE:
{
restReq = new GridRestRequest();
break;
}
case CLUSTER_ACTIVE:
case CLUSTER_INACTIVE:
case CLUSTER_ACTIVATE:
case CLUSTER_DEACTIVATE:
case CLUSTER_CURRENT_STATE:
{
GridRestChangeStateRequest restReq0 = new GridRestChangeStateRequest();
if (cmd == CLUSTER_CURRENT_STATE)
restReq0.reqCurrentState();
else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE)
restReq0.active(true);
else
restReq0.active(false);
restReq0.forceDeactivation(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false));
restReq = restReq0;
break;
}
case CLUSTER_STATE:
case CLUSTER_SET_STATE:
{
GridRestClusterStateRequest restReq0 = new GridRestClusterStateRequest();
if (cmd == CLUSTER_STATE)
restReq0.reqCurrentMode();
else {
ClusterState newState = enumValue("state", params, ClusterState.class);
restReq0.state(newState);
restReq0.forceDeactivation(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false));
}
restReq = restReq0;
break;
}
case CLUSTER_NAME:
{
restReq = new GridRestClusterNameRequest();
break;
}
case BASELINE_CURRENT_STATE:
case BASELINE_SET:
case BASELINE_ADD:
case BASELINE_REMOVE:
{
GridRestBaselineRequest restReq0 = new GridRestBaselineRequest();
restReq0.topologyVersion(longValue("topVer", params, null));
restReq0.consistentIds(new Converter().values(null, "consistentId", params));
restReq = restReq0;
break;
}
case AUTHENTICATE:
{
restReq = new GridRestRequest();
break;
}
case ADD_USER:
case REMOVE_USER:
case UPDATE_USER:
{
RestUserActionRequest restReq0 = new RestUserActionRequest();
restReq0.user(params.get("user"));
restReq0.password(params.get("password"));
restReq = restReq0;
break;
}
case EXECUTE_SQL_QUERY:
case EXECUTE_SQL_FIELDS_QUERY:
{
RestQueryRequest restReq0 = new RestQueryRequest();
String cacheName = params.get(CACHE_NAME_PARAM);
restReq0.sqlQuery(params.get("qry"));
restReq0.arguments(new Converter(cacheName).values(null, "arg", params).toArray());
restReq0.typeName(params.get("type"));
String pageSize = params.get("pageSize");
if (pageSize != null)
restReq0.pageSize(Integer.parseInt(pageSize));
String keepBinary = params.get("keepBinary");
if (keepBinary != null)
restReq0.keepBinary(Boolean.parseBoolean(keepBinary));
String distributedJoins = params.get("distributedJoins");
if (distributedJoins != null)
restReq0.distributedJoins(Boolean.parseBoolean(distributedJoins));
restReq0.cacheName(cacheName);
if (cmd == EXECUTE_SQL_QUERY)
restReq0.queryType(RestQueryRequest.QueryType.SQL);
else
restReq0.queryType(RestQueryRequest.QueryType.SQL_FIELDS);
restReq = restReq0;
break;
}
case EXECUTE_SCAN_QUERY:
{
RestQueryRequest restReq0 = new RestQueryRequest();
restReq0.sqlQuery(params.get("qry"));
String pageSize = params.get("pageSize");
if (pageSize != null)
restReq0.pageSize(Integer.parseInt(pageSize));
restReq0.cacheName(params.get(CACHE_NAME_PARAM));
restReq0.className(params.get("className"));
restReq0.queryType(RestQueryRequest.QueryType.SCAN);
restReq = restReq0;
break;
}
case FETCH_SQL_QUERY:
{
RestQueryRequest restReq0 = new RestQueryRequest();
String qryId = params.get("qryId");
if (qryId != null)
restReq0.queryId(Long.parseLong(qryId));
String pageSize = params.get("pageSize");
if (pageSize != null)
restReq0.pageSize(Integer.parseInt(pageSize));
restReq0.cacheName(params.get(CACHE_NAME_PARAM));
restReq = restReq0;
break;
}
case CLOSE_SQL_QUERY:
{
RestQueryRequest restReq0 = new RestQueryRequest();
String qryId = params.get("qryId");
if (qryId != null)
restReq0.queryId(Long.parseLong(qryId));
restReq0.cacheName(params.get(CACHE_NAME_PARAM));
restReq = restReq0;
break;
}
case NODE_STATE_BEFORE_START:
{
restReq = new GridRestNodeStateBeforeStartRequest();
break;
}
case WARM_UP:
{
GridRestWarmUpRequest restReq0 = new GridRestWarmUpRequest();
restReq0.stopWarmUp(Boolean.parseBoolean(String.valueOf(params.get("stopWarmUp"))));
restReq = restReq0;
break;
}
default:
throw new IgniteCheckedException("Invalid command: " + cmd);
}
restReq.address(new InetSocketAddress(req.getRemoteAddr(), req.getRemotePort()));
restReq.command(cmd);
Object certs = req.getAttribute("javax.servlet.request.X509Certificate");
if (certs instanceof X509Certificate[])
restReq.certificates((X509Certificate[]) certs);
// TODO: In IGNITE 3.0 we should check credentials only for AUTHENTICATE command.
if (!credentials(params, IGNITE_LOGIN, IGNITE_PASSWORD, restReq))
credentials(params, USER_PARAM, PWD_PARAM, restReq);
String clientId = params.get("clientId");
try {
if (clientId != null)
restReq.clientId(UUID.fromString(clientId));
} catch (Exception ignored) {
// Ignore invalid client id. Rest handler will process this logic.
}
String destId = params.get("destId");
try {
if (destId != null)
restReq.destinationId(UUID.fromString(destId));
} catch (IllegalArgumentException ignored) {
// Don't fail - try to execute locally.
}
String sesTokStr = params.get("sessionToken");
try {
if (sesTokStr != null) {
// Token is a UUID encoded as 16 bytes as HEX.
byte[] bytes = U.hexString2ByteArray(sesTokStr);
if (bytes.length == 16)
restReq.sessionToken(bytes);
}
} catch (IllegalArgumentException ignored) {
// Ignore invalid session token.
}
return restReq;
}
use of org.apache.ignite.internal.processors.rest.request.GridRestNodeStateBeforeStartRequest in project ignite by apache.
the class GridTcpRestNioListener method createRestRequest.
/**
* Creates a REST request object from client TCP binary packet.
*
* @param ses NIO session.
* @param msg Request message.
* @return REST request object.
*/
@Nullable
private GridRestRequest createRestRequest(GridNioSession ses, GridClientMessage msg) {
GridRestRequest restReq = null;
if (msg instanceof GridClientAuthenticationRequest) {
GridClientAuthenticationRequest req = (GridClientAuthenticationRequest) msg;
restReq = new GridRestAuthenticationRequest();
restReq.command(NOOP);
ses.addMeta(CREDS_KEY, req.credentials());
ses.addMeta(USER_ATTR_KEY, req.userAttributes());
} else if (msg instanceof GridClientCacheRequest) {
GridClientCacheRequest req = (GridClientCacheRequest) msg;
GridRestCacheRequest restCacheReq = new GridRestCacheRequest();
restCacheReq.cacheName(req.cacheName());
restCacheReq.cacheFlags(req.cacheFlagsOn());
restCacheReq.key(req.key());
restCacheReq.value(req.value());
restCacheReq.value2(req.value2());
Map vals = req.values();
if (vals != null)
restCacheReq.values(new HashMap<Object, Object>(vals));
restCacheReq.command(cacheCmdMap.get(req.operation()));
restReq = restCacheReq;
} else if (msg instanceof GridClientTaskRequest) {
GridClientTaskRequest req = (GridClientTaskRequest) msg;
GridRestTaskRequest restTaskReq = new GridRestTaskRequest();
restTaskReq.command(EXE);
restTaskReq.taskName(req.taskName());
restTaskReq.params(Arrays.asList(req.argument()));
restReq = restTaskReq;
} else if (msg instanceof GridClientTopologyRequest) {
GridClientTopologyRequest req = (GridClientTopologyRequest) msg;
GridRestTopologyRequest restTopReq = new GridRestTopologyRequest();
restTopReq.includeMetrics(req.includeMetrics());
restTopReq.includeAttributes(req.includeAttributes());
if (req.nodeId() != null) {
restTopReq.command(NODE);
restTopReq.nodeId(req.nodeId());
} else if (req.nodeIp() != null) {
restTopReq.command(NODE);
restTopReq.nodeIp(req.nodeIp());
} else
restTopReq.command(TOPOLOGY);
restReq = restTopReq;
} else if (msg instanceof GridClientStateRequest) {
GridClientStateRequest req = (GridClientStateRequest) msg;
GridRestChangeStateRequest restChangeReq = new GridRestChangeStateRequest();
if (req.isReqCurrentState()) {
restChangeReq.reqCurrentState();
restChangeReq.command(CLUSTER_CURRENT_STATE);
} else {
restChangeReq.active(req.active());
restChangeReq.command(req.active() ? CLUSTER_ACTIVATE : CLUSTER_DEACTIVATE);
}
restReq = restChangeReq;
} else if (msg instanceof GridClientClusterStateRequest) {
GridClientClusterStateRequest req = (GridClientClusterStateRequest) msg;
boolean forceDeactivation = !(msg instanceof GridClientClusterStateRequestV2) || ((GridClientClusterStateRequestV2) msg).forceDeactivation();
GridRestClusterStateRequest restChangeReq = new GridRestClusterStateRequest();
if (req.isReqCurrentState()) {
restChangeReq.reqCurrentMode();
restChangeReq.command(CLUSTER_STATE);
} else {
restChangeReq.state(req.state());
restChangeReq.command(CLUSTER_SET_STATE);
restChangeReq.forceDeactivation(forceDeactivation);
}
restReq = restChangeReq;
} else if (msg instanceof GridClientClusterNameRequest)
restReq = new GridRestClusterNameRequest();
else if (msg instanceof GridClientNodeStateBeforeStartRequest) {
GridClientNodeStateBeforeStartRequest reqClient = (GridClientNodeStateBeforeStartRequest) msg;
if (reqClient instanceof GridClientWarmUpRequest) {
GridClientWarmUpRequest warmUpReqClient = (GridClientWarmUpRequest) reqClient;
restReq = new GridRestWarmUpRequest().stopWarmUp(warmUpReqClient.stopWarmUp());
restReq.command(WARM_UP);
} else {
restReq = new GridRestNodeStateBeforeStartRequest();
restReq.command(NODE_STATE_BEFORE_START);
}
}
if (restReq != null) {
restReq.destinationId(msg.destinationId());
restReq.clientId(msg.clientId());
restReq.sessionToken(msg.sessionToken());
restReq.address(ses.remoteAddress());
restReq.certificates(ses.certificates());
restReq.credentials(ses.meta(CREDS_KEY));
restReq.userAttributes(ses.meta(USER_ATTR_KEY));
}
return restReq;
}
use of org.apache.ignite.internal.processors.rest.request.GridRestNodeStateBeforeStartRequest in project ignite by apache.
the class GridRestProcessor method handleRequest.
/**
* @param req Request.
* @return Future.
*/
private IgniteInternalFuture<GridRestResponse> handleRequest(final GridRestRequest req) {
if (req instanceof GridRestNodeStateBeforeStartRequest) {
if (startLatch.getCount() == 0)
return new GridFinishedFuture<>(new IgniteCheckedException("Node has already started."));
} else if (!(req instanceof GridRestAuthenticationRequest) && startLatch.getCount() > 0) {
try {
startLatch.await();
} catch (InterruptedException e) {
return new GridFinishedFuture<>(new IgniteCheckedException("Failed to handle request " + "(protocol handler was interrupted when awaiting grid start).", e));
}
}
if (log.isDebugEnabled())
log.debug("Received request from client: " + req);
if (securityEnabled) {
Session ses;
try {
ses = session(req);
} catch (IgniteAuthenticationException e) {
return new GridFinishedFuture<>(new GridRestResponse(STATUS_AUTH_FAILED, e.getMessage()));
} catch (IgniteCheckedException e) {
return new GridFinishedFuture<>(new GridRestResponse(STATUS_FAILED, e.getMessage()));
}
assert ses != null;
req.clientId(ses.clientId);
req.sessionToken(U.uuidToBytes(ses.sesId));
if (log.isDebugEnabled())
log.debug("Next clientId and sessionToken were extracted according to request: " + "[clientId=" + req.clientId() + ", sesTok=" + Arrays.toString(req.sessionToken()) + "]");
SecurityContext secCtx0 = ses.secCtx;
try {
if (secCtx0 == null || ses.isTokenExpired(sesTokTtl))
ses.secCtx = secCtx0 = authenticate(req, ses);
try (OperationSecurityContext s = ctx.security().withContext(secCtx0)) {
authorize(req);
return handleRequest0(req);
}
} catch (SecurityException e) {
assert secCtx0 != null;
return new GridFinishedFuture<>(new GridRestResponse(STATUS_SECURITY_CHECK_FAILED, e.getMessage()));
} catch (IgniteCheckedException e) {
return new GridFinishedFuture<>(new GridRestResponse(STATUS_AUTH_FAILED, e.getMessage()));
}
} else
return handleRequest0(req);
}
Aggregations