You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2013/04/06 03:55:47 UTC

svn commit: r1465166 [10/15] - in /incubator/ambari/trunk: ./ ambari-web/app/ ambari-web/app/assets/data/background_operations/ ambari-web/app/assets/data/clusters/ ambari-web/app/assets/data/configurations/ ambari-web/app/assets/data/dashboard/ ambari...

Modified: incubator/ambari/trunk/ambari-web/app/data/custom_configs.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/custom_configs.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/custom_configs.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/custom_configs.js Sat Apr  6 01:55:42 2013
@@ -21,28 +21,172 @@ module.exports =
   [
     {
       "id": "conf-site",
-      "name": "capacity-scheduler",
-      "displayName": "Custom Capacity Scheduler Configs",
-      "value": "",
-      "defaultValue": require('data/capacity-scheduler_default'),
-      "description": "Enter in key=value format to set capacity-scheduler.xml  parameters not exposed through this page.<br> New line is the delimiter for every key-value pair.",
-      "displayType": "custom",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.capacity",
+      "displayName": "Capacity",
+      "value": '',
+      "defaultValue": '',
+      "description": "Percentage of the number of slots in the cluster that are made to be available for jobs in this queue. The sum of capacities for all queues should be less than or equal 100.",
       "isVisible": true,
-      "isRequired": false,
+      "isRequired": true,
       "serviceName": "MAPREDUCE",
-      "category": "Capacity Scheduler"
+      "category": "CapacityScheduler",
+      "unit": "%",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
     },
     {
       "id": "conf-site",
-      "name": "mapred-queue-acls",
-      "displayName": "Custom MapReduce Queue Configs",
-      "value": "",
-      "defaultValue": require('data/mapred-queue-acl_default'),
-      "description": "Enter in key=value format to set mapred-queue-acls.xml parameters not exposed through this page.<br> New line is the delimiter for every key-value pair.",
-      "displayType": "custom",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.maximum-capacity",
+      "displayName": "Max Capacity",
+      "value": '',
+      "defaultValue": 100,
+      "displayType": "int",
+      "description": "Defines a limit beyond which a queue cannot use the capacity of the cluster." +
+        "This provides a means to limit how much excess capacity a queue can use. By default, there is no limit." +
+        "The Max Capacity of a queue can only be greater than or equal to its minimum capacity. " +
+        "This property could be to curtail certain jobs which are long running in nature from occupying more than a certain " +
+        "percentage of the cluster, which in the absence of pre-emption, could lead to capacity guarantees of other queues being affected. " +
+        "One important thing to note is that maximum-capacity is a percentage , so based on the cluster's capacity it would change. " +
+        "So if large no of nodes or racks get added to the cluster, Max Capacity in absolute terms would increase accordingly. ",
       "isVisible": true,
-      "isRequired": false,
+      "isRequired": true,
       "serviceName": "MAPREDUCE",
-      "category": "Capacity Scheduler"
+      "category": "CapacityScheduler",
+      "unit": "%",
+      "valueRange": [0, 100],
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.minimum-user-limit-percent",
+      "displayName": "Min User Limit",
+      "value": '',
+      "defaultValue": 100,
+      "displayType": "int",
+      "description": "Each queue enforces a limit on the percentage of resources allocated to a user at any given time, " +
+        "if there is competition for them. This user limit can vary between a minimum and maximum value. " +
+        "The former depends on the number of users who have submitted jobs, and the latter is set to this property value. " +
+        "For example, suppose the value of this property is 25. If two users have submitted jobs to a queue, no single user " +
+        "can use more than 50% of the queue resources. If a third user submits a job, no single user can use more than 33% of " +
+        "the queue resources. With 4 or more users, no user can use more than 25% of the queue's resources. " +
+        "A value of 100 implies no user limits are imposed.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "unit": "%",
+      "valueRange": [1, 100],
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.user-limit-factor",
+      "displayName": "User Limit Factor",
+      "value": '',
+      "defaultValue": 1,
+      "displayType": "int",
+      "description": "The multiple of the queue capacity which can be configured to allow a single user to acquire more slots. " +
+        "By default this is set to 1 which ensure that a single user can never take more than the queue's configured capacity " +
+        "irrespective of how idle the cluster is.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.supports-priority",
+      "displayName": "Supports Priority",
+      "value": false,
+      "defaultValue": false,
+      "displayType": "checkbox",
+      "description": "If true, priorities of jobs will be taken into account in scheduling decisions.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.queue.<queue-name>.acl-submit-job",
+      "displayName": "",
+      "value": '',
+      "defaultValue": '',
+      "description": "",
+      "isVisible": false,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'mapred-queue-acls.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.queue.<queue-name>.acl-administer-jobs",
+      "displayName": "",
+      "value": '',
+      "defaultValue": '',
+      "description": "",
+      "isVisible": false,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'mapred-queue-acls.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.maximum-initialized-active-tasks",
+      "displayName": "Max initialized active tasks",
+      "value": '',
+      "defaultValue": 200000,
+      "displayType": "int",
+      "description": "The maximum number of tasks, across all jobs in the queue, which can be initialized concurrently. " +
+        "Once the queue's jobs exceed this limit they will be queued on disk.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.maximum-initialized-active-tasks-per-user",
+      "displayName": "Max initialized active tasks per user",
+      "value": '',
+      "defaultValue": 100000,
+      "displayType": "int",
+      "description": "The maximum number of tasks per-user, across all the of the user's jobs in the queue, which " +
+        "can be initialized concurrently. Once the user's jobs exceed this limit they will be queued on disk.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
+    },
+    {
+      "id": "conf-site",
+      "name": "mapred.capacity-scheduler.queue.<queue-name>.init-accept-jobs-factor",
+      "displayName": "Init accept jobs factor",
+      "value": '',
+      "defaultValue": 10,
+      "displayType": "int",
+      "description": "The multiple of (maximum-system-jobs * queue-capacity) used to determine the number of " +
+        "jobs which are accepted by the scheduler. The default value is 10. If number of jobs submitted to " +
+        "the queue exceeds this limit, job submission are rejected.",
+      "isVisible": true,
+      "isRequired": true,
+      "serviceName": "MAPREDUCE",
+      "category": "CapacityScheduler",
+      "isQueue": true,
+      "filename": 'capacity-scheduler.xml'
     }
   ]
\ No newline at end of file

Added: incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll1.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll1.js?rev=1465166&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll1.js (added)
+++ incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll1.js Sat Apr  6 01:55:42 2013
@@ -0,0 +1,56 @@
+module.exports = {
+  "href": "http://localhost:8080/api/clusters/mycluster/requests/1",
+  "Requests": {
+    "id": 1
+  },
+  "tasks": [
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/1",
+      "Tasks": {
+        "id": "1",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "DATANODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/2",
+      "Tasks": {
+        "id": "2",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "NAMENODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/3",
+      "Tasks": {
+        "id": "3",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "SECONDARY_NAMENODE",
+        "stderr": "",
+        "host_name": "host2",
+        "stage_id": "1"
+      }
+    }
+  ]
+}

Added: incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll2.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll2.js?rev=1465166&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll2.js (added)
+++ incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll2.js Sat Apr  6 01:55:42 2013
@@ -0,0 +1,56 @@
+module.exports = {
+  "href": "http://localhost:8080/api/clusters/mycluster/requests/1",
+  "Requests": {
+    "id": 1
+  },
+  "tasks": [
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/1",
+      "Tasks": {
+        "id": "1",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "IN_PROGRESS",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "DATANODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/2",
+      "Tasks": {
+        "id": "2",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "NAMENODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/3",
+      "Tasks": {
+        "id": "3",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "SECONDARY_NAMENODE",
+        "stderr": "",
+        "host_name": "host2",
+        "stage_id": "1"
+      }
+    }
+  ]
+}

Added: incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll3.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll3.js?rev=1465166&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll3.js (added)
+++ incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll3.js Sat Apr  6 01:55:42 2013
@@ -0,0 +1,56 @@
+module.exports = {
+  "href": "http://localhost:8080/api/clusters/mycluster/requests/1",
+  "Requests": {
+    "id": 1
+  },
+  "tasks": [
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/1",
+      "Tasks": {
+        "id": "1",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "DATANODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/2",
+      "Tasks": {
+        "id": "2",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "IN_PROGRESS",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "NAMENODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/3",
+      "Tasks": {
+        "id": "3",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "QUEUED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "SECONDARY_NAMENODE",
+        "stderr": "",
+        "host_name": "host2",
+        "stage_id": "1"
+      }
+    }
+  ]
+}

Added: incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll4.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll4.js?rev=1465166&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll4.js (added)
+++ incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll4.js Sat Apr  6 01:55:42 2013
@@ -0,0 +1,56 @@
+module.exports = {
+  "href": "http://localhost:8080/api/clusters/mycluster/requests/1",
+  "Requests": {
+    "id": 1
+  },
+  "tasks": [
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/1",
+      "Tasks": {
+        "id": "1",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "DATANODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/2",
+      "Tasks": {
+        "id": "2",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "NAMENODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/3",
+      "Tasks": {
+        "id": "3",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "IN_PROGRESS",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "SECONDARY_NAMENODE",
+        "stderr": "",
+        "host_name": "host2",
+        "stage_id": "1"
+      }
+    }
+  ]
+}

Added: incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll5.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll5.js?rev=1465166&view=auto
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll5.js (added)
+++ incubator/ambari/trunk/ambari-web/app/data/mock/step14PolledData/tasks_poll5.js Sat Apr  6 01:55:42 2013
@@ -0,0 +1,56 @@
+module.exports = {
+  "href": "http://localhost:8080/api/clusters/mycluster/requests/1",
+  "Requests": {
+    "id": 1
+  },
+  "tasks": [
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/1",
+      "Tasks": {
+        "id": "1",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "DATANODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/2",
+      "Tasks": {
+        "id": "2",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "NAMENODE",
+        "stderr": "",
+        "host_name": "localhost.localdomain",
+        "stage_id": "1"
+      }
+    },
+    {
+      "href": "http://localhost:8080/api/clusters/mycluster/requests/1/tasks/3",
+      "Tasks": {
+        "id": "3",
+        "attempt_cnt": "0",
+        "exit_code": "999",
+        "stdout": "",
+        "status": "COMPLETED",
+        "command": "INSTALL",
+        "start_time": "-1",
+        "role": "SECONDARY_NAMENODE",
+        "stderr": "",
+        "host_name": "host2",
+        "stage_id": "1"
+      }
+    }
+  ]
+}

Modified: incubator/ambari/trunk/ambari-web/app/data/review_configs.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/review_configs.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/review_configs.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/review_configs.js Sat Apr  6 01:55:42 2013
@@ -119,12 +119,12 @@ module.exports = [
           Ember.Object.create({
             display_name: 'Server',
             component_value: ''
-          })
+          }),
           // TODO: uncomment when ready to integrate with database other than Derby
-          // Ember.Object.create({
-          //   display_name: 'Database',
-          //   component_value: ''
-          // })
+          Ember.Object.create({
+             display_name: 'Database',
+             component_value: ''
+          })
         ]
       }),
       Ember.Object.create({
@@ -169,6 +169,16 @@ module.exports = [
 
           })
         ]
+      }),
+      Ember.Object.create({
+        service_name: 'HUE',
+        display_name: 'Hue',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Server',
+            component_value: ''
+          })
+        ]
       })
 
     ]

Modified: incubator/ambari/trunk/ambari-web/app/data/service_components.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/service_components.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/service_components.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/service_components.js Sat Apr  6 01:55:42 2013
@@ -257,5 +257,13 @@ module.exports = new Ember.Set([
     isMaster: false,
     isClient: true,
     description: ''
+  },
+  {
+    service_name: 'HUE',
+    component_name: 'HUE_SERVER',
+    display_name: 'Hue Server',
+    isMaster: true,
+    isClient: false,
+    description: ''
   }
 ]);
\ No newline at end of file

Modified: incubator/ambari/trunk/ambari-web/app/data/service_configs.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/service_configs.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/service_configs.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/service_configs.js Sat Apr  6 01:55:42 2013
@@ -17,7 +17,7 @@
  */
 
 var App = require('app');
-require('models/service_config')
+require('models/service_config');
 
 var configProperties = App.ConfigProperties.create();
 
@@ -27,14 +27,15 @@ module.exports = [
     displayName: 'HDFS',
     filename: 'hdfs-site',
     configCategories: [
-      App.ServiceConfigCategory.create({ name: 'NameNode', displayName : 'NameNode'}),
-      App.ServiceConfigCategory.create({ name: 'SNameNode', displayName : 'Secondary Name Node'}),
-      App.ServiceConfigCategory.create({ name: 'DataNode', displayName : 'DataNode'}),
+      App.ServiceConfigCategory.create({ name: 'NameNode', displayName : 'NameNode', hostComponentNames : ['NAMENODE']}),
+      App.ServiceConfigCategory.create({ name: 'SNameNode', displayName : 'Secondary Name Node', hostComponentNames : ['SECONDARY_NAMENODE']}),
+      App.ServiceConfigCategory.create({ name: 'DataNode', displayName : 'DataNode', hostComponentNames : ['DATANODE']}),
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedCoreSite', displayName : 'Custom core-site.xml', siteFileName: 'core-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHDFSSite', displayName : 'Custom hdfs-site.xml', siteFileName: 'hdfs-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'core-site', 'hdfs-site'],
     configs: configProperties.filterProperty('serviceName', 'HDFS')
   },
 
@@ -43,13 +44,14 @@ module.exports = [
     displayName: 'MapReduce',
     filename: 'mapred-site',
     configCategories: [
-      App.ServiceConfigCategory.create({ name: 'JobTracker', displayName : 'JobTracker'}),
-      App.ServiceConfigCategory.create({ name: 'TaskTracker', displayName : 'TaskTracker'}),
+      App.ServiceConfigCategory.create({ name: 'JobTracker', displayName : 'JobTracker', hostComponentNames : ['JOBTRACKER']}),
+      App.ServiceConfigCategory.create({ name: 'TaskTracker', displayName : 'TaskTracker', hostComponentNames : ['TASKTRACKER']}),
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
-      App.ServiceConfigCategory.create({ name: 'Capacity Scheduler', displayName : 'Capacity Scheduler'}),
+      App.ServiceConfigCategory.create({ name: 'CapacityScheduler', displayName : 'Capacity Scheduler', isCustomView: true, siteFileName: 'capacity-scheduler.xml', siteFileNames: ['capacity-scheduler.xml', 'mapred-queue-acls.xml'], canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedMapredSite', displayName : 'Custom mapred-site.xml', siteFileName: 'mapred-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'core-site', 'mapred-site', 'capacity-scheduler', 'mapred-queue-acls'],
     configs: configProperties.filterProperty('serviceName', 'MAPREDUCE')
   },
 
@@ -62,6 +64,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHiveSite', displayName : 'Custom hive-site.xml', siteFileName: 'hive-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'hive-site'],
     configs: configProperties.filterProperty('serviceName', 'HIVE')
   },
 
@@ -73,6 +76,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedWebHCatSite', displayName : 'Custom webhcat-site.xml', siteFileName: 'webhcat-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'webhcat-site'],
     configs: configProperties.filterProperty('serviceName', 'WEBHCAT')
   },
 
@@ -87,6 +91,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHbaseSite', displayName : 'Custom hbase-site.xml', siteFileName: 'hbase-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'hbase-site'],
     configs: configProperties.filterProperty('serviceName', 'HBASE')
   },
 
@@ -97,6 +102,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'ZooKeeper Server', displayName : 'ZooKeeper Server'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'})
     ],
+    sites: ['global'],
     configs: configProperties.filterProperty('serviceName', 'ZOOKEEPER')
   },
 
@@ -109,6 +115,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedOozieSite', displayName : 'Custom oozie-site.xml', siteFileName: 'oozie-site.xml', canAddProperty: true})
     ],
+    sites: ['global', 'oozie-site'],
     configs: configProperties.filterProperty('serviceName', 'OOZIE')
   },
 
@@ -118,16 +125,29 @@ module.exports = [
     configCategories: [
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'})
     ],
+    sites: ['global'],
     configs: configProperties.filterProperty('serviceName', 'NAGIOS')
   },
 
   {
+    serviceName: 'HUE',
+    displayName: 'Hue',
+    filename: 'hue-site',
+    configCategories: [
+      App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'})
+    ],
+    sites: ['hue-site'],
+    configs: configProperties.filterProperty('serviceName', 'HUE')
+  },
+
+  {
     serviceName: 'MISC',
     displayName: 'Misc',
     configCategories: [
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Users and Groups', displayName : 'Users and Groups'})
     ],
+    sites: ['global'],
     configs: configProperties.filterProperty('serviceName', 'MISC')
   }
 

Modified: incubator/ambari/trunk/ambari-web/app/data/services.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/services.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/services.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/services.js Sat Apr  6 01:55:42 2013
@@ -101,4 +101,11 @@ module.exports = [
     isSelected: true,
     isHidden: true
   },
+  {
+    serviceName: 'HUE',
+    displayName: 'Hue',
+    isDisabled: false,
+    isSelected: true,
+    isHidden: false
+  }
 ]
\ No newline at end of file

Modified: incubator/ambari/trunk/ambari-web/app/initialize.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/initialize.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/initialize.js (original)
+++ incubator/ambari/trunk/ambari-web/app/initialize.js Sat Apr  6 01:55:42 2013
@@ -33,6 +33,7 @@ require('router');
 
 require('utils/ajax');
 require('utils/updater');
+require('utils/config');
 
 require('mappers/server_data_mapper');
 require('mappers/status_mapper');

Modified: incubator/ambari/trunk/ambari-web/app/mappers/cluster_mapper.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/mappers/cluster_mapper.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/mappers/cluster_mapper.js (original)
+++ incubator/ambari/trunk/ambari-web/app/mappers/cluster_mapper.js Sat Apr  6 01:55:42 2013
@@ -25,6 +25,31 @@ App.clusterMapper = App.QuickDataMapper.
         var result = json;
         result = this.parseIt(result, this.config);
         App.store.load(this.get('model'), result);
+        
+        var cluster = App.Cluster.find(result.id);
+        var clusterDesiredConfigs = [];
+        // Create desired_configs_array
+        if(json.Clusters.desired_configs){
+          for(var site in json.Clusters.desired_configs){
+            var tag = json.Clusters.desired_configs[site].tag;
+            var configObj = App.ConfigSiteTag.create({
+              site: site,
+              tag: tag,
+              hostOverrides: {}
+            });
+            if(json.Clusters.desired_configs[site].host_overrides!=null){
+              var hostOverridesArray = {};
+              json.Clusters.desired_configs[site].host_overrides.forEach(function(override){
+                var hostname = override.host_name;
+                var tag = override.tag;
+                hostOverridesArray[hostname] = tag;
+              });
+              configObj.set('hostOverrides', hostOverridesArray);
+            }
+            clusterDesiredConfigs.push(configObj);
+          }
+        }
+        cluster.set('desiredConfigs', clusterDesiredConfigs);
       }
     },
     config : {
@@ -36,5 +61,4 @@ App.clusterMapper = App.QuickDataMapper.
       $racks: [1],
       max_hosts_per_rack: 'Clusters.max_hosts_per_rack'
     }
-
 });

Modified: incubator/ambari/trunk/ambari-web/app/mappers/dataset_mapper.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/mappers/dataset_mapper.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/mappers/dataset_mapper.js (original)
+++ incubator/ambari/trunk/ambari-web/app/mappers/dataset_mapper.js Sat Apr  6 01:55:42 2013
@@ -17,15 +17,15 @@
  */
 
 App.dataSetMapper = App.QuickDataMapper.create({
-  model: App.DataSet,
+  model: App.Dataset,
   Jobs_model: App.DataSetJob,
   config: {
     id: 'id', // approach 2 : to be calculated (TBC1)
     name: 'Feeds.name', // from json
     source_cluster_name: 'Feeds.clusters.cluster[0].name', // approach1 : from json
-    target_cluster_name: 'target_cluster_name', // approach 2 : to be calculated (TBC2)
+    $target_cluster: 'none', // will be loaded outside parser ( TBC2 ),
     source_dir: 'Feeds.locations.location.path',
-    schedule: 'Feeds.frequency',
+    $schedule_id: 'none', // will be loaded outside parser
     dataset_jobs: 'dataset_jobs', // TBC3 ( set of ids will be added )
 
     // all below are unknown at present and may be blank
@@ -40,12 +40,66 @@ App.dataSetMapper = App.QuickDataMapper.
   jobs_config: {
     $dataset_id: 'none', // will be loaded outside parser
     id: 'Instances.id',
-    start_date: 'start_date_str',
-    end_date: 'end_date_str',
+    start_date: 'start_date',
+    end_date: 'end_date',
     duration: 'duration'
     //data: 'Instances.details'
   },
 
+  schedule_config: {
+    $dataset_id: 'none', // will be loaded outside parser
+    id: 'id',
+    start_date : 'start_date',
+    end_date :  'end_date',
+    start_time : 'start_time',
+    end_time : 'end_time',
+    timezone : 'timezone',
+    frequency : 'frequency'
+  },
+
+  loadSchedule: function (datasetItemFromJson) {
+    var schedule = {};
+    schedule.id = datasetItemFromJson.id;
+    var source_cluster = datasetItemFromJson.Feeds.clusters.cluster.findProperty("type", "source");
+    var start_date = new Date(source_cluster.validity.start);
+    var end_date = new Date(source_cluster.validity.end);
+
+    var d = new Date();
+    console.debug(d.toString());
+    var start_mm = start_date.getMonth() + 1; // In future may consider using getUTCMonth()
+    var start_dd = start_date.getDay();
+    var start_yyyy = start_date.getFullYear();
+    var end_mm = end_date.getMonth() + 1;
+    var end_dd = end_date.getDay();
+    var end_yyyy = end_date.getFullYear();
+
+    schedule.start_date = start_mm + "/" + start_dd + "/" + start_yyyy;
+    schedule.end_date = end_mm + "/" + end_dd + "/" + end_yyyy;
+
+    var start_hh = start_date.getHours();
+    var start_mi = start_date.getMinutes();
+    var start_ampm = (start_hh < 12 ? 'AM' : 'PM');
+    var end_hh = end_date.getHours();
+    var end_mi = end_date.getMinutes();
+    var end_ampm = (end_hh < 12 ? 'AM' : 'PM');
+
+    if (start_hh) {
+      start_hh %= 12;
+    }
+
+    if (end_hh) {
+      end_hh %= 12;
+    }
+
+    schedule.start_time = start_hh + ":" + start_mi + ":" + start_ampm;
+    schedule.end_time = end_hh + ":" + end_mi + ":" + end_ampm;
+
+    schedule.frequency = datasetItemFromJson.Feeds.frequency;
+    schedule.timezone = datasetItemFromJson.Feeds.timezone;
+    schedule.dataset_id = datasetItemFromJson.id;
+
+    App.store.load(App.Dataset.Schedule, schedule);
+  },
   map: function (json) {
     if (!this.get('model')) {
       return;
@@ -59,9 +113,6 @@ App.dataSetMapper = App.QuickDataMapper.
           var re = new RegExp(" ", "g");
           item.id = item.Feeds.name.replace(re, "_");
 
-          // TBC2
-          item.target_cluster_name = (item.Feeds.clusters.cluster.findProperty("type", "target")).name;
-
           // TBC3
           item.dataset_jobs = [];
 
@@ -107,14 +158,29 @@ App.dataSetMapper = App.QuickDataMapper.
           item.target_dir = '';
 
           var newitem = this.parseIt(item, this.config);
+
+          // TBC2 - but shd be loaded after parsing
+          var target_cluster_name = (item.Feeds.clusters.cluster.findProperty("type", "target")).name;
+          var target_cluster_id = (item.Feeds.clusters.cluster.findProperty("type", "target")).name;
+          var re = new RegExp(" ","g");
+
+          newitem.target_cluster_id = target_cluster_id.replace(re,"_");
+
+          newitem.schedule_id = newitem.id;
+
+          this.loadSchedule(item);
+
           dataset_results.push(newitem);
         } catch (ex) {
           console.debug('Exception occured : ' + ex);
         }
       }, this);
-      console.debug('Before load: App.DataSet.find().content : ' + App.DataSet.find().content);
+
+
+
+      console.debug('Before load: App.Dataset.find().content : ' + App.Dataset.find().content);
       App.store.loadMany(this.get('model'), dataset_results);
-      console.debug('After load: App.DataSet.find().content : ' + App.DataSet.find().content);
+      console.debug('After load: App.Dataset.find().content : ' + App.Dataset.find().content);
 
       try {
         // Child records
@@ -123,12 +189,9 @@ App.dataSetMapper = App.QuickDataMapper.
           item.instances.forEach(function (instance) {
             instance.Instances.start = new Date(instance.Instances.start); // neeed to be calulated end -start
             instance.Instances.end = new Date(instance.Instances.end); // neeed to be calulated end -start
-
-
             instance.duration = instance.Instances.end - instance.Instances.start;
-
-            instance.start_date_str = instance.Instances.start.toString();
-            instance.end_date_str = instance.Instances.end.toString();
+            instance.start_date = instance.Instances.start;
+            instance.end_date = instance.Instances.end;
 
             var result = this.parseIt(instance, this.jobs_config);
             result.dataset_id = item.id;

Modified: incubator/ambari/trunk/ambari-web/app/mappers/service_mapper.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/mappers/service_mapper.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/mappers/service_mapper.js (original)
+++ incubator/ambari/trunk/ambari-web/app/mappers/service_mapper.js Sat Apr  6 01:55:42 2013
@@ -30,7 +30,8 @@ App.servicesMapper = App.QuickDataMapper
     'NAGIOS',
     'ZOOKEEPER',
     'PIG',
-    'SQOOP'
+    'SQOOP',
+    'HUE'
   ],
   sortByOrder: function (sortOrder, array) {
     var sorted = [];
@@ -117,6 +118,7 @@ App.servicesMapper = App.QuickDataMapper
     work_status: 'HostRoles.state',
     desired_status: 'HostRoles.desired_state',
     component_name: 'HostRoles.component_name',
+    ha_status: 'HostRoles.ha_status',
     host_id: 'HostRoles.host_name',
     $service_id: 'none' /* will be set outside of parse function */
   },
@@ -176,10 +178,12 @@ App.servicesMapper = App.QuickDataMapper
 
       // Host components
       result = [];
+      var hostComponentToActualConfigsMap = {};
       json.items.forEach(function(item){
         item.components.forEach(function(component){
           var service = component.ServiceComponentInfo.service_name;
           component.host_components.forEach(function(host_component){
+            hostComponentToActualConfigsMap[host_component.id] = host_component.HostRoles.actual_configs;
             var comp = this.parseIt(host_component, this.config3);
             comp.service_id = service;
             result.push(comp);
@@ -192,8 +196,32 @@ App.servicesMapper = App.QuickDataMapper
       }, this);
 
       App.store.loadMany(this.get('model3'), result);
+      for(var hostComponentId in hostComponentToActualConfigsMap){
+        var hostComponentObj = App.HostComponent.find(hostComponentId);
+        var actualConfigs = [];
+        // Create actual_configs
+        for(var site in hostComponentToActualConfigsMap[hostComponentId]){
+          var tag = hostComponentToActualConfigsMap[hostComponentId][site].tag;
+          var configObj = App.ConfigSiteTag.create({
+            site: site,
+            tag: tag,
+            hostOverrides: {}
+          });
+          var overrides = hostComponentToActualConfigsMap[hostComponentId][site].host_overrides;
+          if(overrides!=null){
+            var hostOverridesArray = {};
+            overrides.forEach(function(override){
+              var hostname = override.host_name;
+              var tag = override.tag;
+              hostOverridesArray[hostname] = tag;
+            });
+            configObj.set('hostOverrides', hostOverridesArray);
+          }
+          actualConfigs.push(configObj);
+        }
+        hostComponentObj.set('actualConfigs', actualConfigs);
+      }
     }
-
     console.log('out service mapper.  Took ' + (new Date().getTime() - start) + 'ms');
   },
 

Modified: incubator/ambari/trunk/ambari-web/app/mappers/target_cluster_mapper.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/mappers/target_cluster_mapper.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/mappers/target_cluster_mapper.js (original)
+++ incubator/ambari/trunk/ambari-web/app/mappers/target_cluster_mapper.js Sat Apr  6 01:55:42 2013
@@ -36,7 +36,7 @@ App.targetClusterMapper = App.QuickDataM
         try {
           item.name_node_web_url = (item.Clusters.interfaces.interface.findProperty("type", "readonly")).endpoint;
           item.name_node_rpc_url = (item.Clusters.interfaces.interface.findProperty("type", "write")).endpoint;
-          //item.oozie_server_url = (item.Clusters.interfaces.interface.findProperty("type","workflow")).endpoint;
+          item.oozie_server_url = (item.Clusters.interfaces.interface.findProperty("type","workflow")).endpoint;
           item.id = item.Clusters.name;
 
           var re = new RegExp(" ", "g");

Modified: incubator/ambari/trunk/ambari-web/app/messages.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/messages.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/messages.js (original)
+++ incubator/ambari/trunk/ambari-web/app/messages.js Sat Apr  6 01:55:42 2013
@@ -39,6 +39,7 @@ Em.I18n.translations = {
   'more':'more',
   'yes':'Yes',
   'no':'No',
+  'add': 'Add',
 
 
   'common.learnMore':'Learn more',
@@ -79,6 +80,7 @@ Em.I18n.translations = {
   'common.metrics':'Metrics',
   'common.timeRange':'Time Range',
   'common.name':'Name',
+  'common.value':'Value',
   'common.ipAddress':'IP Address',
   'common.cpu':'CPU',
   'common.ram':'RAM',
@@ -97,6 +99,7 @@ Em.I18n.translations = {
   'common.maximum':'Maximum',
   'common.start':'Start',
   'common.stop':'Stop',
+  'common.pause':'Pause',
   'common.decommission':'Decommission',
   'common.recommission':'Recommission',
   'common.failure': 'Failure',
@@ -114,8 +117,30 @@ Em.I18n.translations = {
   'common.upgrade': 'Upgrade',
   'common.security':'Security',
   'common.cluster':'Cluster',
+  'common.add': 'Add',
+  'common.edit': 'Edit',
+  'common.delete': 'Delete',
+  'common.empty': 'Empty',
   'common.exception':'Exception',
   'common.undo':'Undo',
+  'common.details':'Details',
+  'common.stats':'Stats',
+  'common.abort': 'Abort',
+  'common.misc': 'Misc',
+
+  'requestInfo.installComponents':'Installing Host Components',
+  'requestInfo.installServices':'Installing Services',
+  'requestInfo.stopAllServices':'Stop All Services',
+  'requestInfo.startAllServices':'Start All Services',
+  'requestInfo.startHostComponent':'Start component',
+  'requestInfo.upgradeHostComponent':'Upgrade component',
+  'requestInfo.stopHostComponent':'Stop component',
+  'requestInfo.installHostComponent':'Install component',
+  'requestInfo.installingHostComponent':'Installing new component',
+  'requestInfo.stopService':'Stop Service',
+  'requestInfo.startService':'Start Service',
+  'requestInfo.serviceStartCheck':'Check Started Services',
+
 
   'hostPopup.noServicesToShow':'No services to show',
   'hostPopup.noHostsToShow':'No hosts to show',
@@ -205,7 +230,7 @@ Em.I18n.translations = {
   'installer.step2.header':'Install Options',
   'installer.step2.body':'Enter the list of hosts to be included in the cluster and provide your SSH key.',
   'installer.step2.targetHosts':'Target Hosts',
-  'installer.step2.targetHosts.info':'Enter a list of host names, one per line',
+  'installer.step2.targetHosts.info':'Enter a list of hosts using the Fully Qualified Domain Name (FQDN), one per line',
   'installer.step2.hostPattern.tooltip.title':'Pattern Expressions',
   'installer.step2.hostPattern.tooltip.content':'You can use pattern expressions to specify a number of target hosts. For example, to specify host01.domain thru host10.domain, enter host[01-10].domain in the target hosts textarea.',
   'installer.step2.hostName.error.required':'You must specify at least one host name',
@@ -305,8 +330,9 @@ Em.I18n.translations = {
   'installer.step5.reassign.header':'Select Target Host',
   'installer.step5.attention':' hosts not running master services',
   'installer.step5.body':'Assign master components to hosts you want to run them on.',
-  'installer.step5.body.hive':'<i class="icon-asterisks">&#10037</i> HiveServer2, Hive Metastore, and WebHCat Server will be co-hosted on the same server.',
+  'installer.step5.body.hive':'<i class="icon-asterisks">&#10037</i> HiveServer2, Hive Metastore, and WebHCat Server will be hosted on the same server.',
   'installer.step5.hostInfo':'%@ (%@, %@ cores)',
+  'installer.step5.hiveGroup':'HiveServer2, WebHCat Server, MySQL Server',
 
   'installer.step6.header':'Assign Slaves and Clients',
   'installer.step6.body':'Assign slave and client components to hosts you want to run them on.<br/>Hosts that are assigned master components are shown with <i class=icon-asterisks>&#10037</i>. <br/>&quot;Client&quot; will install ',
@@ -338,6 +364,8 @@ Em.I18n.translations = {
   'installer.step9.host.status.warning':'Warnings encountered',
   'installer.step9.host.status.failed':'Failures encountered',
   'installer.step9.host.status.nothingToInstall':'Waiting (Nothing to install)',
+  'installer.step9.hosts.status.label.inProgress':'In Progress',
+  'installer.step9.hosts.status.label.warning':'Warning',
   'installer.step9.hostLog.popup.header':'Tasks. executed on ',
   'installer.step9.hostLog.popup.categories.all':'All',
   'installer.step9.hostLog.popup.categories.pending':'Queued / Pending',
@@ -379,7 +407,7 @@ Em.I18n.translations = {
   'installer.step9.serviceStatus.abort.completed':' aborted successfully',
   'installer.step9.serviceStatus.abort.failed':' failed to abort',
   'installer.step9.serviceStatus.upgrade.pending':'Preparing to upgrade ',
-  'installer.step9.serviceStatus.upgrade.queued':'Waiting to upgarde ',
+  'installer.step9.serviceStatus.upgrade.queued':'Waiting to upgrade ',
   'installer.step9.serviceStatus.upgrade.inProgress':'Upgrading ',
   'installer.step9.serviceStatus.upgrade.completed':' upgraded successfully',
   'installer.step9.serviceStatus.upgrade.failed':' failed to upgrade',
@@ -430,6 +458,8 @@ Em.I18n.translations = {
   'installer.step14.status.success': 'Successfully reassigned {0}',
   'installer.step14.status.failed': 'Failed to reassign {0}',
   'installer.step14.status.info': 'Reassigning {0}. \nPlease wait while all tasks will be completed.',
+  'installer.step14.retry': 'You can click on the Retry or Abort button to retry failed task or abort changes',
+  'installer.step14.abortError': 'Error in aborting changes.',
 
   'installer.stackUpgrade.header':'Stack Upgrade Wizard',
   'installer.stackUpgrade.step1.newVersion':'New Version',
@@ -453,15 +483,18 @@ Em.I18n.translations = {
   "You can click on the Retry button to retry upgrading the failed components. Alternatively you can proceed and retry upgrade on individual components in the Host Detail page.",
   'installer.stackUpgrade.step3.status.failed':"Failed to upgrade hosts. Click on each host to see what might have gone wrong.\n After fixing the problem, click the Retry button",
   'installer.stackUpgrade.step3.host.nothingToUpgrade':'Waiting (Nothing to upgrade)',
-  'installer.stackUpgrade.step3.service.upgraded':'{0} upgraded',
-  'installer.stackUpgrade.step3.service.upgrading':'{0} upgrade in progress',
-  'installer.stackUpgrade.step3.service.pending':'{0} upgrade pending',
-  'installer.stackUpgrade.step3.service.failedUpgrade':'{0} failed to upgrade',
+  'installer.stackUpgrade.step3.service.upgraded':'Services upgraded',
+  'installer.stackUpgrade.step3.service.upgrading':'Services upgrade in progress',
+  'installer.stackUpgrade.step3.service.pending':'Services upgrade pending',
+  'installer.stackUpgrade.step3.service.failedUpgrade':'Services failed to upgrade',
   'installer.stackUpgrade.step3.service.stopped':'All Services stopped',
   'installer.stackUpgrade.step3.service.stopping':'All Services stopping',
   'installer.stackUpgrade.step3.service.stopFail':'All Services failed to stop',
+  'installer.stackUpgrade.step3.service.stopPending':'All Services stop pending',
   'installer.stackUpgrade.step3.retry.upgrade':'Retry Upgrade',
   'installer.stackUpgrade.step3.retry.services':'Retry stopping services',
+  'installer.stackUpgrade.step3.upgrade.header':'All Services upgrade',
+  'installer.stackUpgrade.step3.stop.header':'All Services stop',
 
   'form.create':'Create',
   'form.save':'Save',
@@ -560,6 +593,9 @@ Em.I18n.translations = {
   'admin.cluster.upgradeAvailable':'Upgrade available',
   'admin.cluster.upgradeUnavailable':'Upgrade unavailable',
 
+  'admin.misc.header': 'Service user accounts',
+  'admin.misc.nothingToShow': 'No user accounts to display',
+
   'services.service.start':'Start',
   'services.service.stop':'Stop',
   'services.service.summary.version':'Version',
@@ -602,6 +638,7 @@ Em.I18n.translations = {
   'services.service.actions.run.compaction':'Run Compaction',
   'services.service.actions.run.smoke':'Run Smoke Test',
   'services.service.actions.reassign.master':'Reassign {0}',
+  'services.service.actions.reassign.master.hive':'Reassign HiveServer2, WebHCat Server, MySQL Server',
   'services.service.actions.maintenance':'Maintenance',
   'services.service.summary.unknown':'unknown',
   'services.service.summary.notRunning':'Not Running',
@@ -692,19 +729,29 @@ Em.I18n.translations = {
   'services.service.info.summary.nagios.noAlerts':'No alerts',
   'services.service.info.summary.nagios.alerts':'Nagios service required for viewing alerts',
 
-  'services.service.config.startService':'Start Service',
+  'services.service.config.restartService':'Restart Service',
+  'services.service.config.restartService.TooltipMessage':'<b>Restart Service</b><br>Stale configuration used by {0} components on {1} hosts:{2}',
   'services.service.config.saveConfig':'Service configuration applied successfully',
   'services.service.config.stopService':'Stop Service',
   'services.service.config.msgServiceStop':'Stop the service and wait till it stops completely. Thereafter you can apply configuration changes',
   'services.service.config.msgHDFSMapRServiceStop':'Stop HDFS and MapReduce. Wait till both of them stops completely. Thereafter you can apply configuration changes',
   'services.service.config.failCreateConfig' : 'Failure in creating service configuration',
   'services.service.config.failSaveConfig':'Failure in applying service configuration',
+  'services.service.config.failSaveConfigHostExceptions':'Failure in applying service configuration host exceptions',
+  'services.service.config.addPropertyWindow.errorMessage':'This is required',
+  'services.service.config.addPropertyWindow.error.derivedKey':'Cannot add a known derived property',
 
   'services.add.header':'Add Service Wizard',
   'services.reassign.header':'Reassign Master Wizard',
   'services.service.add':'Add Service',
+  'services.service.startAll':'Start All',
+  'services.service.stopAll':'Stop All',
 
   /** services page constants **/
+
+  'service.hbase.activeMaster': 'Active Master',
+  'service.hbase.passiveMasters': 'and {0} Standby Masters',
+
   'services.hive.client': 'Hive Client',
   'services.hive.clients': 'Hive Clients',
 
@@ -712,6 +759,8 @@ Em.I18n.translations = {
   'services.oozie.clients': 'Oozie Clients',
   'services.oozie.webUi': 'Oozie Web UI',
 
+  'services.hue.webUi': 'Hue Web UI',
+
   'services.ganglia.webUi': 'Ganglia Web UI',
   'services.ganglia.monitors': 'Ganglia Monitors',
 
@@ -719,9 +768,43 @@ Em.I18n.translations = {
   'services.zookeeper.title': '{0} ZooKeepers',
   'services.zookeeper.postfix': 'running',
 
+  'services.mapReduce.config.addQueue':'Add Queue',
+  'services.mapReduce.config.editQueue':'Edit Queue',
+  'services.mapReduce.config.capacitySchedulerXml':'Custom capacity-scheduler.xml',
+  'services.mapReduce.config.queue.header':'Queues',
+  'services.mapReduce.config.queue.name':'Queue Name',
+  'services.mapReduce.config.queue.groups':'Groups',
+  'services.mapReduce.config.queue.capacity':'Capacity',
+  'services.mapReduce.config.queue.maxCapacity':'Max Capacity',
+  'services.mapReduce.config.queue.minUserLimit':'Min User Limit',
+  'services.mapReduce.config.queue.userLimitFactor':'User Limit Factor',
+  'services.mapReduce.config.queue.supportsPriority': 'Supports priority',
+  'services.mapReduce.config.queue.adminUsers':'Admin Users',
+  'services.mapReduce.config.queue.adminGroups':'Admin Groups',
+  'services.mapReduce.config.queue.maxActiveTasks':'Max active initialized tasks',
+  'services.mapReduce.config.queue.maxActiveTasksPerUser':'Max active initialized tasks per user',
+  'services.mapReduce.config.queue.initAcceptJobsFactor':'Init accept jobs factor',
+  'services.mapReduce.extraConfig.queue.name':'Queue name',
+  'services.mapReduce.description.queue.name':'Name of the queue',
+  'services.mapReduce.description.queue.submit.user':"Comma separated list of usernames that are allowed to submit jobs to the queue. " +
+    "If set to the special value '*', it means all users are allowed to submit jobs.",
+  'services.mapReduce.description.queue.admin.user':"Comma separated list of usernames that are allowed to delete jobs or modify job's priority for " +
+    "jobs not owned by the current user in the queue.  If set to the special value '*', it means all users are " +
+    "allowed to do this operation.",
+  'services.mapReduce.description.queue.submit.group':'Comma separated list of group names that are allowed to submit jobs to the queue.',
+  'services.mapReduce.description.queue.admin.group':"Comma separated list of group names that are allowed to delete jobs or modify job's priority " +
+    "for jobs not owned by the current user in the queue.",
+
+  'services.hbase.master.error':'None of the HBase masters is active',
+
   'hosts.host.add':'Add New Hosts',
   'hosts.host.back':'Back to Hosts',
   'hosts.table.noHosts':'No hosts to display',
+  
+  'hosts.selectHostsDialog.title': 'Select Exception Hosts',
+  'hosts.selectHostsDialog.message': 'Select hosts where the exception has to be applied',
+  'hosts.selectHostsDialog.filter.placeHolder': 'Filter...',
+  'hosts.selectHostsDialog.selectedHostsLink': '{0} out of {1} hosts selected',
 
   'hosts.host.metrics.cpu':'CPU Usage',
   'hosts.host.metrics.cpu.displayNames.cpu_wio':'CPU I/O Idle',
@@ -768,6 +851,7 @@ Em.I18n.translations = {
   'hosts.host.healthStatus.heartBeatNotReceived':'The server has not received a heartbeat from this host for more than 3 minutes.',
   'hosts.host.healthStatus.mastersDown':"The following master components are down:\n",
   'hosts.host.healthStatus.slavesDown':"The following slave components are down:\n",
+  'hosts.host.healthStatus.allUp':'All components are up',
   'hosts.host.healthStatusCategory.green': "Healthy",
   'hosts.host.healthStatusCategory.red': "Master Down",
   'hosts.host.healthStatusCategory.orange': "Slave Down",
@@ -953,23 +1037,59 @@ Em.I18n.translations = {
   'apps.isRunning.popup.title':'Is running',
   'apps.isRunning.popup.content':'Job is running now',
 
+  'mirroring.dataset.createNewDataset':'Create New Dataset',
+  'mirroring.dataset.newDataset':'New Dataset',
+  'mirroring.dataset.editDataset':'Edit Dataset',
+  'mirroring.dataset.selectTargetClusters':'Select Target Cluster...',
+  'mirroring.dataset.name':'Name',
+  'mirroring.dataset.save': 'Save & Run',
+  'mirroring.dataset.sourceDir':'Source Cluster Directory',
+  'mirroring.dataset.target':'Target',
+  'mirroring.dataset.source':'Source',
+  'mirroring.dataset.avgData':'Avg. Data',
+  'mirroring.dataset.dateCreated':'Date Created',
+  'mirroring.dataset.targetDir':'Target Cluster Directory',
+  'mirroring.dataset.schedule':'Schedule',
+  'mirroring.dataset.schedule.to':'to',
+  'mirroring.dataset.schedule.repeatEvery':'Repeat every ',
+  'mirroring.dataset.addTargetCluster':'Add Target Cluster',
+  'mirroring.dataset.toggle.active':'Activate',
+  'mirroring.dataset.toggle.suspended':'Suspend',
+
+  'mirroring.targetcluster.addCluster':'Add Cluster',
+  'mirroring.targetcluster.testConnection':'Test Connection',
+  'mirroring.targetcluster.enterClusterName':'Name of the Target Cluster',
+
   'mirroring.table.noDatasets':'No datasets to display',
   'mirroring.table.datasetSource':'Dataset Source',
   'mirroring.table.lastSuccess':'Last Success',
   'mirroring.table.lastFail':'Last Fail',
   'mirroring.table.lastDuration':'Last Duration',
   'mirroring.table.avgData':'Avg Data',
+  'mirroring.table.noJobs':'No jobs to display',
+  'mirroring.table.jobId':'Job ID',
+  'mirroring.table.start':'Start',
+  'mirroring.table.end':'End',
+  'mirroring.table.duration':'Duration',
+  'mirroring.table.data':'Data',
+
+  'mirroring.sidebar.header.history': 'History',
+  'mirroring.sidebar.header.clusters': 'Target Clusters',
+  'mirroring.sidebar.popup.clusters.header': 'Cluster management',
+  'mirroring.sidebar.popup.clusters.body': 'Here will be some content',
+
 
   'menu.item.dashboard':'Dashboard',
   'menu.item.heatmaps':'Heatmaps',
   'menu.item.services':'Services',
   'menu.item.hosts':'Hosts',
-  'menu.item.jobs':'Jobs',
   'menu.item.mirroring':'Mirroring',
+  'menu.item.jobs':'Jobs',
   'menu.item.admin':'Admin',
 
   'common.combobox.placeholder': 'Filter...',
-  'common.combobox.dropdown.1': 'Modified properties',
-  'common.combobox.dropdown.2': 'Properties needing restart',
+  'common.combobox.dropdown.1': 'Overridden properties',
+  'common.combobox.dropdown.2': 'Modified properties',
+  'common.combobox.dropdown.3': 'Properties needing restart'
 
-};
+};
\ No newline at end of file

Modified: incubator/ambari/trunk/ambari-web/app/models/cluster.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/cluster.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/cluster.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/cluster.js Sat Apr  6 01:55:42 2013
@@ -25,7 +25,12 @@ App.Cluster = DS.Model.extend({
   version: DS.attr('string'),
   hosts: DS.hasMany('App.Host'),
   racks: DS.hasMany('App.Rack'),
-  maxHostsPerRack: DS.attr('number')
+  maxHostsPerRack: DS.attr('number'),
+  /**
+   * Array containing desired configs. New array
+   * should be set by instances of class.
+   */
+  desiredConfigs: null
 });
 
 App.Cluster.FIXTURES = [/*

Modified: incubator/ambari/trunk/ambari-web/app/models/cluster_states.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/cluster_states.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/cluster_states.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/cluster_states.js Sat Apr  6 01:55:42 2013
@@ -19,7 +19,10 @@ var App = require('app');
 
 App.clusterStatus = Ember.Object.create({
   clusterName: '',
-  validStates: ['CLUSTER_NOT_CREATED_1', 'CLUSTER_DEPLOY_PREP_2', 'CLUSTER_INSTALLING_3', 'SERVICE_STARTING_3', 'CLUSTER_INSTALLED_4',  'CLUSTER_STARTED_5', 'ADD_HOSTS_DEPLOY_PREP_2', 'ADD_HOSTS_INSTALLING_3', 'ADD_HOSTS_INSTALLED_4', 'ADD_HOSTS_COMPLETED_5'],
+  validStates: ['CLUSTER_NOT_CREATED_1', 'CLUSTER_DEPLOY_PREP_2', 'CLUSTER_INSTALLING_3', 'SERVICE_STARTING_3', 'CLUSTER_INSTALLED_4',  'CLUSTER_STARTED_5',
+    'ADD_HOSTS_DEPLOY_PREP_2', 'ADD_HOSTS_INSTALLING_3', 'ADD_HOSTS_INSTALLED_4', 'ADD_HOSTS_COMPLETED_5',
+    'ADD_SERVICES_DEPLOY_PREP_2', 'ADD_SERVICES_INSTALLING_3', 'ADD_SERVICES_INSTALLED_4', 'ADD_SERVICES_COMPLETED_5',
+    'STOPPING_SERVICES', 'STACK_UPGRADING', 'STACK_UPGRADE_FAILED', 'STACK_UPGRADED', 'STACK_UPGRADE_COMPLETED'],
   clusterState: 'CLUSTER_NOT_CREATED_1',
   wizardControllerName: null,
   localdb: null,

Modified: incubator/ambari/trunk/ambari-web/app/models/dataset.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/dataset.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/dataset.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/dataset.js Sat Apr  6 01:55:42 2013
@@ -19,25 +19,46 @@
 
 var App = require('app');
 
-App.DataSet = DS.Model.extend({
+App.Dataset = DS.Model.extend({
   id: DS.attr('string'),
   name: DS.attr('string'),
   sourceClusterName: DS.attr('string'),
-  targetClusterName: DS.attr('string'),
+  targetCluster: DS.belongsTo('App.TargetCluster'),
   sourceDir: DS.attr('string'),
   targetDir: DS.attr('string'),
-  schedule: DS.attr('string'),
+  schedule: DS.belongsTo('App.Dataset.Schedule'),
   lastSucceededDate: DS.attr('number'),
   lastFailedDate: DS.attr('number'),
   lastDuration: DS.attr('number'),
   avgData: DS.attr('string'),
   createdDate: DS.attr('string'),
   datasetJobs: DS.hasMany('App.DataSetJob')
+});
+
 
+App.Dataset.Schedule = DS.Model.extend({
+  id: DS.attr('string'),
+  startDate : DS.attr('string'),
+  endDate :  DS.attr('string'),
+  startTime : DS.attr('string'),
+  endTime : DS.attr('string'),
+  timezone : DS.attr('string'),
+  frequency : DS.attr('string'),
+  dataset : DS.belongsTo('App.Dataset')
 });
 
+App.Dataset.FIXTURES = [/*
+ {
+ id: 1,
+ cluster_name: 'cluster1',
+ stack_name: 'HDP',
+ hosts: [1, 2, 3, 4],
+ racks: [1, 2, 3, 4, 5, 6],
+ max_hosts_per_rack: 10
+ }*/
+];
 
-App.DataSet.FIXTURES = [/*
+App.Dataset.Schedule.FIXTURES = [/*
  {
  id: 1,
  cluster_name: 'cluster1',

Modified: incubator/ambari/trunk/ambari-web/app/models/dataset_job.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/dataset_job.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/dataset_job.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/dataset_job.js Sat Apr  6 01:55:42 2013
@@ -18,12 +18,16 @@
 
 
 var App = require('app');
+var date = require('utils/date');
 
 App.DataSetJob = DS.Model.extend({
-  dataset: DS.belongsTo('App.DataSet'),
-  startDate: DS.attr('string'),
-  endDate: DS.attr('string'),
-  duration: DS.attr('string')
+  dataset: DS.belongsTo('App.Dataset'),
+  startDate: DS.attr('number'),
+  endDate: DS.attr('number'),
+  duration: DS.attr('number'),
+  startDateFormatted: function() {
+    return date.dateFormatShort(this.get('startDate'));
+  }.property('startDate')
   //data : DS.attr('string')
 });
 

Modified: incubator/ambari/trunk/ambari-web/app/models/host.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/host.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/host.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/host.js Sat Apr  6 01:55:42 2013
@@ -187,6 +187,9 @@ App.Host = DS.Model.extend({
           output += (index == (hostComponents.length-1)) ? hc.get('displayName') : (hc.get('displayName')+", ");
         }, this);
         break;
+      case 'health-status-LIVE':
+        output = Em.I18n.t('hosts.host.healthStatus.allUp');
+        break;
     }
     return output;
   }.property('healthClass')

Modified: incubator/ambari/trunk/ambari-web/app/models/host_component.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/host_component.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/host_component.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/host_component.js Sat Apr  6 01:55:42 2013
@@ -21,8 +21,10 @@ var App = require('app');
 App.HostComponent = DS.Model.extend({
   workStatus: DS.attr('string'),
   componentName: DS.attr('string'),
+  haStatus: DS.attr('string'),
   host: DS.belongsTo('App.Host'),
   service: DS.belongsTo('App.Service'),
+  actualConfigs: null,
   isClient:function () {
     if(['PIG', 'SQOOP', 'HCAT'].contains(this.get('componentName'))){
       return true;
@@ -51,6 +53,7 @@ App.HostComponent = DS.Model.extend({
       case 'GANGLIA_SERVER':
       case 'OOZIE_SERVER':
       case 'WEBHCAT_SERVER':
+      case 'HUE_SERVER':
         return true;
       default:
         return false;
@@ -98,6 +101,7 @@ App.HostComponentStatus = {
   start_failed: "START_FAILED",
   install_failed: "INSTALL_FAILED",
   installing: "INSTALLING",
+  upgrade_failed: "UPGRADE_FAILED",
 
   getKeyName:function(value){
     switch(value){
@@ -117,6 +121,8 @@ App.HostComponentStatus = {
         return 'install_failed';
       case this.installing:
         return 'installing';
+      case this.upgrade_failed:
+        return 'upgrade_failed';
     }
     return 'none';
   }

Modified: incubator/ambari/trunk/ambari-web/app/models/service.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/service.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/service.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/service.js Sat Apr  6 01:55:42 2013
@@ -28,6 +28,7 @@ App.Service = DS.Model.extend({
   alerts: DS.hasMany('App.Alert'),
   quickLinks: DS.hasMany('App.QuickLinks'),
   hostComponents: DS.hasMany('App.HostComponent'),
+  serviceConfigsTemplate: require('data/service_configs'),
   isStartDisabled: function () {
     return !(this.get('healthStatus') == 'red');
   }.property('healthStatus'),
@@ -98,11 +99,14 @@ App.Service = DS.Model.extend({
       "MAPREDUCE",
       "HBASE",
       "OOZIE",
+      "GANGLIA",
+      "NAGIOS",
       "HIVE",
       "WEBHCAT",
       "ZOOKEEPER",
       "PIG",
-      "SQOOP"
+      "SQOOP",
+      "HUE"
     ];
     return maintainedServices.contains(this.get('serviceName'));
   }.property('serviceName'),
@@ -118,7 +122,8 @@ App.Service = DS.Model.extend({
       "ZOOKEEPER",
       "PIG",
       "SQOOP",
-      "NAGIOS"
+      "NAGIOS",
+      "HUE"
     ];
     return configurableServices.contains(this.get('serviceName'));
   }.property('serviceName'),
@@ -149,9 +154,88 @@ App.Service = DS.Model.extend({
         return 'Ganglia';
       case 'nagios':
         return 'Nagios';
+      case 'hue':
+        return 'Hue';
     }
     return this.get('serviceName');
-  }.property('serviceName')
+  }.property('serviceName'),
+  
+  /**
+   * For each host-component, if the desired_configs dont match the
+   * actual_configs, then a restart is required. Except for Global site
+   * properties, which need to be checked with map.
+   */
+  isRestartRequired: function () {
+    var restartRequired = false;
+    var restartRequiredHostsAndComponents = {};
+    var clusterDesiredConfigs = App.router.get('mainServiceController.cluster.desiredConfigs');
+    var serviceTemplate = this.serviceConfigsTemplate.findProperty('serviceName', this.get('serviceName'));
+    if (clusterDesiredConfigs != null && serviceTemplate!=null) {
+      var clusterToDesiredMap = {};
+      clusterDesiredConfigs.forEach(function (config) {
+        clusterToDesiredMap[config.site] = config;
+      });
+      this.get('hostComponents').forEach(function(hostComponent){
+        var host = hostComponent.get('host');
+        var hostName = host.get('hostName');
+        hostComponent.get('actualConfigs').forEach(function(config){
+          if(serviceTemplate.sites.contains(config.site)){
+            var desiredClusterTag = clusterToDesiredMap[config.site].tag;
+            var desiredHostOverrideTag = clusterToDesiredMap[config.site].hostOverrides[hostName];
+            var actualClusterTag = config.tag;
+            var actualHostOverrideTag = config.hostOverrides[hostName];
+            if(actualClusterTag !== desiredClusterTag || actualHostOverrideTag !== desiredHostOverrideTag){
+              var publicHostName = host.get('publicHostName');
+              if(!(publicHostName in restartRequiredHostsAndComponents)){
+                restartRequiredHostsAndComponents[publicHostName] = [];
+              }
+              var hostComponentName = hostComponent.get('displayName');
+              if(restartRequiredHostsAndComponents[publicHostName].indexOf(hostComponentName)<0){
+                restartRequiredHostsAndComponents[publicHostName].push(hostComponentName);
+              }
+              restartRequired = true;
+            }
+          }
+        });
+      });
+    }
+    this.set('restartRequiredHostsAndComponents', restartRequiredHostsAndComponents);
+    return restartRequired;
+  }.property('serviceName', 'hostComponents', 'hostComponents.@each.actualConfigs', 'hostComponents.@each.actualConfigs.@each.tag', 
+      'App.router.mainServiceController.cluster.desiredConfigs', 'App.router.mainServiceController.cluster.desiredConfigs.@each.tag'),
+  
+  /**
+   * Contains a map of which hosts and host_components
+   * need a restart. This is populated when calculating
+   * #isRestartRequired()
+   * Example:
+   * {
+   *  'publicHostName1': ['TaskTracker'],
+   *  'publicHostName2': ['JobTracker', 'TaskTracker']
+   * }
+   */
+  restartRequiredHostsAndComponents: {},
+  
+  /**
+   * Based on the information in #restartRequiredHostsAndComponents
+   */
+  restartRequiredMessage: function () {
+    var restartHC = this.get('restartRequiredHostsAndComponents');
+    var hostCount = 0;
+    var hcCount = 0;
+    var hostsMsg = "<ul>";
+    for(var host in restartHC){
+      hostCount++;
+      hostsMsg += "<li>"+host+"</li><ul>";
+      restartHC[host].forEach(function(c){
+        hcCount++;
+        hostsMsg += "<li>"+c+"</li>";       
+      })
+      hostsMsg += "</ul>";
+    }
+    hostsMsg += "</ul>"
+    return this.t('services.service.config.restartService.TooltipMessage').format(hcCount, hostCount, hostsMsg);
+  }.property('restartRequiredHostsAndComponents')
 });
 
 App.Service.Health = {

Modified: incubator/ambari/trunk/ambari-web/app/models/service_config.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/service_config.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/service_config.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/service_config.js Sat Apr  6 01:55:42 2013
@@ -27,15 +27,25 @@ App.ServiceConfig = Ember.Object.extend(
   serviceName: '',
   configCategories: [],
   configs: null,
-
+  restartRequired: false,
+  restartRequiredMessage: '',
+  restartRequiredHostsAndComponents: {},
   errorCount: function () {
+    var overrideErrors = 0;
+    this.get('configs').filterProperty("overrides").forEach(function (e) {
+      e.overrides.forEach(function (e) {
+        if (e.error) {
+          overrideErrors += 1;
+        }
+      })
+    })
     var masterErrors = this.get('configs').filterProperty('isValid', false).filterProperty('isVisible', true).get('length');
     var slaveErrors = 0;
-    this.get('configCategories').forEach(function(_category){
+    this.get('configCategories').forEach(function (_category) {
       slaveErrors += _category.get('slaveErrorCount');
-    },this);
-    return masterErrors + slaveErrors;
-  }.property('configs.@each.isValid', 'configs.@each.isVisible', 'configCategories.@each.slaveErrorCount')
+    }, this);
+    return masterErrors + slaveErrors + overrideErrors;
+  }.property('configs.@each.isValid', 'configs.@each.isVisible', 'configCategories.@each.slaveErrorCount', 'configs.@each.overrideErrorTrigger')
 });
 
 App.ServiceConfigCategory = Ember.Object.extend({
@@ -46,8 +56,13 @@ App.ServiceConfigCategory = Ember.Object
   displayName: null,
   slaveConfigs: null,
   /**
+   * check whether to show custom view in category instead of default
+   */
+  isCustomView: false,
+  customView: null,
+  /**
    * Each category might have a site-name associated (hdfs-site, core-site, etc.)
-   * and this will be used when determining which category a particular property 
+   * and this will be used when determining which category a particular property
    * ends up in, based on its site.
    */
   siteFileName: null,
@@ -90,7 +105,7 @@ App.ServiceConfigCategory = Ember.Object
     }
     return length;
   }.property('slaveConfigs.groups.@each.errorCount'),
-  
+
   isAdvanced : function(){
     var name = this.get('name');
     return name.indexOf("Advanced") !== -1 ;
@@ -123,6 +138,7 @@ App.ServiceConfigProperty = Ember.Object
   name: '',
   displayName: '',
   value: '',
+  retypedPassword: '',
   defaultValue: '',
   defaultDirectory: '',
   description: '',
@@ -137,23 +153,36 @@ App.ServiceConfigProperty = Ember.Object
   serviceConfig: null, // points to the parent App.ServiceConfig object
   filename: '',
   isOriginalSCP : true, // if true, then this is original SCP instance and its value is not overridden value.
-  parentSCP: null, // This is the main SCP which is overridden by this. Set only when isOriginalSCP is false. 
+  parentSCP: null, // This is the main SCP which is overridden by this. Set only when isOriginalSCP is false.
   selectedHostOptions : null, // contain array of hosts configured with overridden value
   overrides : null,
   isUserProperty: null, // This property was added by user. Hence they get removal actions etc.
+  isOverridable: true,
+  error: false,
+  overrideErrorTrigger: 0, //Trigger for overrridable property error
+  isRestartRequired: false,
+  restartRequiredMessage: 'Restart required',
+
+  /**
+   * On Overridable property error message, change overrideErrorTrigger value to recount number of errors service have
+   */
+  observeErrors: function () {
+    this.set("overrideErrorTrigger", this.get("overrideErrorTrigger") + 1);
+  }.observes("overrides.@each.errorMessage"),
   /**
    * No override capabilities for fields which are not edtiable
    * and fields which represent master hosts.
    */
-  isOverridable : function() {
+  isPropertyOverridable : function() {
+    var overrideable = this.get('isOverridable');
   	var editable = this.get('isEditable');
   	var dt = this.get('displayType');
-  	return editable && ("masterHost"!=dt);
-  }.property('isEditable', 'displayType'),
+  	return overrideable && editable && ("masterHost"!=dt);
+  }.property('isEditable', 'displayType', 'isOverridable'),
   isOverridden: function() {
     var overrides = this.get('overrides');
-    return overrides != null;
-  }.property('overrides'),
+    return (overrides != null && overrides.get('length')>0) || !this.get('isOriginalSCP');
+  }.property('overrides', 'overrides.length', 'isOriginalSCP'),
   isRemovable: function() {
     var isOriginalSCP = this.get('isOriginalSCP');
     var isUserProperty = this.get('isUserProperty');
@@ -161,12 +190,15 @@ App.ServiceConfigProperty = Ember.Object
     return isUserProperty || !isOriginalSCP;
   }.property('isUserProperty', 'isOriginalSCP'),
   init: function () {
-    if (this.get('id') === 'puppet var') {
+    if(this.get("displayType")=="password"){
+      this.set('retypedPassword', this.get('defaultValue'));
+    }
+    if ((this.get('id') === 'puppet var') && this.get('value') == '') {
       this.set('value', this.get('defaultValue'));
     }
     // TODO: remove mock data
   },
-  
+
   /**
    * Indicates when value is not the default value.
    * Returns false when there is no default value.
@@ -193,12 +225,12 @@ App.ServiceConfigProperty = Ember.Object
     });
     return result;
   }.property('displayType'),
-  
-  initialValue: function () {
-    var masterComponentHostsInDB = App.db.getMasterComponentHosts();
+
+  initialValue: function (localDB) {
+    var masterComponentHostsInDB = localDB.masterComponentHosts;
     //console.log("value in initialvalue: " + JSON.stringify(masterComponentHostsInDB));
-    var hostsInfo = App.db.getHosts(); // which we are setting in installerController in step3.
-    var slaveComponentHostsInDB = App.db.getSlaveComponentHosts();
+    var hostsInfo = localDB.hosts; // which we are setting in installerController in step3.
+    var slaveComponentHostsInDB = localDB.slaveComponentHosts;
     var isOnlyFirstOneNeeded = true;
     switch (this.get('name')) {
       case 'namenode_host':
@@ -241,23 +273,23 @@ App.ServiceConfigProperty = Ember.Object
       case 'dfs_name_dir':
       case 'dfs_data_dir':
       case 'mapred_local_dir':
-        this.unionAllMountPoints(!isOnlyFirstOneNeeded);
+        this.unionAllMountPoints(!isOnlyFirstOneNeeded, localDB);
         break;
       case 'fs_checkpoint_dir':
       case 'zk_data_dir':
       case 'oozie_data_dir':
-        this.unionAllMountPoints(isOnlyFirstOneNeeded);
+        this.unionAllMountPoints(isOnlyFirstOneNeeded, localDB);
         break;
     }
   },
-  
-  unionAllMountPoints: function (isOnlyFirstOneNeeded) {
+
+  unionAllMountPoints: function (isOnlyFirstOneNeeded, localDB) {
     var hostname = '';
     var mountPointsPerHost = [];
     var mountPointAsRoot;
-    var masterComponentHostsInDB = App.db.getMasterComponentHosts();
-    var slaveComponentHostsInDB = App.db.getSlaveComponentHosts();
-    var hostsInfo = App.db.getHosts(); // which we are setting in installerController in step3.
+    var masterComponentHostsInDB = localDB.masterComponentHosts;
+    var slaveComponentHostsInDB = localDB.slaveComponentHosts;
+    var hostsInfo = localDB.hosts; // which we are setting in installerController in step3.
     App.Host.find().forEach(function(item){
       if(!hostsInfo[item.get('id')]){
         hostsInfo[item.get('id')] = {
@@ -402,6 +434,8 @@ App.ServiceConfigProperty = Ember.Object
   validate: function () {
 
     var value = this.get('value');
+    var valueRange = this.get('valueRange');
+    var values = [];//value split by "," to check UNIX users, groups list
 
     var isError = false;
 
@@ -420,6 +454,13 @@ App.ServiceConfigProperty = Ember.Object
           if (!validator.isValidInt(value)) {
             this.set('errorMessage', 'Must contain digits only');
             isError = true;
+          } else {
+            if(valueRange){
+              if(value < valueRange[0] || value > valueRange[1]){
+                this.set('errorMessage', 'Must match the range');
+                isError = true;
+              }
+            }
           }
           break;
         case 'float':
@@ -428,6 +469,17 @@ App.ServiceConfigProperty = Ember.Object
             isError = true;
           }
           break;
+        case 'UNIXList':
+          if(value != '*'){
+            values = value.split(',');
+            for(var i = 0, l = values.length; i < l; i++){
+              if(!validator.isValidUNIXUser(values[i])){
+                this.set('errorMessage', 'Must be a valid list of user names');
+                isError = true;
+              }
+            }
+          }
+          break;
         case 'checkbox':
           break;
         case 'directories':
@@ -492,15 +544,23 @@ App.ServiceConfigProperty = Ember.Object
         }
       }
     }
-    
+
     if (!isError) {
       this.set('errorMessage', '');
+      this.set('error', false);
+    } else {
+      this.set('error', true);
     }
   }.observes('value', 'retypedPassword')
 
 });
 
-App.ServiceConfigProperty.SelectListItem = Ember.Object.extend({
-  value :null,
-  label : null
+App.ConfigSiteTag = Ember.Object.extend({
+  site: DS.attr('string'),
+  tag: DS.attr('string'),
+  /**
+   * Object map of hostname->override-tag for overrides.
+   * <b>Creators should set new object here.<b>
+   */
+  hostOverrides: null
 });

Modified: incubator/ambari/trunk/ambari-web/app/models/target_cluster.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/target_cluster.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/target_cluster.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/target_cluster.js Sat Apr  6 01:55:42 2013
@@ -24,7 +24,7 @@ App.TargetCluster = DS.Model.extend({
   clusterName: DS.attr('string'),
   nameNodeWebUrl: DS.attr('string'),
   nameNodeRpcUrl: DS.attr('string'),
-  oozieServerUrl: DS.hasMany('string')
+  oozieServerUrl: DS.attr('string')
 });
 
 App.TargetCluster.FIXTURES = [/*

Modified: incubator/ambari/trunk/ambari-web/app/models/user.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/models/user.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/models/user.js (original)
+++ incubator/ambari/trunk/ambari-web/app/models/user.js Sat Apr  6 01:55:42 2013
@@ -62,7 +62,11 @@ App.EditUserForm = App.Form.extend({
   disableAdminCheckbox:function () {
     var object = this.get('object');
     if (object) {
-      this.getField("admin").set("disabled", (object.get('userName') == App.get('router').getLoginName()) ? "disabled" : false);
+      if((object.get('userName') == App.get('router').getLoginName()) || object.get("isLdap")){
+        this.getField("admin").set("disabled", true);
+      } else {
+        this.getField("admin").set("disabled", false);
+      }
     }
   }.observes('object'),
 

Modified: incubator/ambari/trunk/ambari-web/app/router.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/router.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/router.js (original)
+++ incubator/ambari/trunk/ambari-web/app/router.js Sat Apr  6 01:55:42 2013
@@ -258,14 +258,20 @@ App.Router = Em.Router.extend({
     }
     App.clusterStatus.updateFromServer();
     var clusterStatusOnServer = App.clusterStatus.get('value');
-    if (clusterStatusOnServer && (clusterStatusOnServer.clusterState === 'CLUSTER_STARTED_5' || clusterStatusOnServer.clusterState === 'ADD_HOSTS_COMPLETED_5' || clusterStatusOnServer.clusterState === 'STACK_UPGRADE_COMPLETED')) {
+    if (clusterStatusOnServer && (clusterStatusOnServer.clusterState === 'CLUSTER_STARTED_5' || clusterStatusOnServer.clusterState === 'ADD_HOSTS_COMPLETED_5' || clusterStatusOnServer.clusterState === 'STACK_UPGRADE_COMPLETED' || clusterStatusOnServer.clusterState === 'REASSIGN_MASTER_COMPLETED')) {
       return 'main.index';
     } else if (clusterStatusOnServer && clusterStatusOnServer.wizardControllerName === App.router.get('addHostController.name')) {
       // if wizardControllerName == "addHostController", then it means someone closed the browser or the browser was crashed when we were last in Add Hosts wizard
       return 'main.hostAdd';
+    } else if (clusterStatusOnServer && clusterStatusOnServer.wizardControllerName === App.router.get('addServiceController.name')) {
+      // if wizardControllerName == "addHostController", then it means someone closed the browser or the browser was crashed when we were last in Add Hosts wizard
+      return 'main.serviceAdd';
     } else if (clusterStatusOnServer && clusterStatusOnServer.wizardControllerName === App.router.get('stackUpgradeController.name')) {
       // if wizardControllerName == "stackUpgradeController", then it means someone closed the browser or the browser was crashed when we were last in Stack Upgrade wizard
       return 'main.stackUpgrade';
+    } else if (clusterStatusOnServer && clusterStatusOnServer.wizardControllerName === App.router.get('reassignMasterController.name')) {
+      // if wizardControllerName == "reassignMasterController", then it means someone closed the browser or the browser was crashed when we were last in Reassign Master wizard
+      return 'main.reassignMaster';
     } else {
       // if wizardControllerName == "installerController", then it means someone closed the browser or the browser was crashed when we were last in Installer wizard
       return 'installer';
@@ -281,6 +287,7 @@ App.Router = Em.Router.extend({
     // otherwise, this.set('installerController.currentStep, 0) would have no effect
     // since it's a computed property but we are not setting it as a dependent of App.db.
     App.db.cleanUp();
+    App.set('isAdmin', false);
     this.clearAllSteps();
     console.log("Log off: " + App.router.getClusterName());
     this.set('loginController.loginName', '');
@@ -346,7 +353,7 @@ App.Router = Em.Router.extend({
         console.log('/login:connectOutlet');
         console.log('currentStep is: ' + router.getInstallerCurrentStep());
         console.log('authenticated is: ' + router.getAuthenticated());
-        router.get('applicationController').connectOutlet('login', App.LoginView);
+        router.get('applicationController').connectOutlet('login');
       }
     }),
 

Modified: incubator/ambari/trunk/ambari-web/app/routes/add_host_routes.js
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/routes/add_host_routes.js?rev=1465166&r1=1465165&r2=1465166&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/routes/add_host_routes.js (original)
+++ incubator/ambari/trunk/ambari-web/app/routes/add_host_routes.js Sat Apr  6 01:55:42 2013
@@ -130,7 +130,7 @@ module.exports = Em.Route.extend({
     },
     back: function(router, event){
       //if install not in progress
-      if(!$(event.target).attr('disabled')){
+      if(!event.contexts[0].get("isInstallInProgress")){
         router.transitionTo('step1');
       }
     },
@@ -250,12 +250,7 @@ module.exports = Em.Route.extend({
       addHostController.setInfoForStep9();
 
       // We need to do recovery based on whether we are in Add Host or Installer wizard
-      App.clusterStatus.setClusterStatus({
-        clusterName: this.get('clusterName'),
-        clusterState: 'ADD_HOSTS_INSTALLING_3',
-        wizardControllerName: App.router.get('addHostController.name'),
-        localdb: App.db.data
-      });
+      addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
       wizardStep8Controller.set('servicesInstalled', true);
       router.transitionTo('step6');
     }
@@ -284,13 +279,9 @@ module.exports = Em.Route.extend({
           var isRetry = true;
           addHostController.installServices(isRetry);
           addHostController.setInfoForStep9();
+          wizardStep9Controller.resetHostsForRetry();
           // We need to do recovery based on whether we are in Add Host or Installer wizard
-          App.clusterStatus.setClusterStatus({
-            clusterName: this.get('clusterName'),
-            clusterState: 'ADD_HOSTS_INSTALLING_3',
-            wizardControllerName: App.router.get('addHostController.name'),
-            localdb: App.db.data
-          });
+          addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
         }
         wizardStep9Controller.navigateStep();
       }
@@ -304,12 +295,7 @@ module.exports = Em.Route.extend({
       addHostController.saveInstalledHosts(wizardStep9Controller);
 
       // We need to do recovery based on whether we are in Add Host or Installer wizard
-      App.clusterStatus.setClusterStatus({
-        clusterName: this.get('clusterName'),
-        clusterState: 'ADD_HOSTS_INSTALLED_4',
-        wizardControllerName: App.router.get('addHostController.name'),
-        localdb: App.db.data
-      });
+      addHostController.saveClusterState('ADD_HOSTS_INSTALLED_4');
 
       router.transitionTo('step7');
     }
@@ -320,13 +306,14 @@ module.exports = Em.Route.extend({
     connectOutlets: function (router, context) {
       console.log('in addHost.step6:connectOutlets');
       var controller = router.get('addHostController');
-      controller.setCurrentStep('6');
+      controller.setCurrentStep('7');
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
         if (!App.testMode) {              //if test mode is ON don't disable prior steps link.
           controller.setLowerStepsDisable(7);
         }
         controller.connectOutlet('wizardStep10', controller.get('content'));
+        App.router.get('updateController').set('isWorking', true);
       })
     },
     back: Em.Router.transitionTo('step6'),
@@ -337,14 +324,8 @@ module.exports = Em.Route.extend({
         addHostController.finish();
         $(context.currentTarget).parents("#modal").find(".close").trigger('click');
 
-
         // We need to do recovery based on whether we are in Add Host or Installer wizard
-        App.clusterStatus.setClusterStatus({
-          clusterName: this.get('clusterName'),
-          clusterState: 'ADD_HOSTS_COMPLETED_5',
-          wizardControllerName: App.router.get('addHostController.name'),
-          localdb: App.db.data
-        });
+        addHostController.saveClusterState('ADD_HOSTS_COMPLETED_5');
 
         router.transitionTo('main.index');
       } else {