blob: b6ff5b18757e263c823c84f65fd2899f5db66d5b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.processors.service;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.cluster.ClusterGroup;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.lang.IgniteCallable;
import org.apache.ignite.resources.IgniteInstanceResource;
import org.apache.ignite.resources.LoggerResource;
import org.apache.ignite.services.Service;
import org.apache.ignite.services.ServiceContext;
import org.apache.ignite.services.ServiceDescriptor;
import org.apache.ignite.testframework.GridTestUtils;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
/**
* Test that compute and service run only on server nodes by default.
*/
public class ClosureServiceClientsNodesTest extends GridCommonAbstractTest {
/** Number of grids started for tests. */
private static final int NODES_CNT = 4;
/** */
private static final int CLIENT_IDX = 1;
/** Test singleton service name. */
private static final String SINGLETON_NAME = "testSingleton";
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
cfg.setMarshaller(new BinaryMarshaller());
cfg.setCacheConfiguration();
if (igniteInstanceName.equals(getTestIgniteInstanceName(CLIENT_IDX)))
cfg.setClientMode(true);
return cfg;
}
/** {@inheritDoc} */
@Override protected void beforeTestsStarted() throws Exception {
startGrids(NODES_CNT);
}
/**
* @throws Exception If failed.
*/
@Test
public void testDefaultClosure() throws Exception {
Set<String> srvNames = new HashSet<>(NODES_CNT - 1);
for (int i = 0; i < NODES_CNT; ++i) {
if (i != CLIENT_IDX)
srvNames.add(getTestIgniteInstanceName(i));
}
for (int i = 0; i < NODES_CNT; i++) {
log.info("Iteration: " + i);
Ignite ignite = grid(i);
Collection<String> res = ignite.compute().broadcast(new IgniteCallable<String>() {
@IgniteInstanceResource
Ignite ignite;
@Override public String call() throws Exception {
assertFalse(ignite.configuration().isClientMode());
return ignite.name();
}
});
assertEquals(res.size(), NODES_CNT - 1);
for (String name : res)
assertTrue(srvNames.contains(name));
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testClientClosure() throws Exception {
for (int i = 0; i < NODES_CNT; i++) {
log.info("Iteration: " + i);
Ignite ignite = grid(i);
Collection<String> res = ignite.compute(ignite.cluster().forClients()).
broadcast(new IgniteCallable<String>() {
@IgniteInstanceResource
Ignite ignite;
@Override public String call() throws Exception {
assertTrue(ignite.configuration().isClientMode());
return ignite.name();
}
});
assertEquals(1, res.size());
assertEquals(getTestIgniteInstanceName(CLIENT_IDX), F.first(res));
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testCustomClosure() throws Exception {
for (int i = 0; i < NODES_CNT; i++) {
log.info("Iteration: " + i);
Ignite ignite = grid(i);
Collection<String> res = ignite.compute(ignite.cluster().forPredicate(F.<ClusterNode>alwaysTrue())).
broadcast(new IgniteCallable<String>() {
@IgniteInstanceResource
Ignite ignite;
@Override public String call() throws Exception {
return ignite.name();
}
});
assertEquals(NODES_CNT, res.size());
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testDefaultService() throws Exception {
UUID clientNodeId = grid(CLIENT_IDX).cluster().localNode().id();
for (int i = 0; i < NODES_CNT; i++) {
log.info("Iteration: " + i);
final Ignite ignite = grid(i);
ignite.services().deployNodeSingleton(SINGLETON_NAME, new TestService());
final ClusterGroup grp = ignite.cluster();
assertEquals(NODES_CNT, grp.nodes().size());
GridTestUtils.waitForCondition(new GridAbsPredicate() {
@Override public boolean apply() {
return ignite.services(grp).serviceDescriptors().size() == 1;
}
}, 5000);
Collection<ServiceDescriptor> srvDscs = ignite.services(grp).serviceDescriptors();
assertEquals(1, srvDscs.size());
Map<UUID, Integer> nodesMap = F.first(srvDscs).topologySnapshot();
assertEquals(NODES_CNT - 1, nodesMap.size());
for (Map.Entry<UUID, Integer> nodeInfo : nodesMap.entrySet()) {
assertFalse(clientNodeId.equals(nodeInfo.getKey()));
assertEquals(1, nodeInfo.getValue().intValue());
}
ignite.services().cancelAll();
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testClientService() throws Exception {
UUID clientNodeId = grid(CLIENT_IDX).cluster().localNode().id();
for (int i = 0; i < NODES_CNT; i++) {
log.info("Iteration: " + i);
final Ignite ignite = grid(i);
ignite.services(ignite.cluster().forClients()).deployNodeSingleton(SINGLETON_NAME, new TestService());
final ClusterGroup grp = ignite.cluster();
assertEquals(NODES_CNT, grp.nodes().size());
GridTestUtils.waitForCondition(new GridAbsPredicate() {
@Override public boolean apply() {
return ignite.services(grp).serviceDescriptors().size() == 1;
}
}, 5000);
Collection<ServiceDescriptor> srvDscs = ignite.services(grp).serviceDescriptors();
assertEquals(1, srvDscs.size());
Map<UUID, Integer> nodesMap = F.first(srvDscs).topologySnapshot();
assertEquals(1, nodesMap.size());
for (Map.Entry<UUID, Integer> nodeInfo : nodesMap.entrySet()) {
assertEquals(clientNodeId, nodeInfo.getKey());
assertEquals(1, nodeInfo.getValue().intValue());
}
ignite.services().cancelAll();
}
}
/**
* Test service.
*/
private static class TestService implements Service {
/** */
@LoggerResource
private IgniteLogger log;
/** {@inheritDoc} */
@Override public void cancel(ServiceContext ctx) {
//No-op.
}
/** {@inheritDoc} */
@Override public void init(ServiceContext ctx) throws Exception {
//No-op.
}
/** {@inheritDoc} */
@Override public void execute(ServiceContext ctx) throws Exception {
log.info("Executing test service.");
}
}
}