/**
* 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.anyString;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.stack.QuickLinksConfigurationModule;
import org.apache.ambari.server.state.QuickLinksConfigurationInfo;
import org.apache.ambari.server.state.ServiceInfo;
import org.apache.ambari.server.state.StackInfo;
import org.apache.ambari.server.state.quicklinks.Link;
import org.apache.ambari.server.state.quicklinks.QuickLinks;
import org.apache.ambari.server.state.quicklinksprofile.QuickLinkVisibilityController;
import org.apache.ambari.server.state.quicklinksprofile.QuickLinkVisibilityControllerFactory;
import org.easymock.IAnswer;
import org.junit.Before;
import org.junit.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.common.io.Resources;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
public class QuickLinkArtifactResourceProviderTest {
private Injector injector;
String quicklinkProfile;
@Before
public void before() {
injector = Guice.createInjector(new MockModule());
}
private QuickLinkArtifactResourceProvider createProvider() {
return new QuickLinkArtifactResourceProvider(injector.getInstance(AmbariManagementController.class));
}
/**
* Test to prove the returned links' visibility reflect the actual profile
*/
@Test
public void getResourcesRespectsVisibility() throws Exception {
quicklinkProfile = Resources.toString(Resources.getResource("example_quicklinks_profile.json"), Charsets.UTF_8);
QuickLinkArtifactResourceProvider provider = createProvider();
Predicate predicate = new PredicateBuilder().property(
QuickLinkArtifactResourceProvider.STACK_NAME_PROPERTY_ID).equals("HDP").
and().
property(QuickLinkArtifactResourceProvider.STACK_VERSION_PROPERTY_ID).equals("2.0.6").
and().
property(QuickLinkArtifactResourceProvider.STACK_SERVICE_NAME_PROPERTY_ID).equals("YARN").
toPredicate();
Set<Resource> resources =
provider.getResources(PropertyHelper.getReadRequest(Sets.<String>newHashSet()), predicate);
Map<String, Link> linkMap = getLinks(resources);
for (Map.Entry<String, Link> entry: linkMap.entrySet()) {
assertTrue("Only resourcemanager_ui should be visible.",
entry.getValue().isVisible() == entry.getKey().equals("resourcemanager_ui"));
}
}
/**
* Test to prove the all links are visible if no profile is set
*/
@Test
public void whenNoProfileIsSetAllLinksAreVisible() throws Exception {
quicklinkProfile = null;
QuickLinkArtifactResourceProvider provider = createProvider();
Predicate predicate = new PredicateBuilder().property(
QuickLinkArtifactResourceProvider.STACK_NAME_PROPERTY_ID).equals("HDP").
and().
property(QuickLinkArtifactResourceProvider.STACK_VERSION_PROPERTY_ID).equals("2.0.6").
and().
property(QuickLinkArtifactResourceProvider.STACK_SERVICE_NAME_PROPERTY_ID).equals("YARN").
toPredicate();
Set<Resource> resources =
provider.getResources(PropertyHelper.getReadRequest(Sets.<String>newHashSet()), predicate);
Map<String, Link> linkMap = getLinks(resources);
for (Link link: linkMap.values()) {
assertTrue("All links should be visible.", link.isVisible());
}
}
/**
* Test to prove the all links are visible if invalid profile is set
*/
@Test
public void whenInvalidProfileIsSetAllLinksAreVisible() throws Exception {
quicklinkProfile = "{}";
QuickLinkArtifactResourceProvider provider = createProvider();
Predicate predicate = new PredicateBuilder().property(
QuickLinkArtifactResourceProvider.STACK_NAME_PROPERTY_ID).equals("HDP").
and().
property(QuickLinkArtifactResourceProvider.STACK_VERSION_PROPERTY_ID).equals("2.0.6").
and().
property(QuickLinkArtifactResourceProvider.STACK_SERVICE_NAME_PROPERTY_ID).equals("YARN").
toPredicate();
Set<Resource> resources =
provider.getResources(PropertyHelper.getReadRequest(Sets.<String>newHashSet()), predicate);
Map<String, Link> linkMap = getLinks(resources);
for (Link link: linkMap.values()) {
assertTrue("All links should be visible.", link.isVisible());
}
}
private Map<String, Link> getLinks(Set<Resource> resources) {
QuickLinks quickLinks = (QuickLinks)
resources.iterator().next().getPropertiesMap().get("QuickLinkInfo/quicklink_data").values().iterator().next();
Map<String, Link> linksMap = new HashMap<>();
for (Link link: quickLinks.getQuickLinksConfiguration().getLinks()) {
linksMap.put(link.getName(), link);
}
return linksMap;
}
private class MockModule implements Module {
@Override
public void configure(Binder binder) {
AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
StackInfo stack = createMock(StackInfo.class);
ServiceInfo service = createMock(ServiceInfo.class);
QuickLinksConfigurationInfo qlConfigInfo = new QuickLinksConfigurationInfo();
qlConfigInfo.setDeleted(false);
qlConfigInfo.setFileName("parent_quicklinks.json");
qlConfigInfo.setIsDefault(true);
File qlFile = new File(Resources.getResource("parent_quicklinks.json").getFile()) ;
QuickLinksConfigurationModule module = new QuickLinksConfigurationModule(qlFile, qlConfigInfo);
module.getModuleInfo();
AmbariManagementController amc = createMock(AmbariManagementController.class);
expect(amc.getAmbariMetaInfo()).andReturn(metaInfo).anyTimes();
expect(amc.getQuicklinkVisibilityController()).andAnswer(
new IAnswer<QuickLinkVisibilityController>() {
@Override
public QuickLinkVisibilityController answer() throws Throwable {
return QuickLinkVisibilityControllerFactory.get(quicklinkProfile);
}
}
).anyTimes();
try {
expect(metaInfo.getStack(anyString(), anyString())).andReturn(stack).anyTimes();
}
catch (AmbariException ex) {
throw new RuntimeException(ex);
}
expect(stack.getServices()).andReturn(ImmutableList.of(service)).anyTimes();
expect(stack.getService("YARN")).andReturn(service).anyTimes();
expect(service.getQuickLinksConfigurationsMap()).andReturn(ImmutableMap.of("YARN", qlConfigInfo));
expect(service.getName()).andReturn("YARN").anyTimes();
binder.bind(AmbariManagementController.class).toInstance(amc);
replay(amc, metaInfo, stack, service);
}
}
}