Repository: ambari Updated Branches: refs/heads/branch-2.5 d60e9612c -> 72378e26f
AMBARI-19194 - Deployed Views Throw Exceptions On Ambari Server Startup (jonathanhurley) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/72378e26 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/72378e26 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/72378e26 Branch: refs/heads/branch-2.5 Commit: 72378e26f6b8bdb0021a82467d7c5d3d3091e851 Parents: d60e9612 Author: Jonathan Hurley <jhur...@hortonworks.com> Authored: Tue Dec 13 17:05:25 2016 -0500 Committer: Jonathan Hurley <jhur...@hortonworks.com> Committed: Thu Dec 15 09:44:43 2016 -0500 ---------------------------------------------------------------------- .../ambari/server/orm/dao/ViewInstanceDAO.java | 23 ++++++++ .../server/orm/entities/ViewInstanceEntity.java | 58 +++++++++++--------- .../apache/ambari/server/view/ViewRegistry.java | 13 ++++- 3 files changed, 67 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/72378e26/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java index eef3e61..061c722 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewInstanceDAO.java @@ -25,6 +25,7 @@ import javax.persistence.NoResultException; import javax.persistence.TypedQuery; import org.apache.ambari.server.orm.RequiresSession; +import org.apache.ambari.server.orm.entities.ResourceEntity; import org.apache.ambari.server.orm.entities.ViewInstanceDataEntity; import org.apache.ambari.server.orm.entities.ViewInstanceEntity; @@ -93,6 +94,28 @@ public class ViewInstanceDAO { } /** + * Gets the associated {@link ResourceEntity} for a given instance. + * + * @param viewName + * the name of the view + * @param instanceName + * the name of the view instance + * + * @return the associated resource entity or {@code null}. + */ + @RequiresSession + public ResourceEntity findResourceForViewInstance(String viewName, + String instanceName) { + TypedQuery<ResourceEntity> query = entityManagerProvider.get().createNamedQuery( + "getResourceIdByViewInstance", ResourceEntity.class); + + query.setParameter("viewName", viewName); + query.setParameter("instanceName", instanceName); + + return daoUtils.selectOne(query); + } + + /** * Refresh the state of the instance from the database, * overwriting changes made to the entity, if any. * http://git-wip-us.apache.org/repos/asf/ambari/blob/72378e26/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java index e20db3b..b632c54 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java @@ -72,14 +72,17 @@ import org.apache.ambari.view.validation.ValidationResult; name = "UQ_viewinstance_name", columnNames = {"view_name", "name"} ) ) -@NamedQueries({ - @NamedQuery(name = "allViewInstances", - query = "SELECT viewInstance FROM ViewInstanceEntity viewInstance"), - @NamedQuery(name = "viewInstanceByResourceId", query = - "SELECT viewInstance " + - "FROM ViewInstanceEntity viewInstance " + - "WHERE viewInstance.resource.id=:resourceId") -}) +@NamedQueries({ @NamedQuery( + name = "allViewInstances", + query = "SELECT viewInstance FROM ViewInstanceEntity viewInstance"), + @NamedQuery( + name = "viewInstanceByResourceId", + query = "SELECT viewInstance FROM ViewInstanceEntity viewInstance " + + "WHERE viewInstance.resource.id=:resourceId"), + @NamedQuery( + name = "getResourceIdByViewInstance", + query = "SELECT viewInstance.resource FROM ViewInstanceEntity viewInstance " + + "WHERE viewInstance.viewName = :viewName AND viewInstance.name = :instanceName"), }) @TableGenerator(name = "view_instance_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value" @@ -242,7 +245,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { public ViewInstanceEntity() { instanceConfig = null; - this.alterNames = 1; + alterNames = 1; } /** @@ -252,15 +255,15 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { * @param instanceConfig the associated configuration */ public ViewInstanceEntity(ViewEntity view, InstanceConfig instanceConfig) { - this.name = instanceConfig.getName(); + name = instanceConfig.getName(); this.instanceConfig = instanceConfig; this.view = view; - this.viewName = view.getName(); - this.description = instanceConfig.getDescription(); - this.clusterHandle = null; - this.visible = instanceConfig.isVisible() ? 'Y' : 'N'; - this.alterNames = 1; - this.clusterType = ClusterType.LOCAL_AMBARI; + viewName = view.getName(); + description = instanceConfig.getDescription(); + clusterHandle = null; + visible = instanceConfig.isVisible() ? 'Y' : 'N'; + alterNames = 1; + clusterType = ClusterType.LOCAL_AMBARI; String label = instanceConfig.getLabel(); this.label = (label == null || label.length() == 0) ? view.getLabel() : label; @@ -291,13 +294,13 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { */ public ViewInstanceEntity(ViewEntity view, String name, String label) { this.name = name; - this.instanceConfig = null; + instanceConfig = null; this.view = view; - this.viewName = view.getName(); - this.description = null; - this.clusterHandle = null; - this.visible = 'Y'; - this.alterNames = 1; + viewName = view.getName(); + description = null; + clusterHandle = null; + visible = 'Y'; + alterNames = 1; this.label = label; } @@ -456,6 +459,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { * * @return clusterType the type of cluster for cluster handle */ + @Override public ClusterType getClusterType() { return clusterType; } @@ -957,8 +961,12 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } ViewInstanceEntity that = (ViewInstanceEntity) o; @@ -992,7 +1000,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition { * Remove the URL associated with this entity */ public void clearUrl() { - this.viewUrl = null; + viewUrl = null; } //----- ViewInstanceVersionDTO inner class -------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/72378e26/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java index ab83696..608435d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java @@ -565,7 +565,6 @@ public class ViewRegistry { } instanceEntity.validate(viewEntity, Validator.ValidationContext.PRE_CREATE); - setPersistenceEntities(instanceEntity); ViewInstanceEntity persistedInstance = mergeViewInstance(instanceEntity, viewEntity.getResourceType()); @@ -587,6 +586,7 @@ public class ViewRegistry { // add the web app context handlerList.addViewInstance(instanceEntity); } + } else { String message = "Attempt to install an instance for an unknown view " + instanceEntity.getViewName() + "."; @@ -969,6 +969,7 @@ public class ViewRegistry { String viewName = viewEntity.getName(); ViewConfig viewConfig = viewEntity.getConfiguration(); AutoInstanceConfig autoConfig = viewConfig.getAutoInstance(); + Collection<String> roles = autoConfig.getRoles(); try { if (checkAutoInstanceConfig(autoConfig, stackId, event.getServiceName(), serviceNames)) { @@ -977,6 +978,7 @@ public class ViewRegistry { ViewInstanceEntity viewInstanceEntity = createViewInstanceEntity(viewEntity, viewConfig, autoConfig); viewInstanceEntity.setClusterHandle(clusterId); installViewInstance(viewInstanceEntity); + setViewInstanceRoleAccess(viewInstanceEntity, roles); } } catch (Exception e) { LOG.error("Can't auto create instance of view " + viewName + " for cluster " + clusterName + @@ -1725,6 +1727,7 @@ public class ViewRegistry { instanceEntity.setXmlDriven(true); instanceDefinitions.add(instanceEntity); } + persistView(viewDefinition, instanceDefinitions); // auto instances of loaded old views for doing data migration can not be installed @@ -1885,6 +1888,12 @@ public class ViewRegistry { if ((roles != null) && !roles.isEmpty()) { PermissionEntity permissionViewUser = permissionDAO.findViewUsePermission(); + ResourceEntity resourceEntity = viewInstanceEntity.getResource(); + if (null == resourceEntity) { + resourceEntity = instanceDAO.findResourceForViewInstance(viewInstanceEntity.getViewName(), + viewInstanceEntity.getInstanceName()); + } + if (permissionViewUser == null) { LOG.error("Missing the {} role. Access to view cannot be set.", PermissionEntity.VIEW_USER_PERMISSION_NAME, viewInstanceEntity.getName()); @@ -1905,7 +1914,7 @@ public class ViewRegistry { PrivilegeEntity privilegeEntity = new PrivilegeEntity(); privilegeEntity.setPermission(permissionViewUser); privilegeEntity.setPrincipal(principalRole); - privilegeEntity.setResource(viewInstanceEntity.getResource()); + privilegeEntity.setResource(resourceEntity); privilegeDAO.create(privilegeEntity); } }