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:51 UTC

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

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/HostComponentProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostComponentProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostComponentProvider.java
new file mode 100644
index 0000000..784089e
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostComponentProvider.java
@@ -0,0 +1,112 @@
+/**
+ * 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 host component resource provider for a MSI defined cluster.
+ */
+public class HostComponentProvider extends BaseResourceProvider {
+
+  // Host Components
+  protected static final String HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("HostRoles", "cluster_name");
+  protected static final String HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("HostRoles", "service_name");
+  protected static final String HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "component_name");
+  protected static final String HOST_COMPONENT_HOST_NAME_PROPERTY_ID      = PropertyHelper.getPropertyId("HostRoles", "host_name");
+  protected static final String HOST_COMPONENT_STATE_PROPERTY_ID          = PropertyHelper.getPropertyId("HostRoles", "state");
+  protected static final String HOST_COMPONENT_DESIRED_STATE_PROPERTY_ID  = PropertyHelper.getPropertyId("HostRoles", "desired_state");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public HostComponentProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.HostComponent, clusterDefinition);
+    initHostComponentResources();
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+    Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+    if (contains(propertyIds, HOST_COMPONENT_STATE_PROPERTY_ID) ||
+        contains(propertyIds, HOST_COMPONENT_DESIRED_STATE_PROPERTY_ID)) {
+      String componentName = (String) resource.getPropertyValue(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+      String hostName      = (String) resource.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+
+      String hostComponentState = getClusterDefinition().getHostComponentState(hostName, componentName);
+
+      resource.setProperty(HOST_COMPONENT_STATE_PROPERTY_ID, hostComponentState);
+      resource.setProperty(HOST_COMPONENT_DESIRED_STATE_PROPERTY_ID, hostComponentState);
+    }
+  }
+
+  @Override
+  public int updateProperties(Resource resource, Map<String, Object> properties) {
+    int requestId = -1;
+    if (properties.containsKey(HOST_COMPONENT_STATE_PROPERTY_ID)) {
+      String state         = (String) properties.get(HOST_COMPONENT_STATE_PROPERTY_ID);
+      String componentName = (String) resource.getPropertyValue(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+      String hostName      = (String) resource.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+
+      requestId = getClusterDefinition().setHostComponentState(hostName, componentName, state);
+    }
+    return requestId;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create the resources based on the cluster definition.
+   */
+  private void initHostComponentResources() {
+    String      clusterName = getClusterDefinition().getClusterName();
+    Set<String> services    = getClusterDefinition().getServices();
+    for (String serviceName : services) {
+      Set<String> hosts = getClusterDefinition().getHosts();
+      for (String hostName : hosts) {
+        Set<String> hostComponents = getClusterDefinition().getHostComponents(serviceName, hostName);
+        for (String componentName : hostComponents) {
+          Resource hostComponent = new ResourceImpl(Resource.Type.HostComponent);
+          hostComponent.setProperty(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID, clusterName);
+          hostComponent.setProperty(HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID, serviceName);
+          hostComponent.setProperty(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID, componentName);
+          hostComponent.setProperty(HOST_COMPONENT_HOST_NAME_PROPERTY_ID, hostName);
+
+          addResource(hostComponent);
+        }
+      }
+    }
+  }
+}

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/HostProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostProvider.java
new file mode 100644
index 0000000..e0ddd9d
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/HostProvider.java
@@ -0,0 +1,111 @@
+/**
+ * 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.spi.SystemException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A host resource provider for a MSI defined cluster.
+ */
+public class HostProvider extends BaseResourceProvider {
+
+  // Hosts
+  protected static final String HOST_CLUSTER_NAME_PROPERTY_ID =
+      PropertyHelper.getPropertyId("Hosts", "cluster_name");
+  protected static final String HOST_NAME_PROPERTY_ID =
+      PropertyHelper.getPropertyId("Hosts", "host_name");
+  protected static final String HOST_STATE_PROPERTY_ID =
+      PropertyHelper.getPropertyId("Hosts", "host_state");
+  protected static final String HOST_IP_PROPERTY_ID =
+      PropertyHelper.getPropertyId("Hosts", "ip");
+
+
+  // ----- Constants ---------------------------------------------------------
+
+  protected final static Logger LOG =
+      LoggerFactory.getLogger(HostProvider.class);
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public HostProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Host, clusterDefinition);
+    initHostResources();
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+    Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+    if (contains(propertyIds, HOST_STATE_PROPERTY_ID)) {
+      String hostName = (String) resource.getPropertyValue(HOST_NAME_PROPERTY_ID);
+      resource.setProperty(HOST_STATE_PROPERTY_ID, getClusterDefinition().getHostState(hostName));
+    }
+  }
+
+  @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 initHostResources() {
+    ClusterDefinition clusterDefinition = getClusterDefinition();
+    String            clusterName       = clusterDefinition.getClusterName();
+    Set<String>       hosts             = clusterDefinition.getHosts();
+
+    for (String hostName : hosts) {
+      Resource host = new ResourceImpl(Resource.Type.Host);
+      host.setProperty(HOST_CLUSTER_NAME_PROPERTY_ID, clusterName);
+      host.setProperty(HOST_NAME_PROPERTY_ID, hostName);
+      try {
+        host.setProperty(HOST_IP_PROPERTY_ID, clusterDefinition.getHostInfoProvider().getHostAddress(hostName));
+      } catch (SystemException e) {
+        if (LOG.isErrorEnabled()) {
+          LOG.error("Can't set host ip address : caught exception", e);
+        }
+      }
+
+      addResource(host);
+    }
+  }
+}

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/NoOpProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/NoOpProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/NoOpProvider.java
new file mode 100644
index 0000000..c5fc58f
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/NoOpProvider.java
@@ -0,0 +1,67 @@
+/**
+ * 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.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A NO-OP resource provider for a MSI defined cluster.
+ */
+public class NoOpProvider extends BaseResourceProvider {
+
+  private final Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
+
+  // ----- 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;
+  }
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  public NoOpProvider(Resource.Type type, ClusterDefinition clusterDefinition) {
+    super(type, clusterDefinition);
+    keyPropertyIds.put(type, "id");
+  }
+
+
+  @Override
+  public Map<Resource.Type, String> getKeyPropertyIds() {
+    return keyPropertyIds;
+  }
+
+  @Override
+  public Set<String> checkPropertyIds(Set<String> propertyIds) {
+    return Collections.emptySet();
+  }
+}

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/RequestProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/RequestProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/RequestProvider.java
new file mode 100644
index 0000000..b38c5c0
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/RequestProvider.java
@@ -0,0 +1,68 @@
+/**
+ * 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.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 request resource provider for a MSI defined cluster.
+ */
+public class RequestProvider extends AbstractResourceProvider {
+
+  // Request properties
+  protected static final String REQUEST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Requests", "cluster_name");
+  protected static final String REQUEST_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("Requests", "id");
+  protected static final String REQUEST_CONTEXT_ID               = PropertyHelper.getPropertyId("Requests", "request_context");
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public RequestProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Request, clusterDefinition);
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  protected Set<Resource> getResources() {
+    return getClusterDefinition().getRequestResources();
+  }
+
+  @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;
+  }
+}

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/ServiceProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ServiceProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ServiceProvider.java
new file mode 100644
index 0000000..023fbf0
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ServiceProvider.java
@@ -0,0 +1,95 @@
+/**
+ * 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 service resource provider for a MSI defined cluster.
+ */
+public class ServiceProvider extends BaseResourceProvider {
+
+  // Services
+  protected static final String SERVICE_CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("ServiceInfo", "cluster_name");
+  protected static final String SERVICE_SERVICE_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("ServiceInfo", "service_name");
+  protected static final String SERVICE_SERVICE_STATE_PROPERTY_ID   = PropertyHelper.getPropertyId("ServiceInfo", "state");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public ServiceProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Service, clusterDefinition);
+    initServiceResources();
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+    Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+    if (contains(propertyIds, SERVICE_SERVICE_STATE_PROPERTY_ID)) {
+      String serviceName = (String) resource.getPropertyValue(SERVICE_SERVICE_NAME_PROPERTY_ID);
+      resource.setProperty(SERVICE_SERVICE_STATE_PROPERTY_ID, getClusterDefinition().getServiceState(serviceName));
+    }
+  }
+
+  @Override
+  public int updateProperties(Resource resource, Map<String, Object> properties) {
+    int requestId = -1;
+    if (properties.containsKey(SERVICE_SERVICE_STATE_PROPERTY_ID)) {
+      String state       = (String) properties.get(SERVICE_SERVICE_STATE_PROPERTY_ID);
+      String serviceName = (String) resource.getPropertyValue(SERVICE_SERVICE_NAME_PROPERTY_ID);
+
+      requestId = getClusterDefinition().setServiceState(serviceName, state);
+    }
+    return requestId;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create the resources based on the cluster definition.
+   */
+  private void initServiceResources() {
+    String      clusterName = getClusterDefinition().getClusterName();
+    Set<String> services    = getClusterDefinition().getServices();
+
+    for (String serviceName : services) {
+      Resource service = new ResourceImpl(Resource.Type.Service);
+      service.setProperty(SERVICE_CLUSTER_NAME_PROPERTY_ID, clusterName);
+      service.setProperty(SERVICE_SERVICE_NAME_PROPERTY_ID, serviceName);
+
+      addResource(service);
+    }
+  }
+}

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/StateProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/StateProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/StateProvider.java
new file mode 100644
index 0000000..dc4b028
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/StateProvider.java
@@ -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
+ *
+ * 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;
+
+/**
+ * Interface to provide component state to the MSI resource provider.
+ */
+public interface StateProvider {
+  /**
+   * Determine whether or not the host component identified by the given host name
+   * and component name is running.
+   *
+   * @param hostName       the host name
+   * @param componentName  the component name
+   *
+   * @return true if the host component is healthy
+   */
+  public State getRunningState(String hostName, String componentName);
+
+  /**
+   * Set the running state of the given component.
+   *
+   * @param hostName       the host name
+   * @param componentName  the component name
+   * @param state          the desired state
+   */
+  public Process setRunningState(String hostName, String componentName, State state);
+
+  /**
+   * Enum of possible states.
+   */
+  public enum State {
+    Stopped,
+    Running,
+    Paused,
+    Unknown
+  }
+
+  public interface Process {
+    public boolean isRunning();
+
+    public int getExitCode();
+
+    public String getOutput();
+
+    public String getError();
+  }
+
+}

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/TaskProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/TaskProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/TaskProvider.java
new file mode 100644
index 0000000..25b531d
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/TaskProvider.java
@@ -0,0 +1,92 @@
+/**
+ * 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.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 task resource provider for a MSI defined cluster.
+ */
+public class TaskProvider extends AbstractResourceProvider {
+
+  // Tasks properties
+  protected static final String TASK_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Tasks", "cluster_name");
+  protected static final String TASK_REQUEST_ID_PROPERTY_ID   = PropertyHelper.getPropertyId("Tasks", "request_id");
+  protected static final String TASK_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("Tasks", "id");
+  protected static final String TASK_STATUS_PROPERTY_ID       = PropertyHelper.getPropertyId("Tasks", "status");
+  protected static final String TASK_EXIT_CODE_PROPERTY_ID    = PropertyHelper.getPropertyId("Tasks", "exit_code");
+  protected static final String TASK_STDERR_PROPERTY_ID       = PropertyHelper.getPropertyId("Tasks", "stderr");
+  protected static final String TASK_STOUT_PROPERTY_ID        = PropertyHelper.getPropertyId("Tasks", "stdout");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a resource provider based on the given cluster definition.
+   *
+   * @param clusterDefinition  the cluster definition
+   */
+  public TaskProvider(ClusterDefinition clusterDefinition) {
+    super(Resource.Type.Task, clusterDefinition);
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  protected Set<Resource> getResources() {
+    return getClusterDefinition().getTaskResources();
+  }
+
+  @Override
+  public void updateProperties(Resource resource, Request request, Predicate predicate) {
+
+    Integer taskId = (Integer) resource.getPropertyValue(TASK_ID_PROPERTY_ID);
+
+    StateProvider.Process process = getClusterDefinition().getProcess(taskId);
+
+    if (process != null) {
+      resource.setProperty(TASK_STATUS_PROPERTY_ID, process.isRunning() ? "IN_PROGRESS" : "COMPLETED");
+
+      Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+
+      if (contains(propertyIds, TASK_EXIT_CODE_PROPERTY_ID)) {
+        resource.setProperty(TASK_EXIT_CODE_PROPERTY_ID, process.getExitCode());
+      }
+      if (contains(propertyIds, TASK_STDERR_PROPERTY_ID)) {
+        resource.setProperty(TASK_STDERR_PROPERTY_ID, process.getError());
+      }
+      if (contains(propertyIds, TASK_STOUT_PROPERTY_ID)) {
+        resource.setProperty(TASK_STOUT_PROPERTY_ID, process.getOutput());
+      }
+    }
+  }
+
+  @Override
+  public int updateProperties(Resource resource, Map<String, Object> properties) {
+    //Do nothing
+    return -1;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/AmbariServer.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/AmbariServer.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/AmbariServer.java
new file mode 100644
index 0000000..9c0b420
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/AmbariServer.java
@@ -0,0 +1,449 @@
+
+/**
+ * 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.scom;
+
+
+import com.google.gson.Gson;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.google.inject.persist.Transactional;
+import com.google.inject.persist.jpa.JpaPersistModule;
+import com.sun.jersey.spi.container.servlet.ServletContainer;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.AmbariPersistFilter;
+import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.HostsMap;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.PersistenceType;
+import org.apache.ambari.server.security.authorization.AmbariLdapAuthenticationProvider;
+import org.apache.ambari.server.security.authorization.AmbariLocalUserDetailsService;
+import org.apache.ambari.server.security.authorization.Users;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.crypto.password.StandardPasswordEncoder;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+import org.springframework.web.filter.DelegatingFilterProxy;
+
+import javax.crypto.BadPaddingException;
+import java.io.File;
+import java.net.BindException;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Main Ambari server class.
+ */
+@Singleton
+public class AmbariServer {
+  /**
+   * The Jetty server.
+   */
+  private Server server = null;
+
+  /**
+   * The Ambari configuration.
+   */
+  @Inject
+  Configuration configuration;
+
+  /**
+   * The Guice injector.
+   */
+  @Inject
+  Injector injector;
+
+
+  // Set the SQLProviderModule for the API providers.
+  static {
+    System.setProperty("provider.module.class", "org.apache.ambari.scom.SQLProviderModule");
+  }
+
+  // ----- Constants ---------------------------------------------------------
+
+  private static final String CONTEXT_PATH = "/";
+
+  private static final String SPRING_CONTEXT_LOCATION =
+      "classpath:META-INF/spring-security.xml";
+
+  /**
+   * The logger.
+   */
+  private static final Logger LOG = LoggerFactory.getLogger(AmbariServer.class);
+
+
+  // ----- AmbariServer ------------------------------------------------------
+
+  public static void main(String[] args) throws Exception {
+    Injector injector = Guice.createInjector(new ControllerModule());
+    injector.getInstance(GuiceJpaInitializer.class);
+
+    AmbariServer ambariServer = null;
+    try {
+      LOG.info("Getting the controller");
+      ambariServer = injector.getInstance(AmbariServer.class);
+
+      ComponentSSLConfiguration.instance().init(ambariServer.configuration);
+      SinkConnectionFactory.instance().init(ambariServer.configuration);
+      ClusterDefinitionProvider.instance().init(ambariServer.configuration);
+
+      ambariServer.run();
+    } catch (Throwable t) {
+      LOG.error("Failed to run the Ambari Server", t);
+      if (ambariServer != null) {
+        ambariServer.stop();
+      }
+      System.exit(-1);
+    }
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  // Run the server
+  private void run() throws Exception {
+    addInMemoryUsers();
+
+    server = new Server();
+
+    try {
+      ClassPathXmlApplicationContext parentSpringAppContext =
+          new ClassPathXmlApplicationContext();
+      parentSpringAppContext.refresh();
+      ConfigurableListableBeanFactory factory = parentSpringAppContext.
+          getBeanFactory();
+      factory.registerSingleton("guiceInjector",
+          injector);
+      factory.registerSingleton("passwordEncoder",
+          injector.getInstance(PasswordEncoder.class));
+      factory.registerSingleton("ambariLocalUserService",
+          injector.getInstance(AmbariLocalUserDetailsService.class));
+      factory.registerSingleton("ambariLdapAuthenticationProvider",
+          injector.getInstance(AmbariLdapAuthenticationProvider.class));
+
+      //Spring Security xml config depends on this Bean
+      String[] contextLocations = {SPRING_CONTEXT_LOCATION};
+      ClassPathXmlApplicationContext springAppContext = new
+          ClassPathXmlApplicationContext(contextLocations, parentSpringAppContext);
+
+      //setting ambari web context
+      ServletContextHandler root = new ServletContextHandler(server, CONTEXT_PATH,
+          ServletContextHandler.SECURITY | ServletContextHandler.SESSIONS);
+
+      //Changing session cookie name to avoid conflicts
+      root.getSessionHandler().getSessionManager().setSessionCookie("AMBARISESSIONID");
+
+      GenericWebApplicationContext springWebAppContext = new GenericWebApplicationContext();
+      springWebAppContext.setServletContext(root.getServletContext());
+      springWebAppContext.setParent(springAppContext);
+      /* Configure web app context */
+      root.setResourceBase(configuration.getWebAppDir());
+
+      root.getServletContext().setAttribute(
+          WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
+          springWebAppContext);
+
+      ServletHolder rootServlet = root.addServlet(DefaultServlet.class, "/");
+      rootServlet.setInitOrder(1);
+
+      //Spring Security Filter initialization
+      DelegatingFilterProxy springSecurityFilter = new DelegatingFilterProxy();
+      springSecurityFilter.setTargetBeanName("springSecurityFilterChain");
+
+      //session-per-request strategy for api
+      root.addFilter(new FilterHolder(injector.getInstance(AmbariPersistFilter.class)), "/api/*", 1);
+
+      if (configuration.getApiAuthentication()) {
+        root.addFilter(new FilterHolder(springSecurityFilter), "/api/*", 1);
+      }
+
+      //Secured connector for 2-way auth
+      SslSelectChannelConnector sslConnectorTwoWay = new
+          SslSelectChannelConnector();
+      sslConnectorTwoWay.setPort(configuration.getTwoWayAuthPort());
+
+      Map<String, String> configsMap = configuration.getConfigsMap();
+      String keystore = configsMap.get(Configuration.SRVR_KSTR_DIR_KEY) +
+          File.separator + configsMap.get(Configuration.KSTR_NAME_KEY);
+      String srvrCrtPass = configsMap.get(Configuration.SRVR_CRT_PASS_KEY);
+      sslConnectorTwoWay.setKeystore(keystore);
+      sslConnectorTwoWay.setTruststore(keystore);
+      sslConnectorTwoWay.setPassword(srvrCrtPass);
+      sslConnectorTwoWay.setKeyPassword(srvrCrtPass);
+      sslConnectorTwoWay.setTrustPassword(srvrCrtPass);
+      sslConnectorTwoWay.setKeystoreType("PKCS12");
+      sslConnectorTwoWay.setTruststoreType("PKCS12");
+      sslConnectorTwoWay.setNeedClientAuth(configuration.getTwoWaySsl());
+
+      //Secured connector for 1-way auth
+      SslContextFactory contextFactory = new SslContextFactory(true);
+      contextFactory.setKeyStorePath(keystore);
+      contextFactory.setTrustStore(keystore);
+      contextFactory.setKeyStorePassword(srvrCrtPass);
+      contextFactory.setKeyManagerPassword(srvrCrtPass);
+      contextFactory.setTrustStorePassword(srvrCrtPass);
+      contextFactory.setKeyStoreType("PKCS12");
+      contextFactory.setTrustStoreType("PKCS12");
+
+      contextFactory.setNeedClientAuth(false);
+      SslSelectChannelConnector sslConnectorOneWay = new SslSelectChannelConnector(contextFactory);
+      sslConnectorOneWay.setPort(configuration.getOneWayAuthPort());
+      sslConnectorOneWay.setAcceptors(2);
+      sslConnectorTwoWay.setAcceptors(2);
+
+      ServletHolder sh = new ServletHolder(ServletContainer.class);
+      sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
+          "com.sun.jersey.api.core.PackagesResourceConfig");
+      sh.setInitParameter("com.sun.jersey.config.property.packages",
+          "org.apache.ambari.server.api.rest;" +
+              "org.apache.ambari.server.api.services;" +
+              "org.apache.ambari.eventdb.webservice;" +
+              "org.apache.ambari.server.api");
+      sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature",
+          "true");
+      root.addServlet(sh, "/api/v1/*");
+      sh.setInitOrder(2);
+
+
+      //Set jetty thread pool
+      server.setThreadPool(new QueuedThreadPool(25));
+
+      /* Configure the API server to use the NIO connectors */
+      SelectChannelConnector apiConnector;
+
+      if (configuration.getApiSSLAuthentication()) {
+        String httpsKeystore = configsMap.get(Configuration.CLIENT_API_SSL_KSTR_DIR_NAME_KEY) +
+            File.separator + configsMap.get(Configuration.CLIENT_API_SSL_KSTR_NAME_KEY);
+        LOG.info("API SSL Authentication is turned on. Keystore - " + httpsKeystore);
+
+        String httpsCrtPass = configsMap.get(Configuration.CLIENT_API_SSL_CRT_PASS_KEY);
+
+        SslSelectChannelConnector sapiConnector = new SslSelectChannelConnector();
+        sapiConnector.setPort(configuration.getClientSSLApiPort());
+        sapiConnector.setKeystore(httpsKeystore);
+        sapiConnector.setTruststore(httpsKeystore);
+        sapiConnector.setPassword(httpsCrtPass);
+        sapiConnector.setKeyPassword(httpsCrtPass);
+        sapiConnector.setTrustPassword(httpsCrtPass);
+        sapiConnector.setKeystoreType("PKCS12");
+        sapiConnector.setTruststoreType("PKCS12");
+        sapiConnector.setMaxIdleTime(configuration.getConnectionMaxIdleTime());
+        apiConnector = sapiConnector;
+      } else {
+        apiConnector = new SelectChannelConnector();
+        apiConnector.setPort(configuration.getClientApiPort());
+        apiConnector.setMaxIdleTime(configuration.getConnectionMaxIdleTime());
+      }
+
+      server.addConnector(apiConnector);
+
+      server.setStopAtShutdown(true);
+      springAppContext.start();
+
+      String osType = configuration.getServerOsType();
+      if (osType == null || osType.isEmpty()) {
+        throw new RuntimeException(Configuration.OS_VERSION_KEY + " is not "
+            + " set in the ambari.properties file");
+      }
+
+      /*
+       * Start the server after controller state is recovered.
+       */
+      server.start();
+      LOG.info("********* Started Server **********");
+
+      server.join();
+      LOG.info("Joined the Server");
+    } catch (BadPaddingException bpe) {
+
+      LOG.error("Bad keystore or private key password. " +
+          "HTTPS certificate re-importing may be required.");
+      throw bpe;
+    } catch (BindException bindException) {
+
+      LOG.error("Could not bind to server port - instance may already be running. " +
+          "Terminating this instance.", bindException);
+      throw bindException;
+    }
+  }
+
+  // Creates default users and roles if in-memory database is used
+  @Transactional
+  private void addInMemoryUsers() {
+    if (getPersistenceType(configuration) == PersistenceType.IN_MEMORY &&
+        configuration.getApiAuthentication()) {
+      LOG.info("In-memory database is used - creating default users");
+      Users users = injector.getInstance(Users.class);
+
+      users.createDefaultRoles();
+      users.createUser("admin", "admin");
+      users.createUser("user", "user");
+      try {
+        users.promoteToAdmin(users.getLocalUser("admin"));
+      } catch (AmbariException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  // Stop the server
+  private void stop() throws Exception {
+    try {
+      server.stop();
+    } catch (Exception e) {
+      LOG.error("Error stopping the server", e);
+    }
+  }
+
+  // get the persistence type for the given configuration
+  private static PersistenceType getPersistenceType(Configuration configuration) {
+    String value = configuration.getProperty(Configuration.SERVER_PERSISTENCE_TYPE_KEY);
+    return value == null ? PersistenceType.IN_MEMORY : PersistenceType.fromString(value);
+  }
+
+
+  // ----- inner class : ControllerModule ------------------------------------
+
+  /**
+   * Used for injection purposes.
+   */
+  private static class ControllerModule extends AbstractModule {
+
+    private final Configuration configuration;
+    private final HostsMap hostsMap;
+
+
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Construct a controller module.
+     */
+    public ControllerModule(){
+      configuration = new Configuration();
+      hostsMap      = new HostsMap(configuration);
+    }
+
+
+    // ----- AbstractModule --------------------------------------------------
+
+    @Override
+    protected void configure() {
+      bind(Configuration.class).toInstance(configuration);
+      bind(HostsMap.class).toInstance(hostsMap);
+      bind(PasswordEncoder.class).toInstance(new StandardPasswordEncoder());
+
+      install(buildJpaPersistModule());
+      bind(Gson.class).in(Scopes.SINGLETON);
+    }
+
+
+    // ----- helper methods --------------------------------------------------
+
+    // Create the JPA persistence module
+    private JpaPersistModule buildJpaPersistModule() {
+      PersistenceType  persistenceType  = getPersistenceType(configuration);
+      JpaPersistModule jpaPersistModule = new JpaPersistModule(Configuration.JDBC_UNIT_NAME);
+      Properties       properties       = new Properties();
+      String           databaseDriver;
+      String           databaseUrl;
+
+      if (persistenceType == PersistenceType.LOCAL) {
+        databaseDriver = configuration.getLocalDatabaseUrl();
+        databaseUrl    = Configuration.JDBC_LOCAL_DRIVER;
+
+      } else {
+        databaseDriver = configuration.getDatabaseDriver();
+        databaseUrl    = configuration.getDatabaseUrl();
+
+        if (persistenceType == PersistenceType.IN_MEMORY) {
+          if(databaseDriver == null){
+            databaseDriver = Configuration.JDBC_IN_MEMROY_DRIVER;
+          }
+          if (databaseUrl == null) {
+            databaseUrl = Configuration.JDBC_IN_MEMORY_URL;
+          }
+        }
+      }
+      if (databaseDriver != null && databaseUrl != null) {
+
+        properties.setProperty("javax.persistence.jdbc.url",    databaseUrl);
+        properties.setProperty("javax.persistence.jdbc.driver", databaseDriver);
+
+        properties.setProperty("eclipselink.logging.level",  "INFO");
+        properties.setProperty("eclipselink.logging.logger", "org.apache.ambari.scom.logging.JpaLogger");
+
+        // custom jdbc properties
+        Map<String, String> custom = configuration.getDatabaseCustomProperties();
+
+        if (0 != custom.size()) {
+          for (Map.Entry<String, String> entry : custom.entrySet()) {
+            properties.setProperty("eclipselink.jdbc.property." + entry.getKey(),
+                entry.getValue());
+          }
+        }
+
+        if (persistenceType == PersistenceType.IN_MEMORY) {
+          properties.setProperty("eclipselink.ddl-generation",       "drop-and-create-tables");
+          properties.setProperty("eclipselink.orm.throw.exceptions", "true");
+          jpaPersistModule.properties(properties);
+        } else {
+          properties.setProperty("javax.persistence.jdbc.user",   configuration.getDatabaseUser());
+          properties.setProperty("javax.persistence.jdbc.password",
+              configuration.getProperty(Configuration.SERVER_JDBC_USER_PASSWD_KEY));
+
+          switch (configuration.getJPATableGenerationStrategy()) {
+            case CREATE:
+              properties.setProperty("eclipselink.ddl-generation", "create-tables");
+              break;
+            case DROP_AND_CREATE:
+              properties.setProperty("eclipselink.ddl-generation", "drop-and-create-tables");
+              break;
+            default:
+              break;
+          }
+          properties.setProperty("eclipselink.ddl-generation.output-mode", "both");
+          properties.setProperty("eclipselink.create-ddl-jdbc-file-name",  "DDL-create.jdbc");
+          properties.setProperty("eclipselink.drop-ddl-jdbc-file-name",    "DDL-drop.jdbc");
+
+          jpaPersistModule.properties(properties);
+        }
+      }
+      return jpaPersistModule;
+    }
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/ClusterDefinitionProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/ClusterDefinitionProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/ClusterDefinitionProvider.java
new file mode 100644
index 0000000..e1f038d
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/ClusterDefinitionProvider.java
@@ -0,0 +1,176 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.configuration.Configuration;
+
+import java.io.InputStream;
+
+/**
+ * Provider for a input stream to the cluster definition file.
+ */
+public class ClusterDefinitionProvider {
+
+  /**
+   * The file name.
+   */
+  private String fileName;
+
+  /**
+   * The cluster name.
+   */
+  private String clusterName;
+
+  /**
+   * The hadoop version Id.
+   */
+  private String versionId;
+
+  /**
+   * The singleton.
+   */
+  private static ClusterDefinitionProvider singleton = new ClusterDefinitionProvider();
+
+  // ----- Constants ---------------------------------------------------------
+
+  protected static final String SCOM_CLUSTER_DEFINITION_FILENAME         = "scom.cluster.definition.filename";
+  protected static final String DEFAULT_SCOM_CLUSTER_DEFINITION_FILENAME = "clusterproperties.txt";
+
+  protected static final String SCOM_CLUSTER_NAME    = "scom.cluster.name";
+  protected static final String DEFAULT_CLUSTER_NAME = "ambari";
+
+  protected static final String SCOM_VERSION_ID    = "scom.version.id";
+  protected static final String DEFAULT_VERSION_ID = "HDP-1.3.0";
+
+
+  // ----- Constructor -------------------------------------------------------
+
+  protected ClusterDefinitionProvider() {
+  }
+
+
+  // ----- ClusterDefinitionProvider -----------------------------------
+
+  /**
+   * Initialize with the given configuration.
+   *
+   * @param configuration  the configuration
+   */
+  public void init(Configuration configuration) {
+    fileName = configuration.getProperty(SCOM_CLUSTER_DEFINITION_FILENAME);
+    if (fileName == null) {
+      fileName = DEFAULT_SCOM_CLUSTER_DEFINITION_FILENAME;
+    }
+
+    clusterName = configuration.getProperty(SCOM_CLUSTER_NAME);
+    if (clusterName == null) {
+      clusterName = DEFAULT_CLUSTER_NAME;
+    }
+
+    versionId = configuration.getProperty(SCOM_VERSION_ID);
+    if (versionId == null) {
+      versionId = DEFAULT_VERSION_ID;
+    }
+  }
+
+  /**
+   * Get the singleton instance.
+   *
+   * @return the singleton instance
+   */
+  public static ClusterDefinitionProvider instance() {
+    return singleton;
+  }
+
+  /**
+   * Get the cluster definition file name.
+   *
+   * @return the file name
+   */
+  public String getFileName() {
+    return fileName;
+  }
+
+  /**
+   * Get the cluster name.
+   *
+   * @return the cluster name
+   */
+  public String getClusterName() {
+    return clusterName;
+  }
+
+  /**
+   * Get the hadoop version Id.
+   *
+   * @return the version Id
+   */
+  public String getVersionId() {
+    return versionId;
+  }
+
+  /**
+   * Set the associated filename.
+   *
+   * @param fileName  the file name
+   */
+  protected void setFileName(String fileName) {
+    this.fileName = fileName;
+  }
+
+  /**
+   * Set the cluster name.
+   *
+   * @param clusterName  the cluster name
+   */
+  protected void setClusterName(String clusterName) {
+    this.clusterName = clusterName;
+  }
+
+  /**
+   * Set the version id.
+   *
+   * @param versionId  the version id
+   */
+  protected void setVersionId(String versionId) {
+    this.versionId = versionId;
+  }
+
+  /**
+   * Get an input stream to the cluster definition file.
+   *
+   * @return an input stream
+   */
+  public InputStream getInputStream() {
+    InputStream is;
+    String name = this.fileName == null ? DEFAULT_SCOM_CLUSTER_DEFINITION_FILENAME : this.fileName;
+
+    try {
+      is = this.getClass().getClassLoader().getResourceAsStream(name);
+
+      if (is == null) {
+        throw new IllegalStateException("Can't find the resource " + name + " in the classpath.");
+      }
+    } catch (Exception e) {
+      String msg = "Caught exception reading " + name + ".";
+      throw new IllegalStateException(msg, e);
+    }
+    return is;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/HostInfoProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/HostInfoProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/HostInfoProvider.java
new file mode 100644
index 0000000..46061a9
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/HostInfoProvider.java
@@ -0,0 +1,63 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.controller.spi.SystemException;
+
+/**
+ * Provider of host information.
+ */
+public interface HostInfoProvider {
+
+  /**
+   * Get the host name for the given cluster name and component name.
+   *
+   * @param clusterName    the cluster name
+   * @param componentName  the component name
+   *
+   * @return the host name
+   *
+   * @throws SystemException if unable to get the host name
+   */
+  public String getHostName(String clusterName, String componentName)
+      throws SystemException;
+
+  /**
+   * Get the host name.
+   *
+   * @param id  the host identifier
+   *
+   * @return the host name
+   *
+   * @throws SystemException if unable to get the host name
+   */
+  public String getHostName(String id)
+      throws SystemException;
+
+  /**
+   * Get the host ip address.
+   *
+   * @param id  the host identifier
+   *
+   * @return the host ip address
+   *
+   * @throws SystemException if unable to get the host address
+   */
+  public String getHostAddress(String id)
+      throws SystemException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
new file mode 100644
index 0000000..49508ea
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
@@ -0,0 +1,304 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
+import org.apache.ambari.server.controller.internal.PropertyInfo;
+import org.apache.ambari.server.controller.jdbc.ConnectionFactory;
+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.spi.SystemException;
+import org.apache.ambari.server.controller.spi.TemporalInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * SQL based property/metrics provider required for ambari-scom.
+ */
+public class SQLPropertyProvider extends AbstractPropertyProvider {
+
+  private final HostInfoProvider hostProvider;
+
+  private final String clusterNamePropertyId;
+
+  private final String hostNamePropertyId;
+
+  private final String componentNamePropertyId;
+
+  private final ConnectionFactory connectionFactory;
+
+
+  // ----- Constants ---------------------------------------------------------
+
+  private static final String GET_METRICS_STATEMENT = "select * from dbo.ufGetMetrics(?, ?, ?, ?, ?, ?, ?)";
+
+  protected final static Logger LOG =
+      LoggerFactory.getLogger(SQLPropertyProvider.class);
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  public SQLPropertyProvider(
+      Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+      HostInfoProvider hostProvider,
+      String clusterNamePropertyId,
+      String hostNamePropertyId,
+      String componentNamePropertyId,
+      ConnectionFactory connectionFactory) {
+    super(componentPropertyInfoMap);
+    this.hostProvider             = hostProvider;
+    this.clusterNamePropertyId    = clusterNamePropertyId;
+    this.hostNamePropertyId       = hostNamePropertyId;
+    this.componentNamePropertyId  = componentNamePropertyId;
+    this.connectionFactory        = connectionFactory;
+  }
+
+
+  // ----- PropertyProvider --------------------------------------------------
+
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate)
+      throws SystemException {
+    Set<Resource> keepers = new HashSet<Resource>();
+    try {
+      Connection connection = connectionFactory.getConnection();
+      try {
+        PreparedStatement preparedStatement = connection.prepareStatement(GET_METRICS_STATEMENT);
+        try {
+          for (Resource resource : resources) {
+            if (populateResource(resource, request, predicate, preparedStatement)) {
+              keepers.add(resource);
+            }
+          }
+        } finally {
+          preparedStatement.close();
+        }
+      } finally {
+        connection.close();
+      }
+    } catch (SQLException e) {
+      if (LOG.isErrorEnabled()) {
+        LOG.error("Error during populateResources call : caught exception", e);
+      }
+      throw new SystemException("Error during populateResources call : caught exception", e);
+    }
+    return keepers;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  // Populate the given resource
+  private boolean populateResource(Resource resource, Request request, Predicate predicate, PreparedStatement preparedStatement) throws SystemException {
+
+    Set<String> ids = getRequestPropertyIds(request, predicate);
+    if (ids.isEmpty()) {
+      // no properties requested ... nothing to do.
+      return true;
+    }
+
+    String componentName = (String) resource.getPropertyValue(componentNamePropertyId);
+
+    if (getComponentMetrics().get(componentName) == null) {
+      // no metrics defined for the given component ... nothing to do.
+      return true;
+    }
+
+    String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId);
+    String hostName    = getHost(resource, clusterName, componentName);
+
+    if (hostName == null) {
+      throw new SystemException(
+          "Unable to get metrics.  No host name for " + componentName, null);
+    }
+
+    for (String id : ids) {
+      Map<String, PropertyInfo> propertyInfoMap = getPropertyInfoMap(componentName, id);
+
+      for (Map.Entry<String, PropertyInfo> entry: propertyInfoMap.entrySet()) {
+        String       propertyKey  = entry.getKey();
+        PropertyInfo propertyInfo = entry.getValue();
+        String       propertyId   = propertyInfo.getPropertyId();
+        TemporalInfo temporalInfo = request.getTemporalInfo(id);
+
+        if ((propertyInfo.isPointInTime() && temporalInfo == null) ||
+            (propertyInfo.isTemporal()    && temporalInfo != null)) {
+
+          long startTime;
+          long endTime;
+
+          if (temporalInfo != null) {
+            Long endTimeSeconds = temporalInfo.getEndTime();
+
+            endTime   = endTimeSeconds != -1 ? endTimeSeconds * 1000 : Long.MAX_VALUE;
+            startTime = temporalInfo.getStartTime() * 1000;
+          } else {
+            startTime = 0L;
+            endTime   = Long.MAX_VALUE;
+          }
+
+          String[] parts = propertyId.split("\\.");
+          int      size  = parts.length;
+
+          if (size >= 3) {
+            List<DataPoint> dataPoints = getMetric(startTime, endTime, parts[size - 3], parts[size - 2], parts[size - 1],
+                                                   componentName.toLowerCase(), hostName, preparedStatement);
+
+            if (dataPoints != null) {
+              if (temporalInfo == null){
+                // return the value of the last data point
+                int          length = dataPoints.size();
+                Serializable value  = length > 0 ? dataPoints.get(length - 1).getValue() : 0;
+                resource.setProperty(propertyKey, value);
+              } else {
+
+                Number[][] dp = new Number[dataPoints.size()][2];
+                for (int i = 0; i < dp.length; i++) {
+                  dp[i][0] = dataPoints.get(i).getValue();
+                  dp[i][1] = dataPoints.get(i).getTimestamp();
+                }
+                resource.setProperty(propertyKey, dp);
+              }
+            }
+          } else {
+            if (LOG.isWarnEnabled()) {
+              LOG.warn("Can't get metrics for " + id + " : " + propertyId);
+            }
+          }
+        }
+      }
+    }
+
+    return true;
+  }
+
+  // get a metric from a sql connection
+  private List<DataPoint> getMetric(long startTime, long endTime, String recordTypeContext,
+                        String recordTypeName, String metricName, String serviceName, String nodeName,
+                        PreparedStatement preparedStatement) throws SystemException {
+
+    if (recordTypeContext == null || recordTypeName == null || nodeName == null) {
+      return null;
+    }
+
+    int columnId = 1;
+    List<DataPoint> results;
+    try {
+      preparedStatement.clearParameters();
+
+      preparedStatement.setLong(columnId++, startTime);
+      preparedStatement.setLong(columnId++, endTime);
+      preparedStatement.setNString(columnId++, recordTypeContext);
+      preparedStatement.setNString(columnId++, recordTypeName);
+      preparedStatement.setNString(columnId++, metricName);
+      preparedStatement.setNString(columnId++, serviceName);
+      preparedStatement.setNString(columnId, nodeName);
+
+      ResultSet rs = preparedStatement.executeQuery();
+
+      results = new LinkedList<DataPoint>();
+
+      if (rs != null) {
+
+        //(RecordTimeStamp bigint, MetricValue NVARCHAR(512))
+        while (rs.next()) {
+
+          ParsePosition parsePosition = new ParsePosition(0);
+          NumberFormat  numberFormat  = NumberFormat.getInstance();
+          Number        parsedNumber  = numberFormat.parse(rs.getNString("MetricValue"), parsePosition);
+
+          results.add(new DataPoint(rs.getLong("RecordTimeStamp"), parsedNumber));
+        }
+      }
+    } catch (SQLException e) {
+      throw new SystemException("Error during getMetric call : caught exception - ", e);
+    }
+    return results;
+  }
+
+  // get the hostname for a given resource
+  private String getHost(Resource resource, String clusterName, String componentName) throws SystemException {
+    return hostNamePropertyId == null ?
+        hostProvider.getHostName(clusterName, componentName) :
+        hostProvider.getHostName((String) resource.getPropertyValue(hostNamePropertyId));
+  }
+
+
+  // ----- inner class : DataPoint -------------------------------------------
+
+  /**
+   * Structure to hold a single datapoint (value/timestamp pair) retrieved from the db.
+   */
+  private static class DataPoint {
+    private final long timestamp;
+    private final Number value;
+
+    // ----- Constructor -------------------------------------------------
+
+    /**
+     * Construct a data point from the given value and timestamp.
+     *
+     * @param timestamp  the timestamp
+     * @param value      the value
+     */
+    private DataPoint(long timestamp, Number value) {
+      this.timestamp = timestamp;
+      this.value = value;
+    }
+
+    // ----- DataPoint ---------------------------------------------------
+
+    /**
+     * Get the timestamp value.
+     * @return the timestamp
+     */
+    public long getTimestamp() {
+      return timestamp;
+    }
+
+    /**
+     * Get the value.
+     * @return the value
+     */
+    public Number getValue() {
+      return value;
+    }
+
+    // ----- Object overrides --------------------------------------------
+
+    @Override
+    public String toString() {
+      return "{" +value + " : " + timestamp + "}";
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java
new file mode 100644
index 0000000..b51f97a
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java
@@ -0,0 +1,332 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.msi.AbstractResourceProvider;
+import org.apache.ambari.msi.ClusterDefinition;
+import org.apache.ambari.msi.StateProvider;
+import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
+import org.apache.ambari.server.controller.internal.DefaultProviderModule;
+import org.apache.ambari.server.controller.internal.URLStreamProvider;
+import org.apache.ambari.server.controller.jdbc.ConnectionFactory;
+import org.apache.ambari.server.controller.jmx.JMXPropertyProvider;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Provider module used to install PropertyProviders required for ambari-scom.
+ */
+public class SQLProviderModule extends DefaultProviderModule implements HostInfoProvider, StateProvider {
+  private final ClusterDefinition clusterDefinition;
+
+  // TODO : these elements should be injected...
+  private final ConnectionFactory connectionFactory = SinkConnectionFactory.instance();
+  private final ComponentSSLConfiguration sslConfiguration = ComponentSSLConfiguration.instance();
+  private final URLStreamProvider urlStreamProvider = new URLStreamProvider(5000, 10000,
+      sslConfiguration.getTruststorePath(), sslConfiguration.getTruststorePassword(), sslConfiguration.getTruststoreType());
+
+
+  // ----- Constants ---------------------------------------------------------
+
+  private static Map<String, String> serviceNames = new HashMap<String, String>();
+
+  static {
+    serviceNames.put("NAMENODE",           "namenode");
+    serviceNames.put("SECONDARY_NAMENODE", "secondarynamenode");
+    serviceNames.put("JOBTRACKER",         "jobtracker");
+    serviceNames.put("HISTORY_SERVER",     "historyserver");
+    serviceNames.put("HIVE_SERVER",        "hiveserver");
+    serviceNames.put("HIVE_SERVER2",       "hiveserver2");
+    serviceNames.put("HIVE_METASTORE",     "metastore");
+    serviceNames.put("HIVE_CLIENT",        "hwi");
+    serviceNames.put("OOZIE_SERVER",       "oozieservice");
+    serviceNames.put("FLUME_SERVER",       "flumagent");
+    serviceNames.put("HBASE_MASTER",       "master");
+    serviceNames.put("HBASE_REGIONSERVER", "regionserver");
+    serviceNames.put("ZOOKEEPER_SERVER",   "zkServer");
+    serviceNames.put("DATANODE",           "datanode");
+    serviceNames.put("TASKTRACKER",        "tasktracker");
+    serviceNames.put("WEBHCAT_SERVER",     "templeton");
+  }
+
+  private static final String STATE_PREFIX = "STATE              : ";
+
+
+  // ----- Constructor -------------------------------------------------------
+
+  public SQLProviderModule() {
+    clusterDefinition = new ClusterDefinition(this, ClusterDefinitionProvider.instance(), this);
+  }
+
+
+  // ----- AbstractProviderModule --------------------------------------------
+
+  @Override
+  protected ResourceProvider createResourceProvider(Resource.Type type) {
+    return AbstractResourceProvider.getResourceProvider(type, clusterDefinition);
+  }
+
+  @Override
+  protected void createPropertyProviders(Resource.Type type) {
+
+    List<PropertyProvider> providers = new LinkedList<PropertyProvider>();
+
+    switch (type) {
+      case Component:
+
+        providers.add(new JMXPropertyProvider(
+            PropertyHelper.getJMXPropertyIds(type, PropertyHelper.MetricsVersion.HDP1),
+            urlStreamProvider,
+            this,
+            PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
+            null,
+            PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name"),
+            PropertyHelper.getPropertyId("ServiceComponentInfo", "state"),
+            Collections.singleton("STARTED")));
+
+        providers.add(new SQLPropertyProvider(
+            PropertyHelper.getGangliaPropertyIds(type, PropertyHelper.MetricsVersion.HDP1),
+            this,
+            PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
+            null,
+            PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name"),
+            connectionFactory));
+        break;
+      case HostComponent:
+
+        providers.add(new JMXPropertyProvider(
+            PropertyHelper.getJMXPropertyIds(type, PropertyHelper.MetricsVersion.HDP1),
+            urlStreamProvider,
+            this,
+            PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
+            PropertyHelper.getPropertyId("HostRoles", "host_name"),
+            PropertyHelper.getPropertyId("HostRoles", "component_name"),
+            PropertyHelper.getPropertyId("HostRoles", "state"),
+            Collections.singleton("STARTED")));
+
+        providers.add(new SQLPropertyProvider(
+            PropertyHelper.getGangliaPropertyIds(type, PropertyHelper.MetricsVersion.HDP1),
+            this,
+            PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
+            PropertyHelper.getPropertyId("HostRoles", "host_name"),
+            PropertyHelper.getPropertyId("HostRoles", "component_name"),
+            connectionFactory));
+        break;
+      default:
+        break;
+    }
+    putPropertyProviders(type, providers);
+  }
+
+  // ----- HostProvider ------------------------------------------------------
+
+  @Override
+  public String getHostName(String clusterName, String componentName) throws SystemException {
+    return getClusterNodeName(super.getHostName(clusterName, componentName));
+  }
+
+  @Override
+  public String getHostName(String id) throws SystemException {
+    return getClusterNodeName(id);
+  }
+
+  @Override
+  public String getHostAddress(String id) throws SystemException {
+    return getClusterHostAddress(id);
+  }
+
+
+  // ----- StateProvider -----------------------------------------------------
+
+  @Override
+  public State getRunningState(String hostName, String componentName) {
+    String serviceName = getServiceName(componentName);
+    if (serviceName != null) {
+      String[] cmdStrings = {"sc", "\\\\" + hostName, "query", "\"" + serviceName + "\""}; // Windows specific command
+
+      java.lang.Process process = runProcess(cmdStrings);
+
+      if (process.exitValue() == 0) {
+
+        String response = getProcessResponse(process.getInputStream());
+
+        int i = response.indexOf(STATE_PREFIX);
+        if (i >= 0) {
+          int state = Integer.parseInt(response.substring(i + STATE_PREFIX.length(), i + STATE_PREFIX.length() + 1));
+          switch (state) {
+            case (1): // service stopped
+              return State.Stopped;
+            case (4): // service started
+              return State.Running;
+          }
+        }
+      }
+    }
+    return State.Unknown;
+  }
+
+  @Override
+  public Process setRunningState(String hostName, String componentName, State state) {
+    String serviceName = getServiceName(componentName);
+    if (serviceName != null) {
+      String command = state == State.Running ? "start" : "stop";
+      String[] cmdStrings = {"sc", "\\\\" + hostName, command, "\"" + serviceName + "\""};  // Windows specific command
+
+      return new StateProcess(runProcess(cmdStrings));
+    }
+    return null;
+  }
+
+
+  // ----- utility methods ---------------------------------------------------
+
+  // get the hostname
+  private String getClusterNodeName(String hostname) throws SystemException {
+    try {
+      if (hostname.equalsIgnoreCase("localhost")) {
+        return InetAddress.getLocalHost().getCanonicalHostName();
+      }
+      return InetAddress.getByName(hostname).getCanonicalHostName();
+    } catch (Exception e) {
+      throw new SystemException("Error getting hostname.", e);
+    }
+  }
+
+  // get the hostname
+  private String getClusterHostAddress(String hostname) throws SystemException {
+    try {
+      if (hostname.equalsIgnoreCase("localhost")) {
+        return InetAddress.getLocalHost().getHostAddress();
+      }
+      return InetAddress.getByName(hostname).getHostAddress();
+    } catch (Exception e) {
+      throw new SystemException("Error getting ip address.", e);
+    }
+  }
+
+  // get the Windows service name from the given component name
+  private String getServiceName(String componentName) {
+    return serviceNames.get(componentName);
+  }
+
+  // run a process specified by the given command strings
+  private java.lang.Process runProcess(String... commands) {
+    Runtime runtime = Runtime.getRuntime();
+    java.lang.Process process;
+    try {
+      process = runtime.exec(commands);
+
+      process.waitFor();
+    } catch (Exception e) {
+      return null;
+    }
+    return process;
+  }
+
+  // get the response text from a completed process stream
+  private static String getProcessResponse(InputStream stream) {
+
+    StringBuilder  sb       = new StringBuilder();
+    BufferedReader stdInput = new BufferedReader(new InputStreamReader(stream));
+
+    try {
+
+      String line;
+
+      while ((line = stdInput.readLine()) != null) {
+        sb.append(line);
+      }
+
+    } catch (Exception e) {
+      return null;
+    }
+    return sb.toString();
+  }
+
+
+  // ----- inner class : StateProcess ----------------------------------------
+
+  public static class StateProcess implements Process {
+    private final java.lang.Process process;
+    private String output = null;
+    private String error = null;
+
+    public StateProcess(java.lang.Process process) {
+      this.process = process;
+    }
+
+    @Override
+    public boolean isRunning() {
+      try {
+        process.exitValue();
+      } catch (IllegalThreadStateException e) {
+        return true;
+      }
+      return false;
+    }
+
+    @Override
+    public int getExitCode() {
+      return process.exitValue();
+    }
+
+    @Override
+    public String getOutput() {
+      if (output != null) {
+        return output;
+      }
+
+      String processResponse = getProcessResponse(process.getInputStream());
+
+      if (!isRunning()){
+        output = processResponse;
+      }
+
+      return processResponse;
+    }
+
+    @Override
+    public String getError() {
+      if (error != null) {
+        return error;
+      }
+
+      String processResponse = getProcessResponse(process.getErrorStream());
+
+      if (!isRunning()){
+        error = processResponse;
+      }
+
+      return processResponse;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SinkConnectionFactory.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SinkConnectionFactory.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SinkConnectionFactory.java
new file mode 100644
index 0000000..2729797
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SinkConnectionFactory.java
@@ -0,0 +1,120 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.jdbc.ConnectionFactory;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+/**
+ * Factory for the sink database connection.
+ */
+public class SinkConnectionFactory implements ConnectionFactory {
+
+  /**
+   * The database URL.
+   */
+  private String databaseUrl;
+
+  /**
+   * The database driver.
+   */
+  private String databaseDriver;
+
+  /**
+   * Indicates whether or not the driver has been initialized
+   */
+  private boolean connectionInitialized = false;
+
+  /**
+   * The singleton.
+   */
+  private static SinkConnectionFactory singleton = new SinkConnectionFactory();
+
+  // ----- Constants ---------------------------------------------------------
+
+  protected static final String SCOM_SINK_DB_URL    = "scom.sink.db.url";
+  protected static final String SCOM_SINK_DB_DRIVER = "scom.sink.db.driver";
+
+
+  // ----- Constructor -------------------------------------------------------
+
+  protected SinkConnectionFactory() {
+  }
+
+
+  // ----- SinkConnectionFactory ---------------------------------------------
+
+  /**
+   * Initialize with the given configuration.
+   *
+   * @param configuration  the configuration
+   */
+  public void init(Configuration configuration) {
+    this.databaseUrl    = configuration.getProperty(SCOM_SINK_DB_URL);
+    this.databaseDriver = configuration.getProperty(SCOM_SINK_DB_DRIVER);
+  }
+
+  /**
+   * Get the singleton instance.
+   *
+   * @return the singleton instance
+   */
+  public static SinkConnectionFactory instance() {
+    return singleton;
+  }
+
+  /**
+   * Get the database URL.
+   *
+   * @return the database URL
+   */
+  public String getDatabaseUrl() {
+    return databaseUrl;
+  }
+
+  /**
+   * Get the database driver.
+   *
+   * @return the database driver
+   */
+  public String getDatabaseDriver() {
+    return databaseDriver;
+  }
+
+// ----- ConnectionFactory -----------------------------------------------
+
+  @Override
+  public Connection getConnection() throws SQLException {
+    synchronized (this) {
+      if (!connectionInitialized) {
+        connectionInitialized = true;
+        try {
+          Class.forName(databaseDriver);
+        } catch (ClassNotFoundException e) {
+          throw new SQLException("Can't load the driver class.", e);
+        }
+      }
+    }
+    return DriverManager.getConnection(databaseUrl);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/logging/JpaLogger.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/logging/JpaLogger.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/logging/JpaLogger.java
new file mode 100644
index 0000000..c9d7bdf
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/logging/JpaLogger.java
@@ -0,0 +1,185 @@
+/**
+ * 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.scom.logging;
+
+import org.eclipse.persistence.logging.AbstractSessionLog;
+import org.eclipse.persistence.logging.EclipseLinkLogRecord;
+import org.eclipse.persistence.logging.SessionLogEntry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * Logger for JPA log messages.
+ */
+public class JpaLogger extends AbstractSessionLog {
+
+  /**
+   * The formatter.
+   */
+  private final Formatter formatter = new SimpleFormatter();
+
+  /**
+   * The log level.
+   */
+  public Level logLevel = Level.WARNING;
+
+
+  // ----- Constants ---------------------------------------------------------
+
+  /**
+   * The logger.
+   */
+  private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(JpaLogger.class);
+
+  /**
+   * The java log levels.
+   */
+  public static final Level[] JAVA_LOG_LEVELS = new Level[]{
+      Level.ALL,     Level.FINEST, Level.FINER,
+      Level.FINE,    Level.CONFIG, Level.INFO,
+      Level.WARNING, Level.SEVERE, Level.OFF
+  };
+
+
+  // ----- AbstractSessionLog ------------------------------------------------
+
+  @Override
+  public void log(SessionLogEntry sessionLogEntry) {
+
+    Logger logger = getLogger();
+
+    switch (sessionLogEntry.getLevel()) {
+      case SEVERE:
+        logger.error(getLogMessage(sessionLogEntry));
+        break;
+
+      case WARNING:
+        logger.warn(getLogMessage(sessionLogEntry));
+        break;
+
+      case INFO:
+      case CONFIG:
+        logger.info(getLogMessage(sessionLogEntry));
+        break;
+
+      case FINE:
+      case FINER:
+      case FINEST:
+        logger.debug(getLogMessage(sessionLogEntry));
+        break;
+
+      case ALL:
+        logger.trace(getLogMessage(sessionLogEntry));
+        break;
+    }
+  }
+
+  @Override
+  public void throwing(Throwable throwable) {
+    getLogger().error(null, throwable);
+  }
+
+  @Override
+  public boolean shouldLog(int level, String category) {
+    return getJavaLogLevel(level).intValue() >= logLevel.intValue();
+  }
+
+
+// ----- accessors ---------------------------------------------------------
+
+  /**
+   * Get the log level.
+   *
+   * @return the log level
+   */
+  public Level getLogLevel() {
+    return logLevel;
+  }
+
+  /**
+   * Set the log level.
+   *
+   * @param logLevel the log level
+   */
+  public void setLogLevel(Level logLevel) {
+    this.logLevel = logLevel;
+  }
+
+  /**
+   * Get the associated logger.
+   *
+   * @return the logger
+   */
+  protected org.slf4j.Logger getLogger() {
+    return LOG;
+  }
+
+  /**
+   * Get the associated formatter.
+   *
+   * @return the formatter
+   */
+  protected Formatter getFormatter() {
+    return formatter;
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  // gets the log message from the given session log entry
+  private String getLogMessage(SessionLogEntry sessionLogEntry) {
+    return getFormatter().format(getLogRecord(sessionLogEntry,
+        getJavaLogLevel(sessionLogEntry.getLevel())));
+  }
+
+  // get a log record for the given session log entry
+  private EclipseLinkLogRecord getLogRecord(SessionLogEntry sessionLogEntry, Level level) {
+    EclipseLinkLogRecord logRecord =
+        new EclipseLinkLogRecord(level, formatMessage(sessionLogEntry));
+
+    logRecord.setLoggerName(sessionLogEntry.getNameSpace());
+    logRecord.setShouldPrintDate(shouldPrintDate());
+    logRecord.setShouldPrintThread(shouldPrintThread());
+
+    Throwable exception = sessionLogEntry.getException();
+    if (exception != null) {
+      logRecord.setThrown(exception);
+      logRecord.setShouldLogExceptionStackTrace(shouldLogExceptionStackTrace());
+    }
+
+    if (shouldPrintConnection()) {
+      logRecord.setConnection(sessionLogEntry.getConnection());
+    }
+
+    if (shouldPrintSession()) {
+      logRecord.setSessionString(getSessionString(sessionLogEntry.getSession()));
+    }
+
+    return logRecord;
+  }
+
+  // get the Java log level for the given eclipse log level
+  private static Level getJavaLogLevel(int level) {
+    return level >= ALL && level <= OFF ? JAVA_LOG_LEVELS[level] : Level.OFF;
+  }
+}