/**
* 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.controller.internal;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.EntityManager;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.checks.AbstractCheckDescriptor;
import org.apache.ambari.server.checks.UpgradeCheckRegistry;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
import org.apache.ambari.server.stack.StackManagerFactory;
import org.apache.ambari.server.state.CheckHelper;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceFactory;
import org.apache.ambari.server.state.ServiceInfo;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.UpgradeHelper;
import org.apache.ambari.server.state.stack.OsFamily;
import org.apache.ambari.server.state.stack.PrereqCheckStatus;
import org.apache.ambari.server.state.stack.PrereqCheckType;
import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
import org.apache.ambari.server.state.stack.upgrade.Direction;
import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
import org.junit.Assert;
import org.junit.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provider;
/**
* PreUpgradeCheckResourceProvider tests.
*/
public class PreUpgradeCheckResourceProviderTest {
@Test
public void testGetResources() throws Exception{
Injector injector = createInjector();
AmbariManagementController managementController = injector.getInstance(AmbariManagementController.class);
Clusters clusters = injector.getInstance(Clusters.class);
UpgradeHelper upgradeHelper = injector.getInstance(UpgradeHelper.class);
RepositoryVersionDAO repoDao = injector.getInstance(RepositoryVersionDAO.class);
RepositoryVersionEntity repo = createNiceMock(RepositoryVersionEntity.class);
UpgradePack upgradePack = createNiceMock(UpgradePack.class);
PrerequisiteCheckConfig config = createNiceMock(PrerequisiteCheckConfig.class);
Cluster cluster = createNiceMock(Cluster.class);
Service service = createNiceMock(Service.class);
ServiceInfo serviceInfo = createNiceMock(ServiceInfo.class);
StackId currentStackId = createNiceMock(StackId.class);
StackId targetStackId = createNiceMock(StackId.class);
ServiceFactory serviceFactory = createNiceMock(ServiceFactory.class);
AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
Map<String, Service> allServiceMap = new HashMap<>();
allServiceMap.put("Service100", service);
Map<String, ServiceInfo> allServiceInfoMap = new HashMap<>();
allServiceInfoMap.put("Service100", serviceInfo);
// set expectations
expect(managementController.getClusters()).andReturn(clusters).anyTimes();
expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
expect(cluster.getServices()).andReturn(allServiceMap).anyTimes();
expect(cluster.getService("Service100")).andReturn(service).anyTimes();
expect(cluster.getCurrentStackVersion()).andReturn(currentStackId).anyTimes();
expect(currentStackId.getStackName()).andReturn("Stack100").anyTimes();
expect(currentStackId.getStackVersion()).andReturn("1.0").anyTimes();
expect(targetStackId.getStackName()).andReturn("Stack100").anyTimes();
expect(targetStackId.getStackVersion()).andReturn("1.1").anyTimes();
expect(repoDao.findByStackNameAndVersion("Stack100", "Repo100")).andReturn(repo).anyTimes();
expect(repo.getStackId()).andReturn(targetStackId).atLeastOnce();
expect(upgradeHelper.suggestUpgradePack("Cluster100", "1.0", "Repo100", Direction.UPGRADE, UpgradeType.NON_ROLLING, "upgrade_pack11")).andReturn(upgradePack);
List<AbstractCheckDescriptor> upgradeChecksToRun = new LinkedList<>();
List<String> prerequisiteChecks = new LinkedList<>();
prerequisiteChecks.add("org.apache.ambari.server.sample.checks.SampleServiceCheck");
expect(upgradePack.getPrerequisiteCheckConfig()).andReturn(config);
expect(upgradePack.getPrerequisiteChecks()).andReturn(prerequisiteChecks).anyTimes();
expect(upgradePack.getTarget()).andReturn("1.1.*.*").anyTimes();
expect(ambariMetaInfo.getServices("Stack100", "1.0")).andReturn(allServiceInfoMap).anyTimes();
String checks = ClassLoader.getSystemClassLoader().getResource("checks").getPath();
expect(serviceInfo.getChecksFolder()).andReturn(new File(checks));
// replay
replay(managementController, clusters, cluster, service, serviceInfo, repoDao, repo, upgradeHelper,
ambariMetaInfo, upgradePack, config, currentStackId, targetStackId, serviceFactory);
ResourceProvider provider = getPreUpgradeCheckResourceProvider(managementController, injector);
// create the request
Request request = PropertyHelper.getReadRequest(new HashSet<String>());
PredicateBuilder builder = new PredicateBuilder();
Predicate predicate = builder.property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and()
.property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID).equals("upgrade_pack11").and()
.property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(UpgradeType.NON_ROLLING).and()
.property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID).equals("Repo100").toPredicate();
System.out.println("PreUpgradeCheckResourceProvider - " + provider);
Set<Resource> resources = Collections.emptySet();
try {
resources = provider.getResources(request, predicate);
}
catch (Exception e) {
e.printStackTrace();
}
Assert.assertEquals(1, resources.size());
for (Resource resource : resources) {
String id = (String) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_ID_PROPERTY_ID);
Assert.assertEquals("SAMPLE_SERVICE_CHECK", id);
String description = (String) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CHECK_PROPERTY_ID);
Assert.assertEquals("Sample service check description.", description);
PrereqCheckStatus status = (PrereqCheckStatus) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_STATUS_PROPERTY_ID);
Assert.assertEquals(PrereqCheckStatus.FAIL, status);
String reason = (String) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_REASON_PROPERTY_ID);
Assert.assertEquals("Sample service check always fails.", reason);
PrereqCheckType checkType = (PrereqCheckType) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID);
Assert.assertEquals(PrereqCheckType.HOST, checkType);
String clusterName = (String) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID);
Assert.assertEquals("Cluster100", clusterName);
UpgradeType upgradeType = (UpgradeType) resource.getPropertyValue(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID);
Assert.assertEquals(UpgradeType.NON_ROLLING, upgradeType);
}
// verify
verify(managementController, clusters, cluster, service, serviceInfo, repoDao, repo, upgradeHelper,
ambariMetaInfo, upgradePack, config, currentStackId, targetStackId, serviceFactory);
}
/**
* This factory method creates PreUpgradeCheckResourceProvider using the mock managementController
*/
public PreUpgradeCheckResourceProvider getPreUpgradeCheckResourceProvider(AmbariManagementController managementController, Injector injector) throws AmbariException {
//UpgradeHelper upgradeHelper = injector.getInstance(UpgradeHelper.class);
//injector.injectMembers(upgradeHelper);
PreUpgradeCheckResourceProvider provider = new PreUpgradeCheckResourceProvider(managementController);
return provider;
}
static class TestClustersProvider implements Provider<Clusters> {
private static Clusters clusters = createNiceMock(Clusters.class);
@Override
public Clusters get() {
return clusters;
}
}
static class TestUpgradeHelperProvider implements Provider<UpgradeHelper> {
private static UpgradeHelper upgradeHelper = createNiceMock(UpgradeHelper.class);
@Override
public UpgradeHelper get() {
return upgradeHelper;
}
}
private Injector createInjector() throws Exception {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
Provider<Clusters> clustersProvider = new TestClustersProvider();
Provider<UpgradeHelper> upgradeHelperProvider = new TestUpgradeHelperProvider();
CheckHelper checkHelper = new CheckHelper();
UpgradeCheckRegistry registry = new UpgradeCheckRegistry();
bind(AmbariManagementController.class).toInstance(createNiceMock(AmbariManagementController.class));
bind(CheckHelper.class).toInstance(checkHelper);
bind(Clusters.class).toProvider(TestClustersProvider.class);
bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
bind(RepositoryVersionDAO.class).toInstance(createNiceMock(RepositoryVersionDAO.class));
bind(StackManagerFactory.class).toInstance(createNiceMock(StackManagerFactory.class));
bind(UpgradeCheckRegistry.class).toInstance(registry);
bind(UpgradeHelper.class).toProvider(TestUpgradeHelperProvider.class);
requestStaticInjection(PreUpgradeCheckResourceProvider.class);
}
});
}
}