blob: f9658fac3b0a541f3564af70ddfe3a918bad376d [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.ambari.server.state;
import java.util.HashMap;
import java.util.Map;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.PersistService;
import junit.framework.Assert;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.ServiceResponse;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class ServiceTest {
private Clusters clusters;
private Cluster cluster;
private String clusterName;
private Injector injector;
private ServiceFactory serviceFactory;
private ServiceComponentFactory serviceComponentFactory;
private AmbariMetaInfo metaInfo;
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
clusters = injector.getInstance(Clusters.class);
serviceFactory = injector.getInstance(ServiceFactory.class);
serviceComponentFactory = injector.getInstance(
ServiceComponentFactory.class);
metaInfo = injector.getInstance(AmbariMetaInfo.class);
metaInfo.init();
clusterName = "foo";
clusters.addCluster(clusterName);
cluster = clusters.getCluster(clusterName);
cluster.setDesiredStackVersion(new StackId("HDP-0.1"));
Assert.assertNotNull(cluster);
}
@After
public void teardown() throws AmbariException {
injector.getInstance(PersistService.class).stop();
}
@Test
public void testCreateService() throws AmbariException {
String serviceName = "HDFS";
Service s = serviceFactory.createNew(cluster, serviceName);
cluster.addService(s);
s.persist();
Service service = cluster.getService(serviceName);
Assert.assertNotNull(service);
Assert.assertEquals(serviceName, service.getName());
Assert.assertEquals(cluster.getClusterId(),
service.getCluster().getClusterId());
Assert.assertEquals(cluster.getClusterName(),
service.getCluster().getClusterName());
Assert.assertEquals(State.INIT, service.getDesiredState());
Assert.assertFalse(
service.getDesiredStackVersion().getStackId().isEmpty());
}
@Test
public void testGetAndSetServiceInfo() throws AmbariException {
String serviceName = "HDFS";
Service s = serviceFactory.createNew(cluster, serviceName);
cluster.addService(s);
s.persist();
Service service = cluster.getService(serviceName);
Assert.assertNotNull(service);
service.setDesiredStackVersion(new StackId("HDP-1.1.0"));
Assert.assertEquals("HDP-1.1.0",
service.getDesiredStackVersion().getStackId());
service.setDesiredState(State.INSTALLING);
Assert.assertEquals(State.INSTALLING, service.getDesiredState());
// FIXME todo use DAO to verify persisted object maps to inmemory state
}
@Test
public void testAddAndGetServiceComponents() throws AmbariException {
String serviceName = "HDFS";
Service s = serviceFactory.createNew(cluster, serviceName);
cluster.addService(s);
s.persist();
Service service = cluster.getService(serviceName);
Assert.assertNotNull(service);
Assert.assertTrue(s.getServiceComponents().isEmpty());
ServiceComponent sc1 =
serviceComponentFactory.createNew(s, "NAMENODE");
ServiceComponent sc2 =
serviceComponentFactory.createNew(s, "DATANODE1");
ServiceComponent sc3 =
serviceComponentFactory.createNew(s, "DATANODE2");
Map<String, ServiceComponent> comps = new
HashMap<String, ServiceComponent>();
comps.put(sc1.getName(), sc1);
comps.put(sc2.getName(), sc2);
s.addServiceComponents(comps);
Assert.assertEquals(2, s.getServiceComponents().size());
Assert.assertNotNull(s.getServiceComponent(sc1.getName()));
Assert.assertNotNull(s.getServiceComponent(sc2.getName()));
try {
s.getServiceComponent(sc3.getName());
fail("Expected error when looking for invalid component");
} catch (Exception e) {
// Expected
}
s.addServiceComponent(sc3);
sc1.persist();
sc2.persist();
sc3.persist();
ServiceComponent sc4 = s.addServiceComponent("HDFS_CLIENT");
Assert.assertNotNull(s.getServiceComponent(sc4.getName()));
Assert.assertEquals(State.INIT,
s.getServiceComponent("HDFS_CLIENT").getDesiredState());
Assert.assertTrue(sc4.isClientComponent());
sc4.persist();
Assert.assertEquals(4, s.getServiceComponents().size());
Assert.assertNotNull(s.getServiceComponent(sc3.getName()));
Assert.assertEquals(sc3.getName(),
s.getServiceComponent(sc3.getName()).getName());
Assert.assertEquals(s.getName(),
s.getServiceComponent(sc3.getName()).getServiceName());
Assert.assertEquals(cluster.getClusterName(),
s.getServiceComponent(sc3.getName()).getClusterName());
sc4.setDesiredState(State.INSTALLING);
Assert.assertEquals(State.INSTALLING,
s.getServiceComponent("HDFS_CLIENT").getDesiredState());
}
@Test
public void testGetAndSetConfigs() {
// FIXME add unit tests for configs once impl done
/*
public Map<String, Config> getDesiredConfigs();
public void updateDesiredConfigs(Map<String, Config> configs);
*/
}
@Test
public void testConvertToResponse() throws AmbariException {
String serviceName = "HDFS";
Service s = serviceFactory.createNew(cluster, serviceName);
cluster.addService(s);
Service service = cluster.getService(serviceName);
Assert.assertNotNull(service);
ServiceResponse r = s.convertToResponse();
Assert.assertEquals(s.getName(), r.getServiceName());
Assert.assertEquals(s.getCluster().getClusterName(),
r.getClusterName());
Assert.assertEquals(s.getDesiredStackVersion().getStackId(),
r.getDesiredStackVersion());
Assert.assertEquals(s.getDesiredState().toString(),
r.getDesiredState());
service.setDesiredStackVersion(new StackId("HDP-1.1.0"));
service.setDesiredState(State.INSTALLING);
r = s.convertToResponse();
Assert.assertEquals(s.getName(), r.getServiceName());
Assert.assertEquals(s.getCluster().getClusterName(),
r.getClusterName());
Assert.assertEquals(s.getDesiredStackVersion().getStackId(),
r.getDesiredStackVersion());
Assert.assertEquals(s.getDesiredState().toString(),
r.getDesiredState());
// FIXME add checks for configs
StringBuilder sb = new StringBuilder();
s.debugDump(sb);
// TODO better checks?
Assert.assertFalse(sb.toString().isEmpty());
}
@Test
public void testDeleteServiceComponent() throws Exception {
Service hdfs = cluster.addService("HDFS");
Service mapReduce = cluster.addService("MAPREDUCE");
hdfs.persist();
ServiceComponent nameNode = hdfs.addServiceComponent("NAMENODE");
nameNode.persist();
ServiceComponent jobTracker = mapReduce.addServiceComponent("JOBTRACKER");
assertEquals(2, cluster.getServices().size());
assertEquals(1, hdfs.getServiceComponents().size());
assertEquals(1, mapReduce.getServiceComponents().size());
assertTrue(hdfs.isPersisted());
assertFalse(mapReduce.isPersisted());
hdfs.deleteServiceComponent("NAMENODE");
assertEquals(0, hdfs.getServiceComponents().size());
assertEquals(1, mapReduce.getServiceComponents().size());
mapReduce.deleteServiceComponent("JOBTRACKER");
assertEquals(0, hdfs.getServiceComponents().size());
assertEquals(0, mapReduce.getServiceComponents().size());
}
@Test
public void testCanBeRemoved() throws Exception{
Service service = cluster.addService("HDFS");
for (State state : State.values()) {
service.setDesiredState(state);
if (state.isRemovableState()) {
org.junit.Assert.assertTrue(service.canBeRemoved());
}
else {
org.junit.Assert.assertFalse(service.canBeRemoved());
}
}
ServiceComponent component = service.addServiceComponent("NAMENODE");
// can't remove a STARTED component
component.setDesiredState(State.STARTED);
for (State state : State.values()) {
service.setDesiredState(state);
// should always be false if the sub component can not be removed
org.junit.Assert.assertFalse(service.canBeRemoved());
}
}
}