Jelajahi Sumber

AMBARI-5970 - Views: Add <label> to <instance>

tbeerbower 11 tahun lalu
induk
melakukan
c8de2f1815

+ 25 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java

@@ -54,6 +54,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   public static final String VIEW_NAME_PROPERTY_ID     = "ViewInstanceInfo/view_name";
   public static final String VIEW_NAME_PROPERTY_ID     = "ViewInstanceInfo/view_name";
   public static final String VIEW_VERSION_PROPERTY_ID  = "ViewInstanceInfo/version";
   public static final String VIEW_VERSION_PROPERTY_ID  = "ViewInstanceInfo/version";
   public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
   public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
+  public static final String LABEL_PROPERTY_ID         = "ViewInstanceInfo/label";
   public static final String PROPERTIES_PROPERTY_ID    = "ViewInstanceInfo/properties";
   public static final String PROPERTIES_PROPERTY_ID    = "ViewInstanceInfo/properties";
   public static final String DATA_PROPERTY_ID          = "ViewInstanceInfo/instance_data";
   public static final String DATA_PROPERTY_ID          = "ViewInstanceInfo/instance_data";
   public static final String CONTEXT_PATH_PROPERTY_ID  = "ViewInstanceInfo/context_path";
   public static final String CONTEXT_PATH_PROPERTY_ID  = "ViewInstanceInfo/context_path";
@@ -82,6 +83,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
+    propertyIds.add(LABEL_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
     propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
     propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
@@ -198,6 +200,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewName, requestedIds);
     setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewName, requestedIds);
     setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, version, requestedIds);
     setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, version, requestedIds);
     setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, name, requestedIds);
     setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, name, requestedIds);
+    setResourceProperty(resource, LABEL_PROPERTY_ID, viewInstanceEntity.getLabel(), requestedIds);
     Map<String, String> properties = new HashMap<String, String>();
     Map<String, String> properties = new HashMap<String, String>();
 
 
     for (ViewInstancePropertyEntity viewInstancePropertyEntity : viewInstanceEntity.getProperties()) {
     for (ViewInstancePropertyEntity viewInstancePropertyEntity : viewInstanceEntity.getProperties()) {
@@ -234,17 +237,25 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     if (viewName == null || viewName.isEmpty()) {
     if (viewName == null || viewName.isEmpty()) {
       throw new IllegalArgumentException("View name must be provided");
       throw new IllegalArgumentException("View name must be provided");
     }
     }
-    viewName = ViewEntity.getViewName(viewName, version);
 
 
-    ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
-    viewInstanceEntity.setName(name);
-    viewInstanceEntity.setViewName(viewName);
+    ViewRegistry       viewRegistry       = ViewRegistry.getInstance();
+    ViewInstanceEntity viewInstanceEntity = viewRegistry.getInstanceDefinition(viewName, version, name);
 
 
-    ViewEntity viewEntity = new ViewEntity();
-    viewEntity.setName(viewName);
-    viewEntity.setVersion(version);
+    viewName = ViewEntity.getViewName(viewName, version);
 
 
-    viewInstanceEntity.setViewEntity(viewEntity);
+    if (viewInstanceEntity == null) {
+      viewInstanceEntity = new ViewInstanceEntity();
+      viewInstanceEntity.setName(name);
+      viewInstanceEntity.setViewName(viewName);
+      ViewEntity viewEntity = new ViewEntity();
+      viewEntity.setName(viewName);
+      viewEntity.setVersion(version);
+      viewInstanceEntity.setViewEntity(viewEntity);
+    }
+    String label = (String) properties.get(LABEL_PROPERTY_ID);
+    if (label != null) {
+      viewInstanceEntity.setLabel(label);
+    }
 
 
     Collection<ViewInstancePropertyEntity> instanceProperties = new HashSet<ViewInstancePropertyEntity>();
     Collection<ViewInstancePropertyEntity> instanceProperties = new HashSet<ViewInstancePropertyEntity>();
     Collection<ViewInstanceDataEntity>     instanceData       = new HashSet<ViewInstanceDataEntity>();
     Collection<ViewInstanceDataEntity>     instanceData       = new HashSet<ViewInstanceDataEntity>();
@@ -275,8 +286,12 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
         instanceData.add(viewInstanceDataEntity);
         instanceData.add(viewInstanceDataEntity);
       }
       }
     }
     }
-    viewInstanceEntity.setProperties(instanceProperties);
-    viewInstanceEntity.setData(instanceData);
+    if (!instanceProperties.isEmpty()) {
+      viewInstanceEntity.setProperties(instanceProperties);
+    }
+    if (!instanceData.isEmpty()) {
+      viewInstanceEntity.setData(instanceData);
+    }
 
 
     return viewInstanceEntity;
     return viewInstanceEntity;
   }
   }

+ 28 - 1
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java

@@ -28,6 +28,7 @@ import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetails;
 
 
+import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
@@ -68,6 +69,13 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   @Column(name = "name", nullable = false, insertable = true, updatable = false)
   @Column(name = "name", nullable = false, insertable = true, updatable = false)
   private String name;
   private String name;
 
 
+  /**
+   * The public view instance name.
+   */
+  @Column
+  @Basic
+  private String label;
+
   /**
   /**
    * The instance properties.
    * The instance properties.
    */
    */
@@ -138,6 +146,9 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     this.instanceConfig = instanceConfig;
     this.instanceConfig = instanceConfig;
     this.view           = view;
     this.view           = view;
     this.viewName       = view.getName();
     this.viewName       = view.getName();
+
+    String label = instanceConfig.getLabel();
+    this.label = (label == null || label.length()== 0) ? view.getLabel() : label;
   }
   }
 
 
   /**
   /**
@@ -151,6 +162,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     this.instanceConfig = null;
     this.instanceConfig = null;
     this.view           = view;
     this.view           = view;
     this.viewName       = view.getName();
     this.viewName       = view.getName();
+    this.label          = view.getLabel();
   }
   }
 
 
 
 
@@ -195,7 +207,13 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     return view;
     return view;
   }
   }
 
 
-// ----- ViewInstanceEntity ------------------------------------------------
+  @Override
+  public String getLabel() {
+    return label;
+  }
+
+
+  // ----- ViewInstanceEntity ------------------------------------------------
 
 
   /**
   /**
    * Set the view name.
    * Set the view name.
@@ -224,6 +242,15 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
     this.name = name;
     this.name = name;
   }
   }
 
 
+  /**
+   * Set the label.
+   *
+   * @param label  the label
+   */
+  public void setLabel(String label) {
+    this.label = label;
+  }
+
   /**
   /**
    * Get the instance properties.
    * Get the instance properties.
    *
    *

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog161.java

@@ -79,6 +79,9 @@ public class UpgradeCatalog161 extends AbstractUpgradeCatalog {
     dbAccessor.addColumn("viewinstancedata",
     dbAccessor.addColumn("viewinstancedata",
         new DBAccessor.DBColumnInfo("user_name", String.class, 255, " ", false));
         new DBAccessor.DBColumnInfo("user_name", String.class, 255, " ", false));
 
 
+    dbAccessor.addColumn("viewinstance",
+        new DBAccessor.DBColumnInfo("label", String.class, 255, null, true));
+
     // ========================================================================
     // ========================================================================
     // Add constraints
     // Add constraints
     dbAccessor.addFKConstraint("requestoperationlevel", "FK_req_op_level_req_id",
     dbAccessor.addFKConstraint("requestoperationlevel", "FK_req_op_level_req_id",

+ 2 - 1
ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java

@@ -422,7 +422,7 @@ public class ViewRegistry {
           LOG.debug("Updating view instance " + viewName + "/" +
           LOG.debug("Updating view instance " + viewName + "/" +
               version + "/" + instanceName);
               version + "/" + instanceName);
         }
         }
-
+        entity.setLabel(instanceEntity.getLabel());
         entity.setProperties(instanceEntity.getProperties());
         entity.setProperties(instanceEntity.getProperties());
         entity.setData(instanceEntity.getData());
         entity.setData(instanceEntity.getData());
 
 
@@ -796,6 +796,7 @@ public class ViewRegistry {
           instanceDefinitions.add(viewInstanceEntity);
           instanceDefinitions.add(viewInstanceEntity);
         } else {
         } else {
           // apply overrides to the in-memory view instance entities
           // apply overrides to the in-memory view instance entities
+          instanceDefinition.setLabel(viewInstanceEntity.getLabel());
           instanceDefinition.setData(viewInstanceEntity.getData());
           instanceDefinition.setData(viewInstanceEntity.getData());
           instanceDefinition.setProperties(viewInstanceEntity.getProperties());
           instanceDefinition.setProperties(viewInstanceEntity.getProperties());
           instanceDefinition.setEntities(viewInstanceEntity.getEntities());
           instanceDefinition.setEntities(viewInstanceEntity.getEntities());

+ 14 - 0
ambari-server/src/main/java/org/apache/ambari/server/view/configuration/InstanceConfig.java

@@ -34,6 +34,11 @@ public class InstanceConfig {
    */
    */
   private String name;
   private String name;
 
 
+  /**
+   * The public view name.
+   */
+  private String label;
+
   /**
   /**
    * The instance properties.
    * The instance properties.
    */
    */
@@ -49,6 +54,15 @@ public class InstanceConfig {
     return name;
     return name;
   }
   }
 
 
+  /**
+   * Get the public view name.
+   *
+   * @return the view label
+   */
+  public String getLabel() {
+    return label;
+  }
+
   /**
   /**
    * Get the instance properties.
    * Get the instance properties.
    *
    *

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -64,7 +64,7 @@ CREATE TABLE blueprint_configuration (blueprint_name VARCHAR(255) NOT NULL, type
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, hostgroup_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, config_data TEXT NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -54,7 +54,7 @@ CREATE TABLE blueprint_configuration (blueprint_name VARCHAR2(255) NOT NULL, typ
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR2(255) NOT NULL, hostgroup_name VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, config_data CLOB NOT NULL, PRIMARY KEY(blueprint_name, hostgroup_name, type_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), "resource" VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), "resource" VARCHAR(255), PRIMARY KEY(view_name, name));

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql

@@ -87,7 +87,7 @@ CREATE TABLE hostgroup_configuration (blueprint_name VARCHAR(255) NOT NULL, host
 
 
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(view_name, name));
+CREATE TABLE viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql

@@ -134,7 +134,7 @@ GRANT ALL PRIVILEGES ON TABLE ambari.hostgroup_configuration TO :username;
 
 
 CREATE TABLE ambari.viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE ambari.viewmain (view_name VARCHAR(255) NOT NULL, label VARCHAR(255), version VARCHAR(255), archive VARCHAR(255), PRIMARY KEY(view_name));
 CREATE TABLE ambari.viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
 CREATE TABLE ambari.viewinstancedata (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name, user_name));
-CREATE TABLE ambari.viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(view_name, name));
+CREATE TABLE ambari.viewinstance (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, label VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE ambari.viewinstanceproperty (view_name VARCHAR(255) NOT NULL, view_instance_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, value VARCHAR(2000) NOT NULL, PRIMARY KEY(view_name, view_instance_name, name));
 CREATE TABLE ambari.viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewparameter (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255), required CHAR(1), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));
 CREATE TABLE ambari.viewresource (view_name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, plural_name VARCHAR(255), id_property VARCHAR(255), subResource_names VARCHAR(255), provider VARCHAR(255), service VARCHAR(255), resource VARCHAR(255), PRIMARY KEY(view_name, name));

+ 37 - 0
ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java

@@ -34,6 +34,25 @@ import static org.easymock.EasyMock.createNiceMock;
  */
  */
 public class ViewInstanceEntityTest {
 public class ViewInstanceEntityTest {
 
 
+  private static String xml_with_instance_label = "<view>\n" +
+      "    <name>MY_VIEW</name>\n" +
+      "    <label>My View!</label>\n" +
+      "    <version>1.0.0</version>\n" +
+      "    <instance>\n" +
+      "        <name>INSTANCE1</name>\n" +
+      "        <label>My Instance 1!</label>\n" +
+      "    </instance>\n" +
+      "</view>";
+
+  private static String xml_without_instance_label = "<view>\n" +
+      "    <name>MY_VIEW</name>\n" +
+      "    <label>My View!</label>\n" +
+      "    <version>1.0.0</version>\n" +
+      "    <instance>\n" +
+      "        <name>INSTANCE1</name>\n" +
+      "    </instance>\n" +
+      "</view>";
+
   @Test
   @Test
   public void testGetViewEntity() throws Exception {
   public void testGetViewEntity() throws Exception {
     InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
     InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
@@ -59,6 +78,24 @@ public class ViewInstanceEntityTest {
     Assert.assertEquals("INSTANCE1", viewInstanceDefinition.getName());
     Assert.assertEquals("INSTANCE1", viewInstanceDefinition.getName());
   }
   }
 
 
+  @Test
+  public void testGetLabel() throws Exception {
+    // with an instance label
+    InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_with_instance_label).get(0);
+    ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
+    ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+
+    Assert.assertEquals("My Instance 1!", viewInstanceDefinition.getLabel());
+
+    // without an instance label
+    instanceConfig = InstanceConfigTest.getInstanceConfigs(xml_without_instance_label).get(0);
+    viewDefinition = ViewEntityTest.getViewEntity();
+    viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
+
+    // should default to view label
+    Assert.assertEquals("My View!", viewInstanceDefinition.getLabel());
+  }
+
   @Test
   @Test
   public void testAddGetProperty() throws Exception {
   public void testAddGetProperty() throws Exception {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();

+ 26 - 8
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog161Test.java

@@ -22,7 +22,6 @@ import com.google.inject.Binder;
 import com.google.inject.Guice;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Injector;
 import com.google.inject.Module;
 import com.google.inject.Module;
-
 import com.google.inject.Provider;
 import com.google.inject.Provider;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessor;
@@ -36,12 +35,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.EntityTransaction;
 import javax.persistence.EntityTransaction;
 import javax.persistence.TypedQuery;
 import javax.persistence.TypedQuery;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.sql.SQLException;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertFalse;
@@ -54,7 +49,6 @@ import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.createStrictMock;
 import static org.easymock.EasyMock.createStrictMock;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 import static org.easymock.EasyMock.verify;
 
 
@@ -72,9 +66,11 @@ public class UpgradeCatalog161Test {
 
 
     Capture<DBAccessor.DBColumnInfo> provisioningStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> provisioningStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<List<DBAccessor.DBColumnInfo>> operationLevelEntityColumnCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
     Capture<List<DBAccessor.DBColumnInfo>> operationLevelEntityColumnCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
-    
+    Capture<DBAccessor.DBColumnInfo> labelColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+
     setClustersConfigExpectations(dbAccessor, provisioningStateColumnCapture);    
     setClustersConfigExpectations(dbAccessor, provisioningStateColumnCapture);    
     setOperationLevelEntityConfigExpectations(dbAccessor, operationLevelEntityColumnCapture);
     setOperationLevelEntityConfigExpectations(dbAccessor, operationLevelEntityColumnCapture);
+    setViewInstanceExpectations(dbAccessor, labelColumnCapture);
 
 
     replay(dbAccessor, configuration);
     replay(dbAccessor, configuration);
     AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
     AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
@@ -88,6 +84,7 @@ public class UpgradeCatalog161Test {
 
 
     assertClusterColumns(provisioningStateColumnCapture);
     assertClusterColumns(provisioningStateColumnCapture);
     assertOperationLevelEntityColumns(operationLevelEntityColumnCapture);
     assertOperationLevelEntityColumns(operationLevelEntityColumnCapture);
+    assertViewInstanceColumns(labelColumnCapture);
   }
   }
 
 
   @SuppressWarnings("unchecked")
   @SuppressWarnings("unchecked")
@@ -237,5 +234,26 @@ public class UpgradeCatalog161Test {
       assertEquals(String.class, column.getType());
       assertEquals(String.class, column.getType());
       assertEquals(State.INIT.name(), column.getDefaultValue());
       assertEquals(State.INIT.name(), column.getDefaultValue());
       assertFalse(column.isNullable());
       assertFalse(column.isNullable());
-    }  
+    }
+
+
+  private void setViewInstanceExpectations(DBAccessor dbAccessor,
+                                             Capture<DBAccessor.DBColumnInfo> labelColumnCapture) throws SQLException {
+
+    dbAccessor.addColumn(eq("viewinstance"),
+        capture(labelColumnCapture));
+  }
+
+  private void assertViewInstanceColumns(
+      Capture<DBAccessor.DBColumnInfo> labelColumnCapture) {
+    DBAccessor.DBColumnInfo column = labelColumnCapture.getValue();
+    assertEquals("label", column.getName());
+    assertEquals(255, (int) column.getLength());
+    assertEquals(String.class, column.getType());
+    assertNull(column.getDefaultValue());
+    assertTrue(column.isNullable());
+  }
+
+
+
 }
 }

+ 9 - 0
ambari-server/src/test/java/org/apache/ambari/server/view/configuration/InstanceConfigTest.java

@@ -56,6 +56,15 @@ public class InstanceConfigTest {
     Assert.assertEquals("INSTANCE2", instances.get(1).getName());
     Assert.assertEquals("INSTANCE2", instances.get(1).getName());
   }
   }
 
 
+  @Test
+  public void testGetLabel() throws Exception {
+    List<InstanceConfig> instances = getInstanceConfigs();
+
+    Assert.assertEquals(2, instances.size());
+    Assert.assertEquals("My Instance 1!", instances.get(0).getLabel());
+    Assert.assertEquals("My Instance 2!", instances.get(1).getLabel());
+  }
+
   @Test
   @Test
   public void testGetProperties() throws Exception {
   public void testGetProperties() throws Exception {
     List<InstanceConfig> instances = getInstanceConfigs();
     List<InstanceConfig> instances = getInstanceConfigs();

+ 2 - 0
ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java

@@ -75,6 +75,7 @@ public class ViewConfigTest {
       "    </resource>\n" +
       "    </resource>\n" +
       "    <instance>\n" +
       "    <instance>\n" +
       "        <name>INSTANCE1</name>\n" +
       "        <name>INSTANCE1</name>\n" +
+      "        <label>My Instance 1!</label>\n" +
       "        <property>\n" +
       "        <property>\n" +
       "            <key>p1</key>\n" +
       "            <key>p1</key>\n" +
       "            <value>v1-1</value>\n" +
       "            <value>v1-1</value>\n" +
@@ -86,6 +87,7 @@ public class ViewConfigTest {
       "    </instance>\n" +
       "    </instance>\n" +
       "    <instance>\n" +
       "    <instance>\n" +
       "        <name>INSTANCE2</name>\n" +
       "        <name>INSTANCE2</name>\n" +
+      "        <label>My Instance 2!</label>\n" +
       "        <property>\n" +
       "        <property>\n" +
       "            <key>p1</key>\n" +
       "            <key>p1</key>\n" +
       "            <value>v1-2</value>\n" +
       "            <value>v1-2</value>\n" +

+ 7 - 0
ambari-views/src/main/java/org/apache/ambari/view/ViewInstanceDefinition.java

@@ -39,6 +39,13 @@ public interface ViewInstanceDefinition {
    */
    */
   public String getViewName();
   public String getViewName();
 
 
+  /**
+   * Get the view instance label (display name).
+   *
+   * @return the view instance label
+   */
+  public String getLabel();
+
   /**
   /**
    * Get the instance property map.
    * Get the instance property map.
    *
    *