|
@@ -0,0 +1,319 @@
|
|
|
|
+/**
|
|
|
|
+ * 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 com.google.common.base.Optional;
|
|
|
|
+import com.google.inject.AbstractModule;
|
|
|
|
+import com.google.inject.Guice;
|
|
|
|
+import com.google.inject.Injector;
|
|
|
|
+import org.apache.ambari.server.AmbariException;
|
|
|
|
+import org.apache.ambari.server.actionmanager.ActionDBAccessor;
|
|
|
|
+import org.apache.ambari.server.actionmanager.ActionManager;
|
|
|
|
+import org.apache.ambari.server.actionmanager.StageFactory;
|
|
|
|
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
|
|
|
|
+import org.apache.ambari.server.controller.AbstractRootServiceResponseFactory;
|
|
|
|
+import org.apache.ambari.server.controller.AmbariManagementController;
|
|
|
|
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
|
|
|
|
+import org.apache.ambari.server.controller.KerberosHelper;
|
|
|
|
+import org.apache.ambari.server.controller.predicate.EqualsPredicate;
|
|
|
|
+import org.apache.ambari.server.controller.spi.Predicate;
|
|
|
|
+import org.apache.ambari.server.controller.spi.Resource;
|
|
|
|
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
|
|
|
|
+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.UserDAO;
|
|
|
|
+import org.apache.ambari.server.orm.dao.ViewURLDAO;
|
|
|
|
+import org.apache.ambari.server.orm.dao.WidgetLayoutDAO;
|
|
|
|
+import org.apache.ambari.server.orm.entities.ViewEntity;
|
|
|
|
+import org.apache.ambari.server.orm.entities.ViewInstanceDataEntity;
|
|
|
|
+import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
|
|
|
|
+import org.apache.ambari.server.orm.entities.ViewURLEntity;
|
|
|
|
+import org.apache.ambari.server.scheduler.ExecutionScheduler;
|
|
|
|
+import org.apache.ambari.server.security.TestAuthenticationFactory;
|
|
|
|
+import org.apache.ambari.server.security.authorization.AuthorizationException;
|
|
|
|
+import org.apache.ambari.server.security.authorization.Users;
|
|
|
|
+import org.apache.ambari.server.security.encryption.CredentialStoreService;
|
|
|
|
+import org.apache.ambari.server.security.encryption.CredentialStoreServiceImpl;
|
|
|
|
+import org.apache.ambari.server.stack.StackManagerFactory;
|
|
|
|
+import org.apache.ambari.server.stageplanner.RoleGraphFactory;
|
|
|
|
+import org.apache.ambari.server.stageplanner.RoleGraphFactoryImpl;
|
|
|
|
+import org.apache.ambari.server.state.Clusters;
|
|
|
|
+import org.apache.ambari.server.state.ConfigFactory;
|
|
|
|
+import org.apache.ambari.server.state.ServiceComponentFactory;
|
|
|
|
+import org.apache.ambari.server.state.ServiceComponentHostFactory;
|
|
|
|
+import org.apache.ambari.server.state.ServiceFactory;
|
|
|
|
+import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
|
|
|
|
+import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
|
|
|
|
+import org.apache.ambari.server.state.stack.OsFamily;
|
|
|
|
+import org.apache.ambari.server.view.ViewRegistry;
|
|
|
|
+import org.apache.ambari.server.view.configuration.ViewConfig;
|
|
|
|
+import org.apache.ambari.view.ViewDefinition;
|
|
|
|
+import org.easymock.Capture;
|
|
|
|
+import org.junit.After;
|
|
|
|
+import org.junit.Assert;
|
|
|
|
+import org.junit.Before;
|
|
|
|
+import org.junit.Test;
|
|
|
|
+import org.springframework.security.core.Authentication;
|
|
|
|
+import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
|
+
|
|
|
|
+import javax.persistence.EntityManager;
|
|
|
|
+import java.lang.reflect.Field;
|
|
|
|
+import java.lang.reflect.Modifier;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+
|
|
|
|
+import static org.easymock.EasyMock.*;
|
|
|
|
+import static org.junit.Assert.*;
|
|
|
|
+
|
|
|
|
+public class ViewURLResourceProviderTest {
|
|
|
|
+
|
|
|
|
+ private static final ViewRegistry viewregistry = createMock(ViewRegistry.class);
|
|
|
|
+
|
|
|
|
+ static {
|
|
|
|
+ ViewRegistry.initInstance(viewregistry);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Before
|
|
|
|
+ public void before() throws Exception {
|
|
|
|
+ reset(viewregistry);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @After
|
|
|
|
+ public void clearAuthentication() {
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testToResource() throws Exception {
|
|
|
|
+ ViewURLResourceProvider provider = new ViewURLResourceProvider();
|
|
|
|
+ Set<String> propertyIds = new HashSet<String>();
|
|
|
|
+ propertyIds.add(ViewURLResourceProvider.URL_NAME_PROPERTY_ID);
|
|
|
|
+ propertyIds.add(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID);
|
|
|
|
+ ViewURLEntity viewURLEntity = createNiceMock(ViewURLEntity.class);
|
|
|
|
+
|
|
|
|
+ ViewEntity viewEntity = createNiceMock(ViewEntity.class);
|
|
|
|
+ ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
|
|
|
|
+ expect(viewURLEntity.getUrlName()).andReturn("test").once();
|
|
|
|
+ expect(viewURLEntity.getUrlSuffix()).andReturn("url").once();
|
|
|
|
+ expect(viewURLEntity.getViewInstanceEntity()).andReturn(viewInstanceEntity).once();
|
|
|
|
+ expect(viewInstanceEntity.getViewEntity()).andReturn(viewEntity).once();
|
|
|
|
+ expect(viewEntity.getCommonName()).andReturn("FILES").once();
|
|
|
|
+ expect(viewEntity.getVersion()).andReturn("1.0.0").once();
|
|
|
|
+ expect(viewInstanceEntity.getName()).andReturn("test").once();
|
|
|
|
+
|
|
|
|
+ replay(viewURLEntity, viewEntity, viewInstanceEntity);
|
|
|
|
+
|
|
|
|
+ Resource resource = provider.toResource(viewURLEntity);
|
|
|
|
+ assertEquals(resource.getPropertyValue(ViewURLResourceProvider.URL_NAME_PROPERTY_ID),"test");
|
|
|
|
+ assertEquals(resource.getPropertyValue(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID),"url");
|
|
|
|
+ assertEquals(resource.getPropertyValue(ViewURLResourceProvider.VIEW_INSTANCE_NAME_PROPERTY_ID),"test");
|
|
|
|
+ assertEquals(resource.getPropertyValue(ViewURLResourceProvider.VIEW_INSTANCE_VERSION_PROPERTY_ID),"1.0.0");
|
|
|
|
+ assertEquals(resource.getPropertyValue(ViewURLResourceProvider.VIEW_INSTANCE_COMMON_NAME_PROPERTY_ID),"FILES");
|
|
|
|
+ verify(viewURLEntity,viewInstanceEntity,viewEntity);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testCreateResourcesAsAdministrator() throws Exception {
|
|
|
|
+ testCreateResources(TestAuthenticationFactory.createAdministrator());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ static void setDao(Field field, Object newValue) throws Exception {
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+
|
|
|
|
+ Field modifiersField = Field.class.getDeclaredField("modifiers");
|
|
|
|
+ modifiersField.setAccessible(true);
|
|
|
|
+ modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
|
|
|
|
+ field.set(null, newValue);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void testCreateResources(Authentication authentication) throws Exception {
|
|
|
|
+ ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
|
|
|
|
+ ViewEntity viewEntity = createNiceMock(ViewEntity.class);
|
|
|
|
+ ViewURLResourceProvider provider = new ViewURLResourceProvider();
|
|
|
|
+
|
|
|
|
+ ViewURLDAO viewURLDAO = createNiceMock(ViewURLDAO.class);
|
|
|
|
+ setDao(ViewURLResourceProvider.class.getDeclaredField("viewURLDAO"), viewURLDAO);
|
|
|
|
+ Set<Map<String, Object>> properties = new HashSet<>();
|
|
|
|
+ Map<String, Object> propertyMap = new HashMap<>();
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID,"suffix");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_COMMON_NAME_PROPERTY_ID,"FILES");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_VERSION_PROPERTY_ID,"1.0.0");
|
|
|
|
+
|
|
|
|
+ expect(viewregistry.getInstanceDefinition("FILES","1.0.0","test")).andReturn(viewInstanceEntity);
|
|
|
|
+ expect(viewregistry.getDefinition("FILES","1.0.0")).andReturn(viewEntity);
|
|
|
|
+ expect(viewInstanceEntity.getViewEntity()).andReturn(viewEntity).once();
|
|
|
|
+ expect(viewEntity.getCommonName()).andReturn("FILES").once();
|
|
|
|
+ expect(viewEntity.isDeployed()).andReturn(true).once();
|
|
|
|
+ expect(viewEntity.getVersion()).andReturn("1.0.0").once();
|
|
|
|
+ expect(viewInstanceEntity.getName()).andReturn("test").once();
|
|
|
|
+ expect(viewInstanceEntity.getViewUrl()).andReturn(null).once();
|
|
|
|
+ expect(viewURLDAO.findByName("test")).andReturn(Optional.<ViewURLEntity>absent());
|
|
|
|
+ Capture<ViewURLEntity> urlEntityCapture = newCapture();
|
|
|
|
+ viewURLDAO.save(capture(urlEntityCapture));
|
|
|
|
+ viewregistry.updateViewInstance(viewInstanceEntity);
|
|
|
|
+ viewregistry.updateView(viewInstanceEntity);
|
|
|
|
+ replay(viewregistry,viewEntity,viewInstanceEntity,viewURLDAO);
|
|
|
|
+
|
|
|
|
+ properties.add(propertyMap);
|
|
|
|
+
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
|
|
+
|
|
|
|
+ provider.createResources(PropertyHelper.getCreateRequest(properties, null));
|
|
|
|
+
|
|
|
|
+ ViewURLEntity urlEntity = urlEntityCapture.getValue();
|
|
|
|
+ assertEquals(urlEntity.getUrlName(),"test");
|
|
|
|
+ assertEquals(urlEntity.getUrlSuffix(),"suffix");
|
|
|
|
+ assertEquals(urlEntity.getViewInstanceEntity(),viewInstanceEntity);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test(expected = org.apache.ambari.server.controller.spi.SystemException.class)
|
|
|
|
+ public void testCreateResources_existingUrl() throws Exception {
|
|
|
|
+ ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
|
|
|
|
+ ViewEntity viewEntity = createNiceMock(ViewEntity.class);
|
|
|
|
+ ViewURLResourceProvider provider = new ViewURLResourceProvider();
|
|
|
|
+
|
|
|
|
+ ViewURLDAO viewURLDAO = createNiceMock(ViewURLDAO.class);
|
|
|
|
+ setDao(ViewURLResourceProvider.class.getDeclaredField("viewURLDAO"), viewURLDAO);
|
|
|
|
+ Set<Map<String, Object>> properties = new HashSet<>();
|
|
|
|
+ Map<String, Object> propertyMap = new HashMap<>();
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID,"suffix");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_COMMON_NAME_PROPERTY_ID,"FILES");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.VIEW_INSTANCE_VERSION_PROPERTY_ID,"1.0.0");
|
|
|
|
+
|
|
|
|
+ expect(viewregistry.getInstanceDefinition("FILES","1.0.0","test")).andReturn(viewInstanceEntity);
|
|
|
|
+ expect(viewregistry.getDefinition("FILES","1.0.0")).andReturn(viewEntity);
|
|
|
|
+ expect(viewInstanceEntity.getViewEntity()).andReturn(viewEntity).once();
|
|
|
|
+ expect(viewEntity.getCommonName()).andReturn("FILES").once();
|
|
|
|
+ expect(viewEntity.isDeployed()).andReturn(true).once();
|
|
|
|
+ expect(viewEntity.getVersion()).andReturn("1.0.0").once();
|
|
|
|
+ expect(viewInstanceEntity.getName()).andReturn("test").once();
|
|
|
|
+ expect(viewInstanceEntity.getViewUrl()).andReturn(null).once();
|
|
|
|
+ expect(viewURLDAO.findByName("test")).andReturn(Optional.of(new ViewURLEntity()));
|
|
|
|
+ replay(viewregistry,viewEntity,viewInstanceEntity,viewURLDAO);
|
|
|
|
+ properties.add(propertyMap);
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
|
|
|
|
+ provider.createResources(PropertyHelper.getCreateRequest(properties, null));
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testUpdateResources() throws Exception {
|
|
|
|
+ ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
|
|
|
|
+ ViewEntity viewEntity = createNiceMock(ViewEntity.class);
|
|
|
|
+ ViewURLResourceProvider provider = new ViewURLResourceProvider();
|
|
|
|
+ ViewURLEntity viewURLEntity = createNiceMock(ViewURLEntity.class);
|
|
|
|
+
|
|
|
|
+ ViewURLDAO viewURLDAO = createNiceMock(ViewURLDAO.class);
|
|
|
|
+ setDao(ViewURLResourceProvider.class.getDeclaredField("viewURLDAO"), viewURLDAO);
|
|
|
|
+ Set<Map<String, Object>> properties = new HashSet<>();
|
|
|
|
+ Map<String, Object> propertyMap = new HashMap<>();
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID,"suffix2");
|
|
|
|
+
|
|
|
|
+ expect(viewURLDAO.findByName("test")).andReturn(Optional.of(viewURLEntity));
|
|
|
|
+ expect(viewURLEntity.getViewInstanceEntity()).andReturn(viewInstanceEntity).once();
|
|
|
|
+ expect(viewURLEntity.getUrlName()).andReturn("test").once();
|
|
|
|
+ expect(viewURLEntity.getUrlSuffix()).andReturn("suffix2").once();
|
|
|
|
+ expect(viewURLEntity.getViewInstanceEntity()).andReturn(viewInstanceEntity).once();
|
|
|
|
+ viewURLEntity.setUrlSuffix("suffix2");
|
|
|
|
+ Capture<ViewURLEntity> urlEntityCapture = newCapture();
|
|
|
|
+ viewURLDAO.update(capture(urlEntityCapture));
|
|
|
|
+ viewregistry.updateViewInstance(viewInstanceEntity);
|
|
|
|
+ viewregistry.updateView(viewInstanceEntity);
|
|
|
|
+ replay(viewregistry,viewEntity,viewInstanceEntity,viewURLDAO,viewURLEntity);
|
|
|
|
+
|
|
|
|
+ properties.add(propertyMap);
|
|
|
|
+
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
|
|
|
|
+
|
|
|
|
+ PredicateBuilder predicateBuilder = new PredicateBuilder();
|
|
|
|
+ Predicate predicate =
|
|
|
|
+ predicateBuilder.property(ViewURLResourceProvider.URL_NAME_PROPERTY_ID).equals("test").toPredicate();
|
|
|
|
+
|
|
|
|
+ provider.updateResources(PropertyHelper.getCreateRequest(properties, null),predicate);
|
|
|
|
+
|
|
|
|
+ ViewURLEntity urlEntity = urlEntityCapture.getValue();
|
|
|
|
+ assertEquals(urlEntity.getUrlName(),"test");
|
|
|
|
+ assertEquals(urlEntity.getUrlSuffix(),"suffix2");
|
|
|
|
+ assertEquals(urlEntity.getViewInstanceEntity(),viewInstanceEntity);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testDeleteResources() throws Exception {
|
|
|
|
+ ViewInstanceEntity viewInstanceEntity = createNiceMock(ViewInstanceEntity.class);
|
|
|
|
+ ViewEntity viewEntity = createNiceMock(ViewEntity.class);
|
|
|
|
+ ViewURLResourceProvider provider = new ViewURLResourceProvider();
|
|
|
|
+ ViewURLEntity viewURLEntity = createNiceMock(ViewURLEntity.class);
|
|
|
|
+ ViewURLDAO viewURLDAO = createNiceMock(ViewURLDAO.class);
|
|
|
|
+ EqualsPredicate equalsPredicate = new EqualsPredicate(ViewURLResourceProvider.URL_NAME_PROPERTY_ID,"test");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ setDao(ViewURLResourceProvider.class.getDeclaredField("viewURLDAO"), viewURLDAO);
|
|
|
|
+ Set<Map<String, Object>> properties = new HashSet<>();
|
|
|
|
+ Map<String, Object> propertyMap = new HashMap<>();
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_NAME_PROPERTY_ID,"test");
|
|
|
|
+ propertyMap.put(ViewURLResourceProvider.URL_SUFFIX_PROPERTY_ID,"suffix");
|
|
|
|
+
|
|
|
|
+ expect(viewURLDAO.findByName("test")).andReturn(Optional.of(viewURLEntity));
|
|
|
|
+ expect(viewURLEntity.getViewInstanceEntity()).andReturn(viewInstanceEntity).once();
|
|
|
|
+ expect(viewURLEntity.getUrlName()).andReturn("test").once();
|
|
|
|
+ expect(viewURLEntity.getUrlSuffix()).andReturn("suffix").once();
|
|
|
|
+ expect(viewURLEntity.getViewInstanceEntity()).andReturn(viewInstanceEntity).once();
|
|
|
|
+ viewURLEntity.setUrlSuffix("suffix");
|
|
|
|
+ Capture<ViewURLEntity> urlEntityCapture = newCapture();
|
|
|
|
+ viewInstanceEntity.clearUrl();
|
|
|
|
+ viewURLEntity.clearEntity();
|
|
|
|
+ viewURLDAO.delete(capture(urlEntityCapture));
|
|
|
|
+ viewregistry.updateViewInstance(viewInstanceEntity);
|
|
|
|
+ viewregistry.updateView(viewInstanceEntity);
|
|
|
|
+ replay(viewregistry,viewEntity,viewInstanceEntity,viewURLDAO,viewURLEntity);
|
|
|
|
+
|
|
|
|
+ properties.add(propertyMap);
|
|
|
|
+
|
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
|
|
|
|
+
|
|
|
|
+ provider.deleteResources(PropertyHelper.getCreateRequest(properties, null),equalsPredicate);
|
|
|
|
+
|
|
|
|
+ ViewURLEntity urlEntity = urlEntityCapture.getValue();
|
|
|
|
+ assertEquals(urlEntity.getUrlName(),"test");
|
|
|
|
+ assertEquals(urlEntity.getUrlSuffix(),"suffix");
|
|
|
|
+ assertEquals(urlEntity.getViewInstanceEntity(),viewInstanceEntity);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|