AMBARI-22253. Add TopologyConfigurationsEntity (magyari_sandor)

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

Branch: refs/heads/branch-feature-AMBARI-14714-ui
Commit: 4b963392342c521f376218c761696989fa78344f
Parents: acab46d
Author: Sandor Magyari <[email protected]>
Authored: Tue Oct 24 20:51:54 2017 +0200
Committer: Sandor Magyari <[email protected]>
Committed: Tue Oct 24 22:20:11 2017 +0200

----------------------------------------------------------------------
 .../internal/ProvisionClusterRequest.java       |   7 +
 .../orm/entities/HostGroupComponentEntity.java  |   9 +-
 .../entities/HostGroupComponentEntityPK.java    |  36 +++++
 .../entities/TopologyConfigurationsEntity.java  | 148 +++++++++++++++++++
 .../orm/entities/TopologyRequestEntity.java     |  40 ++---
 .../ambari/server/topology/BlueprintImplV2.java |   5 +
 .../ambari/server/topology/BlueprintV2.java     |  12 ++
 .../server/topology/BlueprintV2Factory.java     |   5 +-
 .../topology/ClusterConfigurationRequest.java   |   3 +-
 .../server/topology/ClusterTopologyImpl.java    |  12 +-
 .../server/topology/PersistedStateImpl.java     |  35 ++++-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  15 ++
 .../src/main/resources/META-INF/persistence.xml |   1 +
 13 files changed, 285 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionClusterRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionClusterRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionClusterRequest.java
index bfa46d8..0e1753b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionClusterRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ProvisionClusterRequest.java
@@ -91,6 +91,11 @@ public class ProvisionClusterRequest extends 
BaseClusterRequest {
   public static final String CONFIGURATIONS_PROPERTY = "configurations";
 
   /**
+   * services property name
+   */
+  public static final String SERVICES_PROPERTY = "services";
+
+  /**
    * default password property name
    */
   public static final String DEFAULT_PASSWORD_PROPERTY = "default_password";
@@ -184,6 +189,8 @@ public class ProvisionClusterRequest extends 
BaseClusterRequest {
 
     this.securityConfiguration = securityConfiguration;
 
+    //TODO parse service configs and mereg with BP service configs
+//    Collection<Map<String, String>> services = 
properties.get(SERVICES_PROPERTY);
 //    Configuration configuration = configurationFactory.getConfiguration(
 //      (Collection<Map<String, String>>) 
properties.get(CONFIGURATIONS_PROPERTY));
 //    configuration.setParentConfiguration(blueprint.getConfiguration());

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
index 186180b..bd34d29 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntity.java
@@ -52,14 +52,13 @@ public class HostGroupComponentEntity {
   private String serviceName;
 
   @Id
-  @Column(name = "instance_name", nullable = true, insertable = true, 
updatable = false)
-  private String name;
-
-
-  @Id
   @Column(name = "type", nullable = false, insertable = true, updatable = 
false)
   private String type;
 
+  @Id
+  @Column(name = "instance_name", nullable = true, insertable = true, 
updatable = false)
+  private String name;
+
   @Column(name = "provision_action", nullable = true, insertable = true, 
updatable = false)
   private String provisionAction;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
index 0898133..812f0d6 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostGroupComponentEntityPK.java
@@ -38,6 +38,18 @@ public class HostGroupComponentEntityPK {
   @Column(name = "name", nullable = false, insertable = true, updatable = 
false, length = 100)
   private String name;
 
+  @Id
+  @Column(name = "service_group", nullable = true, insertable = true, 
updatable = false)
+  private String serviceGroup;
+
+  @Id
+  @Column(name = "service_name", nullable = true, insertable = true, updatable 
= false)
+  private String serviceName;
+
+  @Id
+  @Column(name = "type", nullable = false, insertable = true, updatable = 
false)
+  private String type;
+
   /**
    * Get the name of the associated host group.
    *
@@ -92,6 +104,30 @@ public class HostGroupComponentEntityPK {
     this.name = name;
   }
 
+  public String getServiceGroup() {
+    return serviceGroup;
+  }
+
+  public void setServiceGroup(String serviceGroup) {
+    this.serviceGroup = serviceGroup;
+  }
+
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyConfigurationsEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyConfigurationsEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyConfigurationsEntity.java
new file mode 100644
index 0000000..a29db99
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyConfigurationsEntity.java
@@ -0,0 +1,148 @@
+/*
+ * 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.server.orm.entities;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+
+@Entity
+@Table(name = "topology_configurations")
+@TableGenerator(name = "topology_configurations_id_generator", table = 
"ambari_sequences",
+        pkColumnName = "sequence_name", valueColumnName = "sequence_value",
+        pkColumnValue = "topology_configurations_id_seq", initialValue = 0)
+public class TopologyConfigurationsEntity {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = 
"topology_configurations_id_generator")
+  private Long id;
+
+  @OneToOne
+  @JoinColumn(name = "request_id", referencedColumnName = "id", nullable = 
false)
+  private TopologyRequestEntity topologyRequestEntity;
+
+  @Column(name = "service_group_name", length = 100, nullable = false)
+  private String serviceGroupName;
+
+  @Column(name = "service_name", length = 100, nullable = false)
+  private String serviceName;
+
+  @Column(name = "component_name", length = 100, nullable = true)
+  private String componentName;
+
+  @Column(name = "host_group_name", length = 100, nullable = true)
+  private String hostGroupName;
+
+  @Column(name = "cluster_properties")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configProperties;
+
+  @Column(name = "cluster_attributes")
+  @Basic(fetch = FetchType.LAZY)
+  @Lob
+  private String configAttributes;
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public TopologyRequestEntity getTopologyRequestEntity() {
+    return topologyRequestEntity;
+  }
+
+  public void setTopologyRequestEntity(TopologyRequestEntity 
topologyRequestEntity) {
+    this.topologyRequestEntity = topologyRequestEntity;
+  }
+
+  public String getServiceGroupName() {
+    return serviceGroupName;
+  }
+
+  public void setServiceGroupName(String serviceGroupName) {
+    this.serviceGroupName = serviceGroupName;
+  }
+
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+
+  public String getComponentName() {
+    return componentName;
+  }
+
+  public void setComponentName(String componentName) {
+    this.componentName = componentName;
+  }
+
+  public String getHostGroupName() {
+    return hostGroupName;
+  }
+
+  public void setHostGroupName(String hostGroupName) {
+    this.hostGroupName = hostGroupName;
+  }
+
+  public String getConfigProperties() {
+    return configProperties;
+  }
+
+  public void setConfigProperties(String configProperties) {
+    this.configProperties = configProperties;
+  }
+
+  public String getConfigAttributes() {
+    return configAttributes;
+  }
+
+  public void setConfigAttributes(String configAttributes) {
+    this.configAttributes = configAttributes;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    TopologyConfigurationsEntity that = (TopologyConfigurationsEntity) o;
+    if (!id.equals(that.id)) return false;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return id.hashCode();
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyRequestEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyRequestEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyRequestEntity.java
index d281838..4b431f1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyRequestEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/TopologyRequestEntity.java
@@ -19,17 +19,14 @@ package org.apache.ambari.server.orm.entities;
 
 import java.util.Collection;
 
-import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.Lob;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
@@ -62,16 +59,6 @@ public class TopologyRequestEntity {
   @Column(name = "bp_name", length = 100, nullable = false)
   private String blueprintName;
 
-  @Column(name = "cluster_properties")
-  @Basic(fetch = FetchType.LAZY)
-  @Lob
-  private String clusterProperties;
-
-  @Column(name = "cluster_attributes")
-  @Basic(fetch = FetchType.LAZY)
-  @Lob
-  private String clusterAttributes;
-
   @Column(name = "description", length = 1024, nullable = false)
   private String description;
 
@@ -81,6 +68,9 @@ public class TopologyRequestEntity {
   @OneToOne(mappedBy = "topologyRequestEntity", cascade = CascadeType.ALL)
   private TopologyLogicalRequestEntity topologyLogicalRequestEntity;
 
+  @OneToMany(mappedBy = "topologyRequestEntity", cascade = CascadeType.ALL)
+  private Collection<TopologyConfigurationsEntity> 
topologyConfigurationsEntities;
+
   @Column(name = "provision_action", length = 255, nullable = true)
   @Enumerated(EnumType.STRING)
   private ProvisionAction provisionAction;
@@ -117,22 +107,6 @@ public class TopologyRequestEntity {
     this.blueprintName = blueprintName;
   }
 
-  public String getClusterProperties() {
-    return clusterProperties;
-  }
-
-  public void setClusterProperties(String clusterProperties) {
-    this.clusterProperties = clusterProperties;
-  }
-
-  public String getClusterAttributes() {
-    return clusterAttributes;
-  }
-
-  public void setClusterAttributes(String clusterAttributes) {
-    this.clusterAttributes = clusterAttributes;
-  }
-
   public String getDescription() {
     return description;
   }
@@ -157,6 +131,14 @@ public class TopologyRequestEntity {
     this.topologyLogicalRequestEntity = topologyLogicalRequestEntity;
   }
 
+  public Collection<TopologyConfigurationsEntity> 
getTopologyConfigurationsEntities() {
+    return topologyConfigurationsEntities;
+  }
+
+  public void 
setTopologyConfigurationsEntities(Collection<TopologyConfigurationsEntity> 
topologyConfigurationsEntity) {
+    this.topologyConfigurationsEntities = topologyConfigurationsEntity;
+  }
+
   public ProvisionAction getProvisionAction() {
     return provisionAction;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImplV2.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImplV2.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImplV2.java
index 044e78a..356a72e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImplV2.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintImplV2.java
@@ -150,6 +150,11 @@ public class BlueprintImplV2 implements BlueprintV2 {
   }
 
   @Override
+  public Service getServiceById(ServiceId serviceId) {
+    return null;
+  }
+
+  @Override
   @JsonIgnore
   public Collection<Service> getServicesFromServiceGroup(ServiceGroup 
serviceGroup, String serviceType) {
     if (serviceType == null) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2.java
index b5d5430..3925c4f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2.java
@@ -80,6 +80,18 @@ public interface BlueprintV2 {
    */
   Collection<ServiceId> getAllServiceIds();
 
+  /**
+   * Get service by Id
+   * @param serviceId
+   * @return
+   */
+  Service getServiceById(ServiceId serviceId);
+
+  /**
+   * Get all of the services represented in the blueprint.
+   *
+   * @return collection of all represented service names
+   */
   Collection<Service> getAllServices();
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2Factory.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2Factory.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2Factory.java
index 3b656e2..ddb7cf8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2Factory.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintV2Factory.java
@@ -73,8 +73,11 @@ public class BlueprintV2Factory {
   private static StackDAO stackDao;
   private ConfigurationFactory configFactory = new ConfigurationFactory();
 
-  private final StackV2Factory stackFactory;
+  private StackV2Factory stackFactory;
 
+  protected BlueprintV2Factory() {
+
+  }
   protected BlueprintV2Factory(StackV2Factory stackFactory) {
     this.stackFactory = stackFactory;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
index b3ce044..379a69c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterConfigurationRequest.java
@@ -78,7 +78,8 @@ public class ClusterConfigurationRequest {
     BlueprintV2 blueprint = clusterTopology.getBlueprint();
     // set initial configuration (not topology resolved)
     //TODO set up proper ConfigurationContext
-    ConfigurationContext configurationContext = new 
ConfigurationContext(blueprint.getStacks().iterator().next(), 
blueprint.getConfiguration());
+    ConfigurationContext configurationContext = new 
ConfigurationContext(blueprint.getStacks().iterator().next(), clusterTopology
+            .getConfiguration());
     this.configurationProcessor = new 
BlueprintConfigurationProcessor(clusterTopology, configurationContext);
     this.stackAdvisorBlueprintProcessor = stackAdvisorBlueprintProcessor;
     removeOrphanConfigTypes();

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
index 4ef5d4c..db3f29b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
@@ -51,6 +51,7 @@ public class ClusterTopologyImpl implements ClusterTopology {
   //todo: this will need to change to allow usage of multiple bp's for the 
same cluster
   //todo: for example: provision using bp1 and scale using bp2
   private BlueprintV2 blueprint;
+  private Configuration configuration;
   private Collection<Service> serviceConfigs;
   private ConfigRecommendationStrategy configRecommendationStrategy;
   private ProvisionAction provisionAction = ProvisionAction.INSTALL_AND_START;
@@ -74,6 +75,15 @@ public class ClusterTopologyImpl implements ClusterTopology {
 
     registerHostGroupInfo(topologyRequest.getHostGroupInfo());
 
+    // merge service configs into global cluster configs
+    Map<String, Map<String, String>> properties = new HashMap<>();
+    Map<String, Map<String, Map<String, String>>> attributes = new HashMap<>();
+    serviceConfigs.forEach(service -> {
+      properties.putAll(service.getConfiguration().getProperties());
+      attributes.putAll(service.getConfiguration().getAttributes());
+    });
+    configuration = new Configuration(properties, attributes);
+
     // todo extract validation to specialized service
     validateTopology();
     this.ambariContext = ambariContext;
@@ -102,7 +112,7 @@ public class ClusterTopologyImpl implements ClusterTopology 
{
   @Override
   @Deprecated
   public Configuration getConfiguration() {
-    return null;
+    return configuration;
   }
 
   public Collection<Service> getServiceConfigs() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/java/org/apache/ambari/server/topology/PersistedStateImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/PersistedStateImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/PersistedStateImpl.java
index a9a132b..b18915c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/topology/PersistedStateImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/topology/PersistedStateImpl.java
@@ -40,6 +40,7 @@ import 
org.apache.ambari.server.orm.dao.TopologyLogicalRequestDAO;
 import org.apache.ambari.server.orm.dao.TopologyLogicalTaskDAO;
 import org.apache.ambari.server.orm.dao.TopologyRequestDAO;
 import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.orm.entities.TopologyConfigurationsEntity;
 import org.apache.ambari.server.orm.entities.TopologyHostGroupEntity;
 import org.apache.ambari.server.orm.entities.TopologyHostInfoEntity;
 import org.apache.ambari.server.orm.entities.TopologyHostRequestEntity;
@@ -255,9 +256,18 @@ public class PersistedStateImpl implements PersistedState {
       entity.setBlueprintName(request.getBlueprint().getName());
     }
 
-    
entity.setClusterAttributes(attributesAsString(request.getConfiguration().getAttributes()));
+    Collection<TopologyConfigurationsEntity> serviceConfigurations = new 
ArrayList<>();
+    request.getServiceConfigs().forEach(service -> {
+      TopologyConfigurationsEntity topologyConfigurationsEntity = new 
TopologyConfigurationsEntity();
+      
topologyConfigurationsEntity.setServiceGroupName(service.getServiceGroup().getName());
+      topologyConfigurationsEntity.setServiceName(service.getName());
+      
topologyConfigurationsEntity.setConfigProperties(propertiesAsString(service.getConfiguration().getProperties()));
+      
topologyConfigurationsEntity.setConfigAttributes(attributesAsString(service.getConfiguration().getAttributes()));
+      serviceConfigurations.add(topologyConfigurationsEntity);
+    });
+    entity.setTopologyConfigurationsEntities(serviceConfigurations);
+
     entity.setClusterId(request.getClusterId());
-    
entity.setClusterProperties(propertiesAsString(request.getConfiguration().getProperties()));
     entity.setDescription(request.getDescription());
 
     if (request.getProvisionAction() != null) {
@@ -397,11 +407,24 @@ public class PersistedStateImpl implements PersistedState 
{
       } catch (NoSuchStackException e) {
         throw new RuntimeException("Unable to load blueprint while replaying 
topology request: " + e, e);
       }
-      //TODO load services, merge servie configs from Cluster template with 
service configs from Blueprint
+      // load Service configurations from db, set Blueprint service config as 
parent for each
       services = new ArrayList<>();
-      //configuration = createConfiguration(entity.getClusterProperties(), 
entity.getClusterAttributes());
-      //configuration.setParentConfiguration(blueprint.getConfiguration());
-
+      
entity.getTopologyConfigurationsEntities().stream().filter(topologyConfigurationsEntity
 -> (
+        topologyConfigurationsEntity.getComponentName() == null
+                && topologyConfigurationsEntity.getHostGroupName() == null))
+              .forEach(topologyConfigurationsEntity -> {
+
+        ServiceId serviceId = 
ServiceId.of(topologyConfigurationsEntity.getServiceGroupName(),
+                topologyConfigurationsEntity.getServiceName());
+        Service service = blueprint.getServiceById(serviceId);
+        Configuration configuration = 
createConfiguration(topologyConfigurationsEntity.getConfigProperties(),
+                topologyConfigurationsEntity.getConfigAttributes());
+        configuration.setParentConfiguration(service.getConfiguration());
+
+        service.setConfiguration(configuration);
+        services.add(service);
+
+      });
 
       parseHostGroupInfo(entity);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index f48bcd6..482f5e8 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -538,6 +538,9 @@ CREATE TABLE hostgroup_component (
   blueprint_name VARCHAR(255) NOT NULL,
   hostgroup_name VARCHAR(255) NOT NULL,
   name VARCHAR(255) NOT NULL,
+  service_group VARCHAR(255) NOT NULL,
+  service_name VARCHAR(255) NOT NULL,
+  type VARCHAR(255) NOT NULL,
   provision_action VARCHAR(255),
   CONSTRAINT PK_hostgroup_component PRIMARY KEY (blueprint_name, 
hostgroup_name, name),
   CONSTRAINT FK_hgc_blueprint_name FOREIGN KEY (blueprint_name, 
hostgroup_name) REFERENCES hostgroup (blueprint_name, name));
@@ -755,6 +758,18 @@ CREATE TABLE topology_request (
   CONSTRAINT PK_topology_request PRIMARY KEY (id),
   CONSTRAINT FK_topology_request_cluster_id FOREIGN KEY (cluster_id) 
REFERENCES clusters(cluster_id));
 
+CREATE TABLE topology_configurations (
+  id BIGINT NOT NULL,
+  request_id BIGINT NOT NULL,
+  service_group_name VARCHAR(100) NOT NULL,
+  service_name VARCHAR(100) NOT NULL,
+  component_name VARCHAR(100),
+  host_group_name VARCHAR(100),
+  cluster_properties TEXT,
+  cluster_attributes TEXT,
+  CONSTRAINT PK_topology_configurations PRIMARY KEY (id),
+  CONSTRAINT FK_hostgroup_req_id FOREIGN KEY (request_id) REFERENCES 
topology_request(id));
+
 CREATE TABLE topology_hostgroup (
   id BIGINT NOT NULL,
   name VARCHAR(255) NOT NULL,

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b963392/ambari-server/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/META-INF/persistence.xml 
b/ambari-server/src/main/resources/META-INF/persistence.xml
index 20c95f9..5f56f09 100644
--- a/ambari-server/src/main/resources/META-INF/persistence.xml
+++ b/ambari-server/src/main/resources/META-INF/persistence.xml
@@ -87,6 +87,7 @@
     <class>org.apache.ambari.server.orm.entities.WidgetLayoutEntity</class>
     
<class>org.apache.ambari.server.orm.entities.WidgetLayoutUserWidgetEntity</class>
     <class>org.apache.ambari.server.orm.entities.TopologyRequestEntity</class>
+    
<class>org.apache.ambari.server.orm.entities.TopologyConfigurationsEntity</class>
     
<class>org.apache.ambari.server.orm.entities.TopologyLogicalRequestEntity</class>
     
<class>org.apache.ambari.server.orm.entities.TopologyHostRequestEntity</class>
     
<class>org.apache.ambari.server.orm.entities.TopologyHostGroupEntity</class>

Reply via email to