You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ma...@apache.org on 2013/10/18 02:25:52 UTC

[30/30] git commit: AMBARI-3266. Contribute Ambari-SCOM. (Tom Beerbower via mahadev)

AMBARI-3266. Contribute Ambari-SCOM. (Tom Beerbower via mahadev)


Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/873b3502
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/873b3502
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/873b3502

Branch: refs/heads/trunk
Commit: 873b3502bec3344ff8b03a7a1ffd2240f9de13b4
Parents: 94fd897
Author: Mahadev Konar <ma...@apache.org>
Authored: Thu Oct 17 17:26:21 2013 -0700
Committer: Mahadev Konar <ma...@apache.org>
Committed: Thu Oct 17 17:26:21 2013 -0700

----------------------------------------------------------------------
 LICENSE.txt                                     |  26 +
 NOTICE.txt                                      |   2 +
 contrib/ambari-scom/.gitignore                  |  11 +
 contrib/ambari-scom/README.md                   |  65 ++
 .../Ambari-SCOM-install-instructions.md         |  97 +++
 .../ambari-scom-server/conf/ambari.properties   |  28 +
 contrib/ambari-scom/ambari-scom-server/pom.xml  | 123 +++
 .../ambari-scom-server/src/assembly/conf.xml    |  29 +
 .../ambari-scom-server/src/assembly/lib.xml     |  29 +
 .../ambari/msi/AbstractResourceProvider.java    | 274 +++++++
 .../apache/ambari/msi/BaseResourceProvider.java |  59 ++
 .../apache/ambari/msi/ClusterDefinition.java    | 545 +++++++++++++
 .../org/apache/ambari/msi/ClusterProvider.java  |  79 ++
 .../apache/ambari/msi/ComponentProvider.java    | 102 +++
 .../ambari/msi/HostComponentProvider.java       | 112 +++
 .../org/apache/ambari/msi/HostProvider.java     | 111 +++
 .../org/apache/ambari/msi/NoOpProvider.java     |  67 ++
 .../org/apache/ambari/msi/RequestProvider.java  |  68 ++
 .../org/apache/ambari/msi/ServiceProvider.java  |  95 +++
 .../org/apache/ambari/msi/StateProvider.java    |  65 ++
 .../org/apache/ambari/msi/TaskProvider.java     |  92 +++
 .../org/apache/ambari/scom/AmbariServer.java    | 449 +++++++++++
 .../ambari/scom/ClusterDefinitionProvider.java  | 176 ++++
 .../apache/ambari/scom/HostInfoProvider.java    |  63 ++
 .../apache/ambari/scom/SQLPropertyProvider.java | 304 +++++++
 .../apache/ambari/scom/SQLProviderModule.java   | 332 ++++++++
 .../ambari/scom/SinkConnectionFactory.java      | 120 +++
 .../apache/ambari/scom/logging/JpaLogger.java   | 185 +++++
 .../main/resources/META-INF/spring-security.xml |  46 ++
 .../src/main/resources/log4j.properties         |  37 +
 .../ambari/msi/ClusterDefinitionTest.java       | 118 +++
 .../apache/ambari/msi/ClusterProviderTest.java  |  99 +++
 .../ambari/msi/ComponentProviderTest.java       | 124 +++
 .../ambari/msi/HostComponentProviderTest.java   | 165 ++++
 .../org/apache/ambari/msi/HostProviderTest.java | 157 ++++
 .../org/apache/ambari/msi/NoOpProviderTest.java |  47 ++
 .../apache/ambari/msi/RequestProviderTest.java  |  80 ++
 .../apache/ambari/msi/ServiceProviderTest.java  | 168 ++++
 .../org/apache/ambari/msi/TaskProviderTest.java |  80 ++
 .../apache/ambari/msi/TestStateProvider.java    |  73 ++
 .../scom/ClusterDefinitionProviderTest.java     |  83 ++
 .../ambari/scom/SQLPropertyProviderTest.java    | 442 +++++++++++
 .../ambari/scom/SQLProviderModuleTest.java      |  51 ++
 .../ambari/scom/SinkConnectionFactoryTest.java  |  68 ++
 .../scom/TestClusterDefinitionProvider.java     |  30 +
 .../ambari/scom/TestHostInfoProvider.java       |  58 ++
 .../ambari/scom/logging/JpaLoggerTest.java      | 163 ++++
 .../src/test/resources/ambari.properties        |  34 +
 .../src/test/resources/clusterproperties.txt    |  47 ++
 .../src/test/resources/log4j.properties         |  21 +
 .../management-pack/Hadoop_MP/BUILDING.md       |  35 +
 .../management-pack/Hadoop_MP/HadoopMp.sln      | 161 ++++
 .../HadoopMp/Classes/AmbariAccessorRole.mpx     |  63 ++
 .../Hadoop_MP/HadoopMp/Classes/AmbariEntity.mpx |  66 ++
 .../Hadoop_MP/HadoopMp/Classes/AmbariSeed.mpx   |  76 ++
 .../HadoopMp/Classes/AmbariWatcherNode.mpx      |  55 ++
 .../Hadoop_MP/HadoopMp/Classes/Cluster.mpx      |  94 +++
 .../Classes/ClusterHardwareProjection.mpx       |  65 ++
 .../HadoopMp/Classes/ClusterProjection.mpx      |  37 +
 .../HadoopMp/Classes/ClusterService.mpx         | 189 +++++
 .../Classes/ClusterSoftwareProjection.mpx       |  66 ++
 .../HadoopMp/Classes/ClustersGroup.mpx          |  46 ++
 .../Hadoop_MP/HadoopMp/Classes/Host.mpx         |  87 ++
 .../HadoopMp/Classes/HostComponent.mpx          | 159 ++++
 .../Discoveries/ClustersGroupPopulator.mpx      |  62 ++
 .../Discoveries/HostComponentsDiscovery.mpx     |  73 ++
 .../Hadoop_MP/HadoopMp/HadoopMp.mpproj          | 773 ++++++++++++++++++
 .../Hadoop_MP/HadoopMp/HadoopMp.mpproj.user     |  28 +
 .../Hadoop_MP/HadoopMp/Images/Icons.mpx         | 116 +++
 .../Hadoop_MP/HadoopMp/ManagementPack.mpx       |  29 +
 ...PropertyBagMultiplePerformanceDataMapper.mpx | 102 +++
 .../PropertyBagPerformanceDataMapper.mpx        |  88 ++
 .../Discovery/AmbariSeedDiscoveryDataSource.mpx |  87 ++
 .../ClusterServicesDiscoveryDataSource.mpx      | 102 +++
 .../Discovery/ClustersDiscoveryDataSource.mpx   | 117 +++
 .../HostComponentsDiscoveryDataSource.mpx       | 107 +++
 .../Discovery/HostsDiscoveryDataSource.mpx      | 102 +++
 .../Discovery/PowerShellDiscoveryDataSource.mpx |  85 ++
 .../Scripts/ClusterServicesDiscovery.ps1        |  80 ++
 .../Discovery/Scripts/ClustersDiscovery.ps1     |  92 +++
 .../Scripts/HostComponentsDiscovery.ps1         | 134 ++++
 .../Discovery/Scripts/HostsDiscovery.ps1        |  64 ++
 .../BaseScriptedPropertyBagDataSource.mpx       |  94 +++
 .../ClusterServiceMetricsDataSource.mpx         | 102 +++
 .../Monitoring/HdfsServiceMetricsDataSource.mpx |  72 ++
 .../HdfsServiceMetricsPerformanceDataSource.mpx |  81 ++
 .../HostComponentHealthStateDataSource.mpx      |  87 ++
 .../HostComponentMetricsDataSource.mpx          |  86 ++
 ...ostComponentMetricsPerformanceDataSource.mpx |  81 ++
 .../MapReduceServiceMetricsDataSource.mpx       |  72 ++
 ...educeServiceMetricsPerformanceDataSource.mpx |  81 ++
 .../Monitoring/Scripts/HdfsServiceMetrics.ps1   |  95 +++
 .../Scripts/HostComponentHealthState.ps1        |  29 +
 .../Monitoring/Scripts/HostComponentMetrics.ps1 |  53 ++
 .../Scripts/MapReduceServiceMetrics.ps1         |  62 ++
 .../ImpersonatedPowerShellPropertyBagProbe.mpx  |  68 ++
 ...dfsServiceThreeStateThresholdMonitorType.mpx | 332 ++++++++
 .../HdfsServiceTwoStateThresholdMonitorType.mpx | 214 +++++
 .../HostComponentHealthStateMonitorType.mpx     | 132 +++
 ...tComponentThreeStateThresholdMonitorType.mpx | 332 ++++++++
 .../InvalidTaskTrackersMonitorType.mpx          | 171 ++++
 ...uceServiceThreeStateThresholdMonitorType.mpx | 332 ++++++++
 .../CapacityRemainingUnitMonitor.mpx            | 106 +++
 .../HdfsService/CorruptedBlocksUnitMonitor.mpx  | 100 +++
 .../HdfsService/DeadDataNodesUnitMonitor.mpx    | 106 +++
 .../UnderReplicatedBlocksUnitMonitor.mpx        | 106 +++
 .../HiveMetastoreHealthStateUnitMonitor.mpx     |  95 +++
 .../HiveServerHealthStateUnitMonitor.mpx        |  95 +++
 .../JobTrackerHealthStateUnitMonitor.mpx        |  95 +++
 .../NameNodeHealthStateUnitMonitor.mpx          |  95 +++
 .../OozieServerHealthStateUnitMonitor.mpx       |  95 +++
 .../SecondaryNameNodeHealthStateUnitMonitor.mpx |  95 +++
 .../TaskTrackerHealthStateUnitMonitor.mpx       |  74 ++
 .../TempletonServerHealthStateUnitMonitor.mpx   |  95 +++
 .../JobTracker/MemoryHeapUsageUnitMonitor.mpx   | 103 +++
 .../DeadTaskTrackersUnitMonitor.mpx             | 106 +++
 .../MapReduceService/FailedJobsUnitMonitor.mpx  | 102 +++
 .../InvalidTaskTrackersUnitMonitor.mpx          | 102 +++
 .../NameNode/MemoryHeapUsageUnitMonitor.mpx     | 103 +++
 ...lusterServiceToSoftwareProjectionRollups.mpx | 106 +++
 ...iveMetastoreComponentToHiveServiceRollup.mpx | 106 +++
 .../HiveServerComponentToHiveServiceRollup.mpx  | 106 +++
 .../Rollups/HostComponentToHostRollups.mpx      | 106 +++
 .../Rollups/HostToHardwareProjectionRollups.mpx | 106 +++
 ...rackerComponentToMapReduceServiceRolllup.mpx | 106 +++
 .../NameNodeComponentToHdfsServiceRollup.mpx    | 106 +++
 ...OozieServerComponentToOozieServiceRollup.mpx | 106 +++
 ...daryNameNodeComponentToHdfsServiceRollup.mpx | 106 +++
 .../SoftwareProjectionToClusterRollups.mpx      | 106 +++
 ...nServerComponentToTempletonServiceRollup.mpx | 106 +++
 .../HadoopMp/Presentation/ActiveAlerts.mpx      | 201 +++++
 .../Presentation/ClusterServicesPerformance.mpx |  49 ++
 .../HadoopMp/Presentation/ClustersDiagram.mpx   |  73 ++
 .../Hadoop_MP/HadoopMp/Presentation/Folders.mpx |  34 +
 .../Presentation/HostComponentsPerformance.mpx  |  46 ++
 .../Hadoop_MP/HadoopMp/References.mpx           |  26 +
 .../HdfsService/BlocksReadCollection.mpx        |  62 ++
 .../HdfsService/BlocksWrittenCollection.mpx     |  62 ++
 .../HdfsService/BytesReadCollection.mpx         |  62 ++
 .../HdfsService/BytesWrittenCollection.mpx      |  62 ++
 .../CapacityNonDfsUsedGbCollection.mpx          |  62 ++
 .../CapacityRemainingGbCollection.mpx           |  62 ++
 .../HdfsService/CapacityTotalGbCollection.mpx   |  62 ++
 .../HdfsService/CapacityUsedGbCollection.mpx    |  62 ++
 .../HdfsService/CorruptedBlocksCollection.mpx   |  62 ++
 .../HdfsService/DeadNodesCollection.mpx         |  62 ++
 .../DecommissionedNodesCollection.mpx           |  62 ++
 .../HdfsService/FilesAppendedCollection.mpx     |  62 ++
 .../HdfsService/FilesCreatedCollection.mpx      |  62 ++
 .../HdfsService/FilesDeletedCollection.mpx      |  62 ++
 .../HdfsService/LiveNodesCollection.mpx         |  62 ++
 .../HdfsService/MissingBlocksCollection.mpx     |  62 ++
 .../PendingDeletionBlocksCollection.mpx         |  62 ++
 .../PendingReplicationBlocksCollection.mpx      |  62 ++
 .../HdfsService/TotalBlocksCollection.mpx       |  62 ++
 .../HdfsService/TotalFilesCollection.mpx        |  62 ++
 .../UnderReplicatedBlocksCollection.mpx         |  62 ++
 .../HeadNode/GcCountCollection.mpx              |  62 ++
 .../HeadNode/LogErrorCollection.mpx             |  62 ++
 .../HeadNode/LogFatalCollection.mpx             |  62 ++
 .../MemoryNonHeapCommittedCollection.mpx        |  62 ++
 .../HeadNode/MemoryNonHeapUsedCollection.mpx    |  62 ++
 .../HeadNode/ReceivedBytesCollection.mpx        |  62 ++
 .../RpcAuthorizationFailuresCollection.mpx      |  62 ++
 .../HeadNode/RpcProcessingAvgTimeCollection.mpx |  62 ++
 .../HeadNode/RpcProcessingNumOpsCollection.mpx  |  62 ++
 .../HeadNode/RpcQueueAvgTimeCollection.mpx      |  62 ++
 .../HeadNode/RpcQueueNumOpsCollection.mpx       |  62 ++
 .../HeadNode/SentBytesCollection.mpx            |  62 ++
 .../HostComponents/Shared/GcTimeCollection.mpx  |  62 ++
 .../Shared/MemoryHeapCommittedCollection.mpx    |  62 ++
 .../Shared/MemoryHeapUsedCollection.mpx         |  62 ++
 .../Shared/ThreadsBlockedCollection.mpx         |  62 ++
 .../Shared/ThreadsNewCollection.mpx             |  62 ++
 .../Shared/ThreadsRunnableCollection.mpx        |  62 ++
 .../Shared/ThreadsTerminatedCollection.mpx      |  62 ++
 .../Shared/ThreadsTimedWaitingCollection.mpx    |  62 ++
 .../Shared/ThreadsWaitingCollection.mpx         |  62 ++
 .../TaskTracker/MapSlotsCollection.mpx          |  62 ++
 .../TaskTracker/MapsRunningCollection.mpx       |  62 ++
 .../TaskTracker/ReduceSlotsCollection.mpx       |  62 ++
 .../TaskTracker/ReducesRunningCollection.mpx    |  62 ++
 .../ShuffleExceptionCaughtCollection.mpx        |  62 ++
 .../ShuffleFailedOutputsCollection.mpx          |  62 ++
 .../ShuffleHandlerBusyPercentCollection.mpx     |  62 ++
 .../ShuffleOutputBytesCollection.mpx            |  62 ++
 .../ShuffleSuccessOutputsCollection.mpx         |  62 ++
 .../DeadTaskTrackersCollection.mpx              |  62 ++
 .../FailedJobsPercentCollection.mpx             |  62 ++
 .../JobsCompletedCollection.mpx                 |  62 ++
 .../MapReduceService/JobsFailedCollection.mpx   |  62 ++
 .../MapReduceService/JobsKilledCollection.mpx   |  62 ++
 .../JobsPreparingCollection.mpx                 |  62 ++
 .../MapReduceService/JobsRunningCollection.mpx  |  62 ++
 .../JobsSubmittedCollection.mpx                 |  62 ++
 .../LiveTaskTrackersCollection.mpx              |  62 ++
 .../MapsCompletedCollection.mpx                 |  62 ++
 .../MapReduceService/MapsFailedCollection.mpx   |  62 ++
 .../MapReduceService/MapsKilledCollection.mpx   |  62 ++
 .../MapReduceService/MapsLaunchedCollection.mpx |  62 ++
 .../MapReduceService/MapsRunningCollection.mpx  |  62 ++
 .../MapReduceService/MapsWaitingCollection.mpx  |  62 ++
 .../NumberOfTaskTrackersCollection.mpx          |  62 ++
 .../OccupiedMapSlotsCollection.mpx              |  62 ++
 .../OccupiedReduceSlotsCollection.mpx           |  62 ++
 .../ReducesCompletedCollection.mpx              |  62 ++
 .../ReducesFailedCollection.mpx                 |  62 ++
 .../ReducesKilledCollection.mpx                 |  62 ++
 .../ReducesLaunchedCollection.mpx               |  62 ++
 .../ReducesRunningCollection.mpx                |  62 ++
 .../ReducesWaitingCollection.mpx                |  62 ++
 .../ReservedMapSlotsCollection.mpx              |  62 ++
 .../ReservedReduceSlotsCollection.mpx           |  62 ++
 .../TaskTrackersBlacklistedCollection.mpx       |  62 ++
 .../TaskTrackersDecommissionedCollection.mpx    |  62 ++
 .../MapReduceService/TaskTrackersGraylisted.mpx |  62 ++
 .../HadoopMp/Rules/Widgets/LiveVsDeadNodes.mpx  |  75 ++
 .../HadoopMp/Rules/Widgets/SpaceUtilization.mpx |  87 ++
 .../Hadoop_MP/HadoopMp/RunAsProfiles.mpx        |  40 +
 .../Shared Scripts/DiscoveryHelpers.ps1         |  69 ++
 .../Shared Scripts/HealthServicesManagement.ps1 |  43 +
 .../HadoopMp/Shared Scripts/JsonParser.ps1      |  57 ++
 .../HadoopMp/Shared Scripts/Logging.ps1         |  22 +
 .../Shared Scripts/MonitoringHelpers.ps1        |  38 +
 .../HadoopMp/Shared Scripts/RestApi.ps1         |  48 ++
 .../HadoopMp/Templates/DiscoveryTemplate.mpx    | 358 +++++++++
 .../Hadoop_MP/Installer/Assets/EULA.rtf         |  38 +
 .../Components/ManagementPacksComponent.wxs     |  33 +
 .../Hadoop_MP/Installer/Config.wxi              |  23 +
 .../Hadoop_MP/Installer/InstallLocation.wxs     |  30 +
 .../Hadoop_MP/Installer/Installer.sln           |  35 +
 .../Hadoop_MP/Installer/Installer.wixproj       |  88 ++
 .../Hadoop_MP/Installer/Localization/en-us.wxl  |  25 +
 .../Hadoop_MP/Installer/Product.wxs             |  54 ++
 .../Hadoop_MP/ManagementMp/ManagementMp.mpproj  | 128 +++
 .../ManagementMp/ManagementMp.mpproj.user       |  28 +
 .../Hadoop_MP/ManagementMp/ManagementPack.mpx   |  29 +
 .../Modules/BaseChangeStateWriteAction.mpx      |  98 +++
 .../Modules/BaseScriptedWriteAction.mpx         |  74 ++
 .../ChangeClusterServiceStateWriteAction.mpx    |  75 ++
 .../ChangeHostComponentStateWriteAction.mpx     |  75 ++
 .../Scripts/ChangeClusterServiceState.ps1       |  33 +
 .../Scripts/ChangeHostComponentState.ps1        |  33 +
 .../ManagementMp/Shared Scripts/Helpers.ps1     |  41 +
 .../ManagementMp/Shared Scripts/JsonParser.ps1  |  57 ++
 .../ManagementMp/Shared Scripts/RestApi.ps1     |  61 ++
 .../ClusterService/StartClusterService.mpx      |  45 ++
 .../Tasks/ClusterService/StopClusterService.mpx |  45 ++
 .../Tasks/HostComponent/StartHostComponent.mpx  |  45 ++
 .../Tasks/HostComponent/StopHostComponent.mpx   |  45 ++
 .../Hadoop_MP/Modules/Modules.csproj            |  78 ++
 .../Modules/Properties/AssemblyInfo.cs          |  53 ++
 .../PropertyBagMultiplePerformanceDataMapper.cs | 134 ++++
 ...ultiplePerformanceDataMapperConfiguration.cs |  38 +
 .../PresentationMp/AssemblyResources.mpx        |  40 +
 .../Charting/Axes/ForegroundDateTimeAxis.mpx    |  31 +
 .../Charting/Axes/ForegroundLinearAxis.mpx      |  31 +
 .../Components/Charting/ChartDataTypes.mpx      | 140 ++++
 .../Charting/Series/StackableSeries.mpx         |  40 +
 .../Components/Charting/SeriesStacker.mpx       |  37 +
 .../Components/CollectionElementAccessor.mpx    |  38 +
 ...esToInstancesWithRecursionLevelConverter.mpx |  38 +
 .../GridLayout05CellWideTopConfig.mpx           | 116 +++
 ...ridLayout05CellWideTopSmallTopLeftConfig.mpx | 116 +++
 .../Components/Standard/CollectionDiplexer.mpx  |  38 +
 .../ColumnsToQueryConfigurationMapper.mpx       |  51 ++
 .../Standard/CommonDataSourceInterface.mpx      |  34 +
 ...ridSortColumnsToSortColumnBaseCollection.mpx |  38 +
 .../Standard/GetManagedEntitiesDataSource.mpx   |  87 ++
 .../GetPerformanceDataForEntitiesDataSource.mpx |  66 ++
 .../Standard/TriggeredComponentHost.mpx         |  54 ++
 .../Components/StringFormatter.mpx              |  51 ++
 .../Components/StringSplitter.mpx               |  38 +
 .../Hadoop_MP/PresentationMp/Controls/Chart.mpx |  57 ++
 .../PresentationMp/Controls/EllipsisLabel.mpx   |  38 +
 .../GridCells/ComponentHostAddressCell.mpx      |  70 ++
 .../GridCells/TwoDecimalDigitsNumberCell.mpx    |  46 ++
 .../PresentationMp/Controls/NumberLabel.mpx     |  43 +
 .../Controls/StackedChartWithLegend.mpx         | 207 +++++
 .../Controls/Standard/ChartWithLegend.mpx       | 212 +++++
 .../Dashboards/ClusterSummaryDashboard.mpx      | 232 ++++++
 .../Dashboards/HdfsSummaryDashboard.mpx         | 188 +++++
 .../Dashboards/JobTrackerSummaryDashboard.mpx   | 275 +++++++
 .../Dashboards/MapReduceSummaryDashboard.mpx    | 188 +++++
 .../Dashboards/NameNodeSummaryDashboard.mpx     | 275 +++++++
 .../PresentationMp/EnableCollectionRules.mpx    |  36 +
 .../Hadoop_MP/PresentationMp/Folders.mpx        |  38 +
 .../Hadoop_MP/PresentationMp/ManagementPack.mpx |  29 +
 .../PresentationMp/Pages/CommonText.mpx         |  34 +
 .../PresentationMp/Pages/TimeRange.mpx          | 107 +++
 .../PresentationMp/PresentationMp.mpproj        | 313 ++++++++
 .../PresentationMp/PresentationMp.mpproj.user   |  28 +
 .../Widgets/ClusterServicesState.mpx            | 161 ++++
 .../PresentationMp/Widgets/ClustersState.mpx    | 163 ++++
 .../PresentationMp/Widgets/CommonStrings.mpx    |  46 ++
 .../HostComponentsOfClusterServiceState.mpx     | 207 +++++
 .../PresentationMp/Widgets/HostsState.mpx       | 204 +++++
 .../Performance/BasePerformanceWidget.mpx       | 355 +++++++++
 .../BaseStackedPerformanceWidget.mpx            | 332 ++++++++
 .../Performance/Cluster/LiveVsDeadNodes.mpx     | 278 +++++++
 .../Performance/Cluster/SpaceUtilization.mpx    | 318 ++++++++
 .../Component/AverageRpcWaitTime.mpx            | 110 +++
 .../Widgets/Performance/Component/GcTime.mpx    | 110 +++
 .../Component/MemoryHeapUtilization.mpx         | 153 ++++
 .../Performance/Component/ThreadsStatus.mpx     | 200 +++++
 .../Widgets/Performance/Hdfs/BlocksSummary.mpx  | 256 ++++++
 .../Performance/Hdfs/CapacityRemaining.mpx      | 119 +++
 .../Widgets/Performance/Hdfs/FilesSummary.mpx   | 193 +++++
 .../Widgets/Performance/Hdfs/HdfsIoSummary.mpx  | 141 ++++
 .../Performance/MapReduce/JobsSummary.mpx       | 256 ++++++
 .../MapReduce/MapReduceSlotsUtilization.mpx     | 213 +++++
 .../Performance/MapReduce/MapsVsReducers.mpx    | 162 ++++
 .../MapReduce/TaskTrackersSummary.mpx           | 256 ++++++
 .../Standard/SingleRowSelectStateWidget.mpx     | 336 ++++++++
 .../Widgets/State/HdfsServicesState.mpx         | 163 ++++
 .../Widgets/State/JobTrackersState.mpx          | 163 ++++
 .../Widgets/State/MapReduceServicesState.mpx    | 163 ++++
 .../Widgets/State/NameNodesState.mpx            | 163 ++++
 .../AmbariDetailsPage.Designer.cs               | 147 ++++
 .../DiscoveryTemplate/AmbariDetailsPage.cs      | 119 +++
 .../DiscoveryTemplate/AmbariDetailsPage.resx    | 136 ++++
 .../AmbariDetailsPageConfig.cs                  |  27 +
 .../ScomPages/DiscoveryTemplate/InputParser.cs  |  94 +++
 .../MultipleAgentChooserDialog.cs               |  37 +
 .../DiscoveryTemplate/RunAsAccountWrapper.cs    |  45 ++
 .../DiscoveryTemplate/SummaryPage.Designer.cs   | 107 +++
 .../ScomPages/DiscoveryTemplate/SummaryPage.cs  |  76 ++
 .../DiscoveryTemplate/SummaryPage.resx          | 136 ++++
 .../DiscoveryTemplate/TemplateInputConfig.cs    |  32 +
 .../WatcherNodesPage.Designer.cs                | 174 ++++
 .../DiscoveryTemplate/WatcherNodesPage.cs       | 216 +++++
 .../DiscoveryTemplate/WatcherNodesPage.resx     | 139 ++++
 .../DiscoveryTemplate/WatcherNodesPageConfig.cs |  28 +
 .../ScomPages/Properties/AssemblyInfo.cs        |  52 ++
 .../ScomPages/Properties/Resources.Designer.cs  | 172 ++++
 .../ScomPages/Properties/Resources.resx         | 178 +++++
 .../Hadoop_MP/ScomPages/ScomPages.csproj        | 148 ++++
 .../Properties/AssemblyInfo.cs                  |  51 ++
 .../WidgetsSilverlight.csproj                   | 177 +++++
 .../WidgetsSilverlight.csproj.user              |  45 ++
 .../Charting/Axes/ForegroundDateTimeAxis.cs     |  79 ++
 .../ForegroundDateTimeDataToAxisConverter.cs    | 116 +++
 .../Charting/Axes/ForegroundLinearAxis.cs       |  83 ++
 .../Axes/ForegroundLinearDataToAxisConverter.cs |  83 ++
 .../Hadoop_MP/WidgetsWpf/Charting/Chart.xaml    | 148 ++++
 .../Hadoop_MP/WidgetsWpf/Charting/Chart.xaml.cs | 125 +++
 .../WidgetsWpf/Charting/ChartingConstants.cs    |  35 +
 .../ExtendedDataToSeriesConverterBase.cs        |  68 ++
 .../SeriesDefinitionDataToSeriesConverter.cs    |  52 ++
 .../StackedAreaDataToSeriesConverter.cs         |  76 ++
 .../SeriesFactories/StackableSeriesFactory.cs   |  49 ++
 .../WidgetsWpf/Charting/SeriesStacker.cs        | 137 ++++
 .../WidgetsWpf/Charting/StackedSeriesManager.cs | 102 +++
 .../Components/CollectionElementAccessor.cs     |  84 ++
 ...iesToInstancesWithRecursionLevelConverter.cs | 115 +++
 .../Components/InitializableComponentBase.cs    |  40 +
 .../WidgetsWpf/Components/StringFormatter.cs    |  85 ++
 .../WidgetsWpf/Components/StringSplitter.cs     |  67 ++
 .../WidgetsWpf/Extensions/DataTypeExtensions.cs |  31 +
 .../WidgetsWpf/Properties/AssemblyInfo.cs       |  71 ++
 .../Hadoop_MP/WidgetsWpf/WidgetsWpf.csproj      | 134 ++++
 .../management-pack/Hadoop_MP/build.bat         |  44 +
 .../db/Hadoop-Metrics-SQLServer-CREATE.ddl      | 793 +++++++++++++++++++
 contrib/ambari-scom/metrics-sink/pom.xml        |  80 ++
 .../sqlserver/jdbc/SQLServerDriver.java         |  88 ++
 .../hadoop/metrics2/sink/SqlServerSinkTest.java | 284 +++++++
 .../hadoop/metrics2/sink/SqlServerSink.java     | 314 ++++++++
 contrib/ambari-scom/msi/build.cmd               |  58 ++
 contrib/ambari-scom/msi/build/zip.ps1           |  38 +
 .../ambari-winpkg/resources/winpkg.ps1          | 580 ++++++++++++++
 .../ambari-winpkg/resources/winpkg.utils.psm1   | 273 +++++++
 .../ambari-winpkg/scripts/install.ps1           | 349 ++++++++
 .../ambari-winpkg/scripts/installApi.psm1       | 281 +++++++
 .../ambari-winpkg/scripts/uninstall.cmd         |  19 +
 .../ambari-winpkg/scripts/uninstall.ps1         | 200 +++++
 .../src/AmbariSetupTools/bootstrap_install.cmd  |  23 +
 .../AmbariSetupTools/bootstrap_uninstall.cmd    |  23 +
 .../msi/src/AmbariSetupTools/winpkg.cmd         |  33 +
 .../msi/src/AmbariSetupTools/winpkg.ps1         | 596 ++++++++++++++
 .../msi/src/AmbariSetupTools/winpkg.utils.psm1  | 273 +++++++
 contrib/ambari-scom/msi/src/GUI/App.config      |  19 +
 .../ambari-scom/msi/src/GUI/Form1.Designer.cs   | 352 ++++++++
 contrib/ambari-scom/msi/src/GUI/Form1.cs        | 276 +++++++
 contrib/ambari-scom/msi/src/GUI/Form1.resx      | 139 ++++
 .../ambari-scom/msi/src/GUI/GUI_Ambari.csproj   | 101 +++
 contrib/ambari-scom/msi/src/GUI/Program.cs      |  38 +
 .../msi/src/GUI/Properties/AssemblyInfo.cs      |  52 ++
 .../src/GUI/Properties/Resources.Designer.cs    |  87 ++
 .../msi/src/GUI/Properties/Resources.resx       | 130 +++
 .../msi/src/GUI/Properties/Settings.Designer.cs |  46 ++
 .../msi/src/GUI/Properties/Settings.settings    |  20 +
 .../msi/src/Result/Ambari_Result.csproj         |  92 +++
 contrib/ambari-scom/msi/src/Result/App.config   |  19 +
 contrib/ambari-scom/msi/src/Result/Program.cs   |  43 +
 .../msi/src/Result/Properties/AssemblyInfo.cs   |  52 ++
 .../src/Result/Properties/Resources.Designer.cs |  87 ++
 .../msi/src/Result/Properties/Resources.resx    | 130 +++
 .../src/Result/Properties/Settings.Designer.cs  |  45 ++
 .../msi/src/Result/Properties/Settings.settings |  20 +
 contrib/ambari-scom/msi/src/ambari-scom.wxs     |  94 +++
 contrib/ambari-scom/package.bat                 |  61 ++
 contrib/ambari-scom/pom.xml                     |  69 ++
 402 files changed, 41679 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/LICENSE.txt
----------------------------------------------------------------------
diff --git a/LICENSE.txt b/LICENSE.txt
index 4a51656..df7d260 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -260,3 +260,29 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+For some parts of contrib/ambari-scom:
+
+Microsoft Public License (MS-PL)
+[OSI Approved License]
+
+This license governs use of the accompanying software. If you use the software, you
+accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+The terms "reproduce," "reproduction," "derivative works," and "distribution" have the
+same meaning here as under U.S. copyright law.
+A "contribution" is the original software, or any additions or changes to the software.
+A "contributor" is any person that distributes its contribution under this license.
+"Licensed patents" are a contributor's patent claims that read directly on its contribution.
+
+2. Grant of Rights
+(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+
+3. Conditions and Limitations
+(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
+(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
+(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
+(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
+(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/NOTICE.txt
----------------------------------------------------------------------
diff --git a/NOTICE.txt b/NOTICE.txt
index 747f4a5..4a30a3b 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -8,3 +8,5 @@ Component ambari-common/src/test/python are under the following copyright:
 
 Copyright (c) 2003-2012, Michael Foord
 All rights reserved.
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/.gitignore
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/.gitignore b/contrib/ambari-scom/.gitignore
new file mode 100644
index 0000000..407a77d
--- /dev/null
+++ b/contrib/ambari-scom/.gitignore
@@ -0,0 +1,11 @@
+.classpath
+.project
+.settings
+.idea/
+.iml/
+target
+*.iml
+pass.txt
+.DS_Store
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/README.md
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/README.md b/contrib/ambari-scom/README.md
new file mode 100644
index 0000000..2fa540a
--- /dev/null
+++ b/contrib/ambari-scom/README.md
@@ -0,0 +1,65 @@
+<!---
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+Ambari SCOM Management Pack
+============
+
+The *Ambari SCOM Management Pack* gives insight into the performance and health of an Apache Hadoop cluster to users of
+Microsoft System Center Operations Manager (SCOM). *Ambari SCOM* integrates with the Ambari REST API which aggregates and exposes cluster information and metrics.
+
+## Documentation
+
+Look for *Ambari SCOM* documentation on the [Apache Ambari Wiki](https://cwiki.apache.org/confluence/display/AMBARI/Ambari+SCOM+Management+Pack). Please also visit the [Apache Ambari Project](http://incubator.apache.org/ambari/) page for more information.
+
+## License
+
+*Ambari SCOM* is released under [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+## Issue Tracking
+
+Report any issues via the [Ambari JIRA](https://issues.apache.org/jira/browse/AMBARI) using component `Ambari-SCOM`.
+
+## Build
+
+####Ambari-SCOM and Metrics Sink
+
+######Requirements
+* JDK 1.6
+* Maven 3.0
+    
+######Maven modules
+* ambari-scom-project (Parent POM for all modules)
+  * ambari-scom (ambari MSI and SQL Server provider)
+  * metrics-sink (Metrics SQL Server sink)       
+  
+######Maven build goals
+ * Clean : mvn clean
+ * Compile : mvn compile
+ * Run tests : mvn test 
+ * Create JAR : mvn package
+ * Install JAR in M2 cache : mvn install     
+    
+######Tests options
+  * -DskipTests to skip tests when running the following Maven goals:
+    'package', 'install', 'deploy' or 'verify'
+  * -Dtest=\<TESTCLASSNAME>,\<TESTCLASSNAME#METHODNAME>,....
+  * -Dtest.exclude=\<TESTCLASSNAME>
+  * -Dtest.exclude.pattern=\*\*/\<TESTCLASSNAME1>.java,\*\*/\<TESTCLASSNAME2>.java
+
+####Management Pack
+
+See [Building the Management Pack](management-pack/Hadoop_MP/BUILDING.md) for more information.
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/Ambari-SCOM-install-instructions.md
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/Ambari-SCOM-install-instructions.md b/contrib/ambari-scom/ambari-scom-server/Ambari-SCOM-install-instructions.md
new file mode 100644
index 0000000..e37d0b4
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/Ambari-SCOM-install-instructions.md
@@ -0,0 +1,97 @@
+<!---
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+Instructions to setup ambari-scom
+======
+
+
+###Setup the HadoopMonitoring database
+
+
+1. Setup SQLServer for mixed mode authentication (the metrics2 sink and Ambari metrics provider will connect through SQLServer authentication).
+2. Create SQLServer login and password (or use the default sa login)
+3. Use SQLServer Configuration Manager to make sure that TCP/IP is active and enabled (note the port : default 1433).
+4. Run the DDL script from the ambari-scom project to create the HadoopMoitoring database.  The script should be available as **db/MonitoringDatabase.sql** in the ambari-scom project folder.
+5. Download the SqlServer JDBC driver jar **(sqljdbc4.jar)** from [here](http://msdn.microsoft.com/en-us/data/aa937724.aspx).
+
+###Install Hadoop and SQLServerSink
+
+
+1. Follow the hadoop install instructions [here](http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-Win-1.3.0/index.html), making sure you download the 1.3 MSI.
+2. Note the location of the **clusterproperties.txt** configuration file.
+3. Setup Metrics2 SqlServerSink by editing the **hadoop-metrics2.properties** file in the hadoop bin folder (e.g. C:\HDP\hadoop-1.2.0.1.3.0.0-0380\bin\hadoop-metrics2.properties).  
+Note that this step should be repeated on each node of the cluster installed above.  Set the following properties…
+
+        *.sink.sql.class=org.apache.hadoop.metrics2.sink.SqlServerSink
+
+        namenode.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+        datanode.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+        jobtracker.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+        tasktracker.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+        maptask.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+        reducetask.sink.sql.databaseUrl=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+
+   Note that the server, port, user and password should work with the SQLServer install from above 
+   (e.g. jdbc:sqlserver://ambari1:1433;databaseName=HadoopMonitoring;user=sa;password=BigData1).
+4. Copy the SqlServer JDBC driver jar and the ambari-scom jar to each node of the cluster.
+5. Set ambari-scom jar and SQLServer driver jar in class path by editing the class path in the **namenode.xml, datanode.xml, jobtracker.xml, tasktracker.xml and other component xml files** of the hadoop bin folder (e.g. C:\HDP\hadoop-1.2.0.1.3.0.0-0380\bin\namenode xml).  
+Note that this step should be repeated on each node of the cluster.  In each file prepend the following to -classpath… 
+  
+        [path to ambari-scom jar];[path to SqlServer JDBC jar]; 
+For example, '-classpath C:\ambari-scom\target\ambari-scom-1.0.jar;C:\hadoop\sqljdbc4.jar;…'.
+
+6. Start (or restart) Hadoop by using the scripts in the HDP install folder to start the services as directed by the link in step 1.
+
+        C:\HDP>start_local_hdp_services.cmd
+       
+7. Check to see that metrics are being directed to the SQLServer database by querying the records table. 
+
+        select * from HadoopMonitoring.dbo.MetricRecord
+   The table should not be empty.
+
+
+###Run AmbariServer
+
+
+1. Edit the **ambari.properties** file from the ambari-scom project (ambari-scom/config/ambari.properties or unzip target/ambari-scom-1.0-conf.zip to desired location).  Add the following properties ...
+
+        scom.sink.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
+        scom.sink.db.url=jdbc:sqlserver://[server]:[port];databaseName=HadoopMonitoring;user=[user];password=[password]
+    Note that the server, port, user and password should work with the SQLServer install from above (e.g. jdbc:sqlserver://ambari1:1433;databaseName=HadoopMonitoring;user=sa;password=BigData1).
+
+2. Use java to run the ambari server **(org.apache.ambari.scom.AmbariServer)** from a Windows command prompt.  Include the following in the classpath ...
+
+   * the folder containing the **ambari.properties** file (see step #1).
+   * the folder containing the **clusterproperties.txt** file from the hadoop install.
+   * the SqlServer JDBC jar **(sqljdbc4.jar)** from the steps above.
+   * the ambari-scom jar from the ambari-scom build target.
+   * the lib folder containing the dependency jars from the ambari-scom build target.
+   
+
+   The command should look something like this ...
+    
+        java -server -XX:NewRatio=3 -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit -XX:CMSInitiatingOccupancyFraction=60 -Xms512m -Xmx2048m -cp "c:\ambari-scom\conf;c:\hadoop\sqljdbc4.jar;c:\ambari-scom\target\ambari-scom-1.0.jar;c:\ambari-scom\target\lib\*" org.apache.ambari.scom.AmbariServer
+
+
+###Test the API
+
+
+1. From a browser access the API...
+  
+        http://[server]:8080/api/v1/clusters
+
+2. Verify that metrics are being reported…
+
+        http://[server]:8080/api/v1/clusters/ambari/services/HDFS/components/NAMENODE

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/conf/ambari.properties
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/conf/ambari.properties b/contrib/ambari-scom/ambari-scom-server/conf/ambari.properties
new file mode 100644
index 0000000..06cfa3b
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/conf/ambari.properties
@@ -0,0 +1,28 @@
+#
+# Copyright 2011 The Apache Software Foundation
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+
+server.connection.max.idle.millis=900000
+api.authenticate=false
+server.os_type=windows2012
+server.persistence.type=in-memory
+security.passwords.encryption.enabled=false
+scom.sink.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
+scom.sink.db.url=jdbc:sqlserver://[server]:[port];databaseName=[databaseName];user=[user];password=[password]

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/pom.xml
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/pom.xml b/contrib/ambari-scom/ambari-scom-server/pom.xml
new file mode 100644
index 0000000..8272328
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/pom.xml
@@ -0,0 +1,123 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.apache.ambari</groupId>
+        <artifactId>ambari-scom-project</artifactId>
+        <version>0.9.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>ambari-scom-server</artifactId>
+    <packaging>jar</packaging>
+    <name>Ambari SCOM Server</name>
+    <url>http://maven.apache.org</url>
+    <properties>
+        <ambari.version>1.3.0-SNAPSHOT</ambari.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <version>3.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ambari</groupId>
+            <artifactId>ambari-server</artifactId>
+            <version>${ambari.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-server</artifactId>
+            <version>1.8</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.12</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>rpm-maven-plugin</artifactId>
+                <version>2.0.1</version>
+                <executions>
+                    <execution>
+                        <phase>none</phase>
+                        <goals>
+                            <goal>rpm</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.1</version>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>false</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptors>
+                        <descriptor>src/assembly/lib.xml</descriptor>
+                        <descriptor>src/assembly/conf.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>attached</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/assembly/conf.xml
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/assembly/conf.xml b/contrib/ambari-scom/ambari-scom-server/src/assembly/conf.xml
new file mode 100644
index 0000000..dad4e70
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/assembly/conf.xml
@@ -0,0 +1,29 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<assembly>
+    <id>conf</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>conf/</directory>
+            <outputDirectory>conf</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/assembly/lib.xml
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/assembly/lib.xml b/contrib/ambari-scom/ambari-scom-server/src/assembly/lib.xml
new file mode 100644
index 0000000..2ea12a0
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/assembly/lib.xml
@@ -0,0 +1,29 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<assembly>
+    <id>lib</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>target/lib/</directory>
+            <outputDirectory>lib</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/AbstractResourceProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/AbstractResourceProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/AbstractResourceProvider.java
new file mode 100644
index 0000000..489063f
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/AbstractResourceProvider.java
@@ -0,0 +1,274 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.msi;
+
+import org.apache.ambari.server.controller.internal.RequestStatusImpl;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PredicateHelper;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * An abstract resource provider for a MSI defined cluster.
+ */
+public abstract class AbstractResourceProvider implements ResourceProvider {
+
+  private final ClusterDefinition clusterDefinition;
+
+  private final Resource.Type type;
+
+  private final Set<String> propertyIds;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public AbstractResourceProvider(Resource.Type type, ClusterDefinition clusterDefinition) {
+    this.type              = type;
+    this.clusterDefinition = clusterDefinition;
+
+    Set<String> propertyIds = PropertyHelper.getPropertyIds(type);
+    this.propertyIds = new HashSet<String>(propertyIds);
+    this.propertyIds.addAll(PropertyHelper.getCategories(propertyIds));
+  }
+
+
+  // ----- ResourceProvider --------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request)
+      throws SystemException, UnsupportedPropertyException, ResourceAlreadyExistsException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Management operations are not supported");
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+
+    Set<Resource> resultSet = new HashSet<Resource>();
+
+    for (Resource resource : getResources()) {
+      if (predicate == null || predicate.evaluate(resource)) {
+        ResourceImpl newResource = new ResourceImpl(resource);
+        updateProperties(newResource, request, predicate);
+        resultSet.add(newResource);
+      }
+    }
+    return resultSet;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+
+    Set<Resource> resources = getResources(request, predicate);
+
+    Integer requestId = -1;
+
+    Iterator<Map<String,Object>> iterator = request.getProperties().iterator();
+    if (iterator.hasNext()) {
+      Map<String, Object> properties = iterator.next();
+
+      for (Resource resource : resources) {
+        requestId = updateProperties(resource, properties);
+      }
+    }
+    return getRequestStatus(requestId == -1 ? null : requestId);
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Management operations are not supported");
+  }
+
+  @Override
+  public Map<Resource.Type, String> getKeyPropertyIds() {
+    return PropertyHelper.getKeyPropertyIds(type);
+  }
+
+  @Override
+  public Set<String> checkPropertyIds(Set<String> propertyIds) {
+    propertyIds = new HashSet<String>(propertyIds);
+    propertyIds.removeAll(this.propertyIds);
+    return propertyIds;
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  /**
+   * Get the set of resources for this provider.
+   *
+   * @return the set of resources
+   */
+  abstract protected Set<Resource> getResources();
+
+  /**
+   * Update the resource with any properties handled by the resource provider.
+   *
+   * @param resource   the resource to update
+   * @param request    the request
+   * @param predicate  the predicate
+   */
+  public abstract void updateProperties(Resource resource, Request request, Predicate predicate);
+
+  /**
+   * Update the resource with the given properties.
+   *
+   * @param resource    the resource to update
+   * @param properties  the properties
+   *
+   * @return the request id; -1 for none
+   */
+  public abstract int updateProperties(Resource resource, Map<String, Object> properties);
+
+  /**
+   * Get a request status
+   *
+   * @return the request status
+   */
+  protected RequestStatus getRequestStatus(Integer requestId) {
+    if (requestId != null){
+      Resource requestResource = new ResourceImpl(Resource.Type.Request);
+      requestResource.setProperty(PropertyHelper.getPropertyId("Requests", "id"), requestId);
+      requestResource.setProperty(PropertyHelper.getPropertyId("Requests", "status"), "InProgress");
+      return new RequestStatusImpl(requestResource);
+    }
+    return new RequestStatusImpl(null);
+  }
+
+
+  // ----- accessors ---------------------------------------------------------
+
+  /**
+   * Get the configuration provider.
+   *
+   * @return the configuration provider
+   */
+  protected ClusterDefinition getClusterDefinition() {
+    return clusterDefinition;
+  }
+
+  /**
+   * Get the resource provider type.
+   *
+   * @return the type
+   */
+  public Resource.Type getType() {
+    return type;
+  }
+
+
+// ----- helper methods ----------------------------------------------------
+
+  /**
+   * Get the set of property ids required to satisfy the given request.
+   *
+   * @param request              the request
+   * @param predicate            the predicate
+   *
+   * @return the set of property ids needed to satisfy the request
+   */
+  protected Set<String> getRequestPropertyIds(Request request, Predicate predicate) {
+    Set<String> propertyIds  = request.getPropertyIds();
+
+    // if no properties are specified, then return them all
+    if (propertyIds == null || propertyIds.isEmpty()) {
+      return new HashSet<String>(this.propertyIds);
+    }
+
+    propertyIds = new HashSet<String>(propertyIds);
+
+    if (predicate != null) {
+      propertyIds.addAll(PredicateHelper.getPropertyIds(predicate));
+    }
+    return propertyIds;
+  }
+
+  /**
+   * Check to see if the given set contains a property or category id that matches the given property id.
+   *
+   * @param ids         the set of property/category ids
+   * @param propertyId  the property id
+   *
+   * @return true if the given set contains a property id or category that matches the given property id
+   */
+  protected static boolean contains(Set<String> ids, String propertyId) {
+    boolean contains = ids.contains(propertyId);
+
+    if (!contains) {
+      String category = PropertyHelper.getPropertyCategory(propertyId);
+      while (category != null && !contains) {
+        contains = ids.contains(category);
+        category = PropertyHelper.getPropertyCategory(category);
+      }
+    }
+    return contains;
+  }
+
+  /**
+   * Factory method for obtaining a resource provider based on a given type.
+   *
+   * @param type               the resource type
+   * @param clusterDefinition  the cluster definition
+   *
+   * @return a new resource provider
+   */
+  public static ResourceProvider getResourceProvider(Resource.Type type,
+                                                     ClusterDefinition clusterDefinition) {
+    switch (type) {
+      case Cluster:
+        return new ClusterProvider(clusterDefinition);
+      case Service:
+        return new ServiceProvider(clusterDefinition);
+      case Component:
+        return new ComponentProvider(clusterDefinition);
+      case Host:
+        return new HostProvider(clusterDefinition);
+      case HostComponent:
+        return new HostComponentProvider(clusterDefinition);
+      case Request:
+        return new RequestProvider(clusterDefinition);
+      case Task:
+        return new TaskProvider(clusterDefinition);
+      default:
+        return new NoOpProvider(type, clusterDefinition);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/BaseResourceProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/BaseResourceProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/BaseResourceProvider.java
new file mode 100644
index 0000000..f0ae1e2
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/BaseResourceProvider.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.msi;
+
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * An abstract resource provider for a MSI defined cluster.
+ */
+public abstract class BaseResourceProvider extends AbstractResourceProvider {
+
+  private final Set<Resource> resources = new HashSet<Resource>();
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition the cluster definition
+   */
+  public BaseResourceProvider(Resource.Type type, ClusterDefinition clusterDefinition) {
+    super(type, clusterDefinition);
+  }
+
+  /**
+   * Get the set of resources for this provider.
+   *
+   * @return the set of resources
+   */
+  protected Set<Resource> getResources() {
+    return resources;
+  }
+
+  /**
+   * Add a resource to the set of resources provided by this provider.
+   *
+   * @param resource  the resource to add
+   */
+  protected void addResource(Resource resource) {
+    resources.add(resource);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterDefinition.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterDefinition.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterDefinition.java
new file mode 100644
index 0000000..364889b
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterDefinition.java
@@ -0,0 +1,545 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.msi;
+
+import org.apache.ambari.scom.ClusterDefinitionProvider;
+import org.apache.ambari.scom.HostInfoProvider;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Defines the cluster created by the MSI.
+ */
+public class ClusterDefinition {
+
+  private static final String HEADER_TAG              = "#";
+  private static final String HOSTS_HEADER            = "Hosts";
+
+  private final Set<String> services = new HashSet<String>();
+  private final Set<String> hosts = new HashSet<String>();
+  private final Map<String, Set<String>> components = new HashMap<String, Set<String>>();
+  private final Map<String, Map<String, Set<String>>> hostComponents = new HashMap<String, Map<String, Set<String>>>();
+  private final Map<Integer, StateProvider.Process> processes = new HashMap<Integer, StateProvider.Process>();
+
+  private final Set<Resource> requestResources = new HashSet<Resource>();
+  private final Set<Resource> taskResources    = new HashSet<Resource>();
+
+
+  private final StateProvider stateProvider;
+  private final ClusterDefinitionProvider definitionProvider;
+  private final HostInfoProvider hostInfoProvider;
+  private String clusterName;
+  private String versionId;
+
+  private int nextRequestId = 1;
+  private int nextTaskId = 1;
+
+  /**
+   * Component name mapping to account for differences in what is provided by the MSI
+   * and what is expected by the Ambari providers.
+   */
+  private static final Map<String, Set<String>> componentNameMap = new HashMap<String, Set<String>>();
+
+  static {
+    componentNameMap.put("NAMENODE_HOST",           Collections.singleton("NAMENODE"));
+    componentNameMap.put("SECONDARY_NAMENODE_HOST", Collections.singleton("SECONDARY_NAMENODE"));
+    componentNameMap.put("OOZIE_SERVER_HOST",       Collections.singleton("OOZIE_SERVER"));
+    componentNameMap.put("WEBHCAT_HOST",            Collections.singleton("WEBHCAT_SERVER"));
+    componentNameMap.put("FLUME_HOSTS",             Collections.singleton("FLUME_SERVER"));
+    componentNameMap.put("HBASE_MASTER",            Collections.singleton("HBASE_MASTER"));
+    componentNameMap.put("HBASE_REGIONSERVERS",     Collections.singleton("HBASE_REGIONSERVER"));
+    componentNameMap.put("ZOOKEEPER_HOSTS",         Collections.singleton("ZOOKEEPER_SERVER"));
+
+    Set<String> mapReduceComponents = new HashSet<String>();
+    mapReduceComponents.add("JOBTRACKER");
+    mapReduceComponents.add("HISTORY_SERVER");
+    componentNameMap.put("JOBTRACKER_HOST", mapReduceComponents);
+
+    Set<String> slaveComponents = new HashSet<String>();
+    slaveComponents.add("DATANODE");
+    slaveComponents.add("TASKTRACKER");
+
+    componentNameMap.put("SLAVE_HOSTS", slaveComponents);
+
+    Set<String> hiveComponents = new HashSet<String>();
+    hiveComponents.add("HIVE_SERVER");
+    hiveComponents.add("HIVE_SERVER2");
+    hiveComponents.add("HIVE_METASTORE");
+    hiveComponents.add("HIVE_CLIENT");
+
+    componentNameMap.put("HIVE_SERVER_HOST", hiveComponents);
+  }
+
+  /**
+   * Component service mapping .
+   */
+  private static final Map<String, String> componentServiceMap = new HashMap<String, String>();
+
+  static {
+    componentServiceMap.put("NAMENODE",           "HDFS");
+    componentServiceMap.put("DATANODE",           "HDFS");
+    componentServiceMap.put("SECONDARY_NAMENODE", "HDFS");
+    componentServiceMap.put("JOBTRACKER",         "MAPREDUCE");
+    componentServiceMap.put("HISTORY_SERVER",     "MAPREDUCE");
+    componentServiceMap.put("TASKTRACKER",        "MAPREDUCE");
+    componentServiceMap.put("HIVE_SERVER",        "HIVE");
+    componentServiceMap.put("HIVE_SERVER2",       "HIVE");
+    componentServiceMap.put("HIVE_METASTORE",     "HIVE");
+    componentServiceMap.put("HIVE_CLIENT",        "HIVE");
+    componentServiceMap.put("OOZIE_SERVER",       "OOZIE");
+    componentServiceMap.put("WEBHCAT_SERVER",     "WEBHCAT");
+    componentServiceMap.put("FLUME_SERVER",       "FLUME");
+    componentServiceMap.put("HBASE_MASTER",       "HBASE");
+    componentServiceMap.put("HBASE_REGIONSERVER", "HBASE");
+    componentServiceMap.put("ZOOKEEPER_SERVER",   "ZOOKEEPER");
+  }
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a cluster definition.
+   *
+   * @param stateProvider  the state provider
+   */
+  public ClusterDefinition(StateProvider stateProvider,
+                           ClusterDefinitionProvider definitionProvider,
+                           HostInfoProvider hostInfoProvider) {
+    this.stateProvider      = stateProvider;
+    this.definitionProvider = definitionProvider;
+    this.hostInfoProvider   = hostInfoProvider;
+    this.clusterName        = definitionProvider.getClusterName();
+    this.versionId          = definitionProvider.getVersionId();
+
+    try {
+      readClusterDefinition();
+    } catch (IOException e) {
+      String msg = "Caught exception reading cluster definition file.";
+      throw new IllegalStateException(msg, e);
+    }
+  }
+
+  // ----- ClusterDefinition -------------------------------------------------
+
+  /**
+   * Get the name of the cluster.
+   *
+   * @return the cluster name
+   */
+  public String getClusterName() {
+    return clusterName;
+  }
+
+  /**
+   * Get the name of the cluster.
+   *
+   * @return the cluster name
+   */
+  public String getVersionId() {
+    return versionId;
+  }
+
+  /**
+   * Get the services for the cluster.
+   *
+   * @return the set of service names
+   */
+  public Set<String> getServices() {
+    return services;
+  }
+
+  /**
+   * Get the hosts for the cluster.
+   *
+   * @return the set of hosts names
+   */
+  public Set<String> getHosts() {
+    return hosts;
+  }
+
+  /**
+   * Get the host info provider associated with this cluster definition.
+   *
+   * @return the host info provider
+   */
+  public HostInfoProvider getHostInfoProvider() {
+    return hostInfoProvider;
+  }
+
+  /**
+   * Get the components for the given service.
+   *
+   * @param service  the service name
+   *
+   * @return the set of component names for the given service name
+   */
+  public Set<String> getComponents(String service) {
+    Set<String> componentSet = components.get(service);
+    return componentSet == null ? Collections.<String>emptySet() : componentSet;
+  }
+
+  /**
+   * Get the host components for the given service and host.
+   *
+   * @param service  the service name
+   * @param host     the host name
+   *
+   * @return the set of host component names for the given service and host names
+   */
+  public Set<String> getHostComponents(String service, String host) {
+    Set<String> resultSet = null;
+    Map<String, Set<String>> serviceHostComponents = hostComponents.get(service);
+    if (serviceHostComponents != null) {
+      resultSet = serviceHostComponents.get(host);
+    }
+    return resultSet == null ? Collections.<String>emptySet() : resultSet;
+  }
+
+  /**
+   * Get the host state from the given host name.
+   *
+   * @param hostName  the host name
+   *
+   * @return the host state
+   */
+  public String getHostState(String hostName) {
+    for (Map.Entry<String, Map<String, Set<String>>> entry : hostComponents.entrySet()) {
+      Map<String, Set<String>> serviceHostComponents = entry.getValue();
+      for (Map.Entry<String, Set<String>> hostEntry : serviceHostComponents.entrySet()) {
+        if (hostEntry.getKey().equals(hostName)) {
+          Set<String> componentNames = hostEntry.getValue();
+          for (String componentName : componentNames) {
+            if (stateProvider.getRunningState(hostName, componentName) == StateProvider.State.Unknown) {
+              return "UNHEALTHY";
+            }
+          }
+        }
+      }
+    }
+    return "HEALTHY";
+  }
+
+  /**
+   * Get the service state from the given service name.
+   *
+   * @param serviceName  the service name
+   *
+   * @return the service state
+   */
+  public String getServiceState(String serviceName) {
+    Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
+    if (serviceHostComponents != null) {
+
+      for (Map.Entry<String, Set<String>> entry : serviceHostComponents.entrySet()) {
+        String      hostName       = entry.getKey();
+        Set<String> componentNames = entry.getValue();
+
+        for (String componentName : componentNames) {
+          if (stateProvider.getRunningState(hostName, componentName) != StateProvider.State.Running) {
+            return "INSTALLED";
+          }
+        }
+      }
+    }
+
+    return "STARTED";
+  }
+
+  /**
+   * Set the service state for the given service name.
+   *
+   * @param serviceName  the service name
+   *
+   * @return the request id
+   */
+  public int setServiceState(String serviceName, String state) {
+    StateProvider.State s = state.equals("STARTED") ? StateProvider.State.Running :
+        state.equals("INSTALLED") ? StateProvider.State.Stopped : StateProvider.State.Unknown;
+
+    int requestId = -1;
+
+    if (s != StateProvider.State.Unknown) {
+      Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
+      if (serviceHostComponents != null) {
+
+        for (Map.Entry<String, Set<String>> entry : serviceHostComponents.entrySet()) {
+          String      hostName       = entry.getKey();
+          Set<String> componentNames = entry.getValue();
+
+          for (String componentName : componentNames) {
+            requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
+                "Set service " + serviceName + " state to " + s);
+          }
+        }
+      }
+    }
+    return requestId;
+  }
+
+  /**
+   * Get the component state from the give service name and component name.
+   *
+   * @param serviceName    the service name
+   * @param componentName  the component name
+   *
+   * @return the component state
+   */
+  public String getComponentState(String serviceName, String componentName) {
+    Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
+    if (serviceHostComponents != null) {
+
+      for (Map.Entry<String, Set<String>> entry : serviceHostComponents.entrySet()) {
+        String      hostName       = entry.getKey();
+        Set<String> componentNames = entry.getValue();
+
+        for (String name : componentNames) {
+          if (name.equals(componentName)) {
+            if (stateProvider.getRunningState(hostName, componentName) != StateProvider.State.Running) {
+              return "INSTALLED";
+            }
+          }
+        }
+      }
+    }
+
+    return "STARTED";
+  }
+
+  /**
+   * Set the component state for the given service name.
+   *
+   * @param serviceName    the service name
+   * @param componentName  the component name
+   * @param state          the state
+   *
+   * @return the request id
+   */
+  public int setComponentState(String serviceName, String componentName, String state) {
+    StateProvider.State s = state.equals("STARTED") ? StateProvider.State.Running :
+        state.equals("INSTALLED") ? StateProvider.State.Stopped : StateProvider.State.Unknown;
+
+    int requestId = -1;
+
+    if (s != StateProvider.State.Unknown) {
+      Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
+      if (serviceHostComponents != null) {
+
+        for (Map.Entry<String, Set<String>> entry : serviceHostComponents.entrySet()) {
+          String      hostName       = entry.getKey();
+          Set<String> componentNames = entry.getValue();
+
+          for (String name : componentNames) {
+            if (name.equals(componentName)) {
+              requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
+                  "Set component " + componentName + " state to " + s);
+            }
+          }
+        }
+      }
+    }
+    return requestId;
+  }
+
+  /**
+    * Get the host component state from the given host name and component name.
+    *
+    * @param hostName       the host name
+    * @param componentName  the component name
+    *
+    * @return the host component state
+    */
+  public String getHostComponentState(String hostName, String componentName) {
+
+    boolean healthy = stateProvider.getRunningState(hostName, componentName) == StateProvider.State.Running;
+    return healthy ? "STARTED" : "INSTALLED";
+  }
+
+  /**
+   * Set the host component state for the given host name and component name.
+   *
+   * @param hostName       the host name
+   * @param componentName  the component name
+   *
+   * @return the request id
+   */
+  public int setHostComponentState(String hostName, String componentName, String state) {
+    StateProvider.State s = state.equals("STARTED") ? StateProvider.State.Running :
+        state.equals("INSTALLED") ? StateProvider.State.Stopped : StateProvider.State.Unknown;
+
+    int requestId = -1;
+
+    if (s != StateProvider.State.Unknown) {
+      requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), -1,
+          "Set host component " + componentName + " state to " + s);
+    }
+    return requestId;
+  }
+
+  /**
+   * Return the process that is associated with the given id.
+   *
+   * @param id  the id
+   *
+   * @return the process
+   */
+  public StateProvider.Process getProcess(Integer id) {
+    return processes.get(id);
+  }
+
+  /**
+   * Get the set of request resources.
+   *
+   * @return the set of request resources
+   */
+  public Set<Resource> getRequestResources() {
+    return requestResources;
+  }
+
+  /**
+   * Get the set of task resources
+   *
+   * @return the set of task resources
+   */
+  public Set<Resource> getTaskResources() {
+    return taskResources;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  // record a process and create the corresponding request and task resource
+  private synchronized int recordProcess(StateProvider.Process process, int requestId, String context) {
+
+    if (requestId == -1) {
+      requestId = nextRequestId++;
+
+      Resource request = new ResourceImpl(Resource.Type.Request);
+
+      request.setProperty(RequestProvider.REQUEST_ID_PROPERTY_ID, requestId);
+      request.setProperty(RequestProvider.REQUEST_CLUSTER_NAME_PROPERTY_ID, clusterName);
+      request.setProperty(RequestProvider.REQUEST_CONTEXT_ID, context);
+
+      requestResources.add(request);
+    }
+
+    Resource task = new ResourceImpl(Resource.Type.Task);
+    int taskId = nextTaskId++;
+
+    taskResources.add(task);
+
+    task.setProperty(TaskProvider.TASK_ID_PROPERTY_ID, taskId);
+    task.setProperty(TaskProvider.TASK_REQUEST_ID_PROPERTY_ID, requestId);
+    task.setProperty(TaskProvider.TASK_CLUSTER_NAME_PROPERTY_ID, clusterName);
+
+    processes.put(taskId, process);
+    return requestId;
+  }
+
+  /**
+   * Read the MSI cluster definition file.
+   */
+  private void readClusterDefinition() throws IOException {
+
+    InputStream is = definitionProvider.getInputStream();
+    try {
+      BufferedReader br = new BufferedReader(new InputStreamReader(is));
+
+      String  line;
+      boolean hostsSection = false;
+
+      while ((line = br.readLine()) != null) {
+        line = line.trim();
+
+
+        if (line.startsWith(HEADER_TAG)) {
+
+          String header = line.substring(HEADER_TAG.length());
+          hostsSection = header.equals(HOSTS_HEADER);
+
+          if (!hostsSection && (header.startsWith(HOSTS_HEADER) ) ){
+            char c = header.charAt(HOSTS_HEADER.length());
+            hostsSection = c == ' ' || c == '(';
+          }
+        } else {
+          if (hostsSection) {
+
+            int i = line.indexOf('=');
+            if (i > -1) {
+
+              String name = line.substring(0, i);
+              String hostLine = line.substring(i + 1);
+
+              Set<String> componentNames = componentNameMap.get(name);
+
+              if (componentNames != null) {
+
+                for (String componentName : componentNames) {
+
+
+                  String serviceName = componentServiceMap.get(componentName);
+
+                  services.add(serviceName);
+                  Set<String> serviceComponents = components.get(serviceName);
+                  if (serviceComponents == null) {
+                    serviceComponents = new HashSet<String>();
+                    components.put(serviceName, serviceComponents);
+                  }
+                  serviceComponents.add(componentName);
+
+                  Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
+                  if (serviceHostComponents == null) {
+                    serviceHostComponents = new HashMap<String, Set<String>>();
+                    hostComponents.put(serviceName, serviceHostComponents);
+                  }
+
+                  String[] hostNames = hostLine.split(",");
+                  for (String hostName : hostNames) {
+
+                    hostName = hostName.trim();
+
+                    Set<String> hostHostComponents = serviceHostComponents.get(hostName);
+                    if (hostHostComponents == null) {
+                      hostHostComponents = new HashSet<String>();
+                      serviceHostComponents.put(hostName, hostHostComponents);
+                    }
+                    hostHostComponents.add(componentName);
+
+                    hosts.add(hostName);
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    } finally {
+      is.close();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterProvider.java
new file mode 100644
index 0000000..908cc14
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterProvider.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.msi;
+
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Map;
+
+/**
+ * A cluster resource provider for a MSI defined cluster.
+ */
+public class ClusterProvider extends BaseResourceProvider {
+
+  // Clusters
+  protected static final String CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("Clusters", "cluster_name");
+  protected static final String CLUSTER_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "version");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public ClusterProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Cluster, clusterDefinition);
+    initClusterResources();
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+    // Do nothing
+  }
+
+  @Override
+  public int updateProperties(Resource resource, Map<String, Object> properties) {
+    // Do nothing
+    return -1;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create the resources based on the cluster definition.
+   */
+  private void initClusterResources() {
+    Resource cluster = new ResourceImpl(Resource.Type.Cluster);
+    ClusterDefinition clusterDefinition = getClusterDefinition();
+    cluster.setProperty(CLUSTER_NAME_PROPERTY_ID, clusterDefinition.getClusterName());
+    cluster.setProperty(CLUSTER_VERSION_PROPERTY_ID, clusterDefinition.getVersionId());
+
+    addResource(cluster);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ComponentProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ComponentProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ComponentProvider.java
new file mode 100644
index 0000000..46eacb4
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ComponentProvider.java
@@ -0,0 +1,102 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.msi;
+
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A component resource provider for a MSI defined cluster.
+ */
+public class ComponentProvider extends BaseResourceProvider {
+
+  // Components
+  protected static final String COMPONENT_CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name");
+  protected static final String COMPONENT_SERVICE_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("ServiceComponentInfo", "service_name");
+  protected static final String COMPONENT_COMPONENT_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name");
+  protected static final String COMPONENT_STATE_PROPERTY_ID           = PropertyHelper.getPropertyId("ServiceComponentInfo", "state");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public ComponentProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Component, clusterDefinition);
+    initComponentResources();
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+
+    Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+    if (contains(propertyIds, COMPONENT_STATE_PROPERTY_ID)) {
+      String serviceName   = (String) resource.getPropertyValue(COMPONENT_SERVICE_NAME_PROPERTY_ID);
+      String componentName = (String) resource.getPropertyValue(COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+      resource.setProperty(COMPONENT_STATE_PROPERTY_ID, getClusterDefinition().getComponentState(serviceName, componentName));
+    }
+  }
+
+  @Override
+  public int updateProperties(Resource resource, Map<String, Object> properties) {
+    int requestId = -1;
+    if (properties.containsKey(COMPONENT_STATE_PROPERTY_ID)) {
+      String state         = (String) properties.get(COMPONENT_STATE_PROPERTY_ID);
+      String serviceName   = (String) resource.getPropertyValue(COMPONENT_SERVICE_NAME_PROPERTY_ID);
+      String componentName = (String) resource.getPropertyValue(COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+
+      requestId = getClusterDefinition().setComponentState(serviceName, componentName, state);
+    }
+    return requestId;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create the resources based on the cluster definition.
+   */
+  private void initComponentResources() {
+    String      clusterName = getClusterDefinition().getClusterName();
+    Set<String> services    = getClusterDefinition().getServices();
+    for (String serviceName : services) {
+      Set<String> components = getClusterDefinition().getComponents(serviceName);
+      for (String componentName : components) {
+        Resource component = new ResourceImpl(Resource.Type.Component);
+        component.setProperty(COMPONENT_CLUSTER_NAME_PROPERTY_ID, clusterName);
+        component.setProperty(COMPONENT_SERVICE_NAME_PROPERTY_ID, serviceName);
+        component.setProperty(COMPONENT_COMPONENT_NAME_PROPERTY_ID, componentName);
+
+        addResource(component);
+      }
+    }
+  }
+}