Repository: ambari
Updated Branches:
  refs/heads/trunk f13beb866 -> 91700e782


AMBARI-8716. RU: The default repo version / stack version do not have any OS / 
base repo URL information (dlysnichenko)


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

Branch: refs/heads/trunk
Commit: 91700e7828e1564809c291a3cd4ad16308c8a6f6
Parents: f13beb8
Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Authored: Fri Dec 19 13:02:44 2014 +0200
Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Committed: Fri Dec 19 13:02:44 2014 +0200

----------------------------------------------------------------------
 .../AmbariManagementControllerImpl.java         |  9 +++--
 .../RepositoryVersionResourceProvider.java      | 38 ++++++++++++++++++--
 .../orm/entities/RepositoryVersionEntity.java   |  9 ++++-
 .../server/upgrade/UpgradeCatalog200.java       |  2 +-
 .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql     |  2 +-
 .../RepositoryVersionResourceProviderTest.java  | 17 +++++++++
 6 files changed, 69 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index a907276..19ee6d9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -75,6 +75,7 @@ import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
+import 
org.apache.ambari.server.controller.internal.RepositoryVersionResourceProvider;
 import org.apache.ambari.server.controller.internal.RequestOperationLevel;
 import org.apache.ambari.server.controller.internal.RequestStageContainer;
 import org.apache.ambari.server.controller.internal.URLStreamProvider;
@@ -144,6 +145,7 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
+
 import org.apache.ambari.server.controller.internal.RequestResourceFilter;
 import org.apache.ambari.server.state.HostComponentAdminState;
 
@@ -361,13 +363,14 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
       StackId newStackId = new StackId(request.getStackVersion());
       c.setDesiredStackVersion(newStackId);
       clusters.setCurrentStackVersion(request.getClusterName(), newStackId);
-      
+
       try {
         // Because Ambari may eventually support multiple clusters, it may be 
possible that a previously installed cluster
         // already inserted the Repository Version for this stack and version.
-        RepositoryVersionEntity existingRepositoryVersion = 
repositoryVersionDAO.findByStackAndVersion(newStackId.getStackId(),  
newStackId.getStackVersion());
+        RepositoryVersionEntity existingRepositoryVersion = 
repositoryVersionDAO.findByStackAndVersion(newStackId.getStackId(), 
newStackId.getStackVersion());
         if (existingRepositoryVersion == null) {
-          repositoryVersionDAO.create(newStackId.getStackId(), 
newStackId.getStackVersion(), newStackId.getStackId(), "", "");
+          repositoryVersionDAO.create(newStackId.getStackId(), 
newStackId.getStackVersion(), newStackId.getStackId(),
+              "", 
RepositoryVersionResourceProvider.serializeOperatingSystems(stackInfo.getRepositories()));
         }
         c.createClusterVersion(stackId.getStackId(), 
stackId.getStackVersion(), getAuthName(), RepositoryVersionState.CURRENT);
       } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index 4cf844d..58817a8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -28,7 +29,6 @@ import java.util.regex.Pattern;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
-import 
org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition;
 import org.apache.ambari.server.api.resources.RepositoryResourceDefinition;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
@@ -49,14 +49,18 @@ import 
org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.OperatingSystemInfo;
+import org.apache.ambari.server.state.RepositoryInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.inject.Inject;
 
@@ -73,7 +77,7 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
   public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID 
= PropertyHelper.getPropertyId("RepositoryVersions", "repository_version");
   public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       
= PropertyHelper.getPropertyId("RepositoryVersions", "display_name");
   public static final String REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID       
= PropertyHelper.getPropertyId("RepositoryVersions", "upgrade_pack");
-  public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         
= "operating_systems"; //TODO should be replaced with resource definition when 
we get rid of Stacks2Service 
+  public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         
= "operating_systems"; //TODO should be replaced with resource definition when 
we get rid of Stacks2Service
   public static final String SUBRESOURCE_REPOSITORIES_PROPERTY_ID              
= new RepositoryResourceDefinition().getPluralName();
 
   @SuppressWarnings("serial")
@@ -452,6 +456,36 @@ public class RepositoryVersionResourceProvider extends 
AbstractResourceProvider
     return operatingSystems;
   }
 
+  /**
+   * Serializes repository info to json for storing to DB.
+   * Produces json like:
+   *
+   * @param repositories list of repository infos
+   * @return serialized list of operating systems
+   */
+  public static String serializeOperatingSystems(List<RepositoryInfo> 
repositories) {
+    final JsonArray rootJson = new JsonArray();
+    final Multimap<String, RepositoryInfo> operatingSystems = 
ArrayListMultimap.create();
+    for (RepositoryInfo repository: repositories) {
+      operatingSystems.put(repository.getOsType(), repository);
+    }
+    for (Entry<String, Collection<RepositoryInfo>> operatingSystem : 
operatingSystems.asMap().entrySet()) {
+      final JsonObject operatingSystemJson = new JsonObject();
+      final JsonArray repositoriesJson = new JsonArray();
+      for (RepositoryInfo repository : operatingSystem.getValue()) {
+        final JsonObject repositoryJson = new JsonObject();
+        
repositoryJson.addProperty(RepositoryResourceProvider.REPOSITORY_BASE_URL_PROPERTY_ID,
 repository.getBaseUrl());
+        
repositoryJson.addProperty(RepositoryResourceProvider.REPOSITORY_REPO_NAME_PROPERTY_ID,
 repository.getRepoName());
+        
repositoryJson.addProperty(RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID,
 repository.getRepoId());
+        repositoriesJson.add(repositoryJson);
+      }
+      operatingSystemJson.add(SUBRESOURCE_REPOSITORIES_PROPERTY_ID, 
repositoriesJson);
+      
operatingSystemJson.addProperty(OperatingSystemResourceProvider.OPERATING_SYSTEM_OS_TYPE_PROPERTY_ID,
 operatingSystem.getKey());
+      rootJson.add(operatingSystemJson);
+    }
+    return gson.toJson(rootJson);
+  }
+
   protected StackId getStackInformationFromUrl(Map<String, Object> 
propertyMap) {
     if (propertyMap.containsKey(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID) && 
propertyMap.containsKey(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID)) {
       return new 
StackId(propertyMap.get(REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).toString(), 
propertyMap.get(REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).toString());

http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
index 8931e8c..4efb794 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
@@ -25,6 +25,7 @@ import javax.persistence.Entity;
 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.Table;
@@ -76,6 +77,7 @@ public class RepositoryVersionEntity {
   @Column(name = "upgrade_package")
   private String upgradePackage;
 
+  @Lob
   @Column(name = "repositories")
   private String operatingSystems;
 
@@ -141,6 +143,11 @@ public class RepositoryVersionEntity {
     this.operatingSystems = repositories;
   }
 
+  /**
+   * Getter which hides json nature of operating systems and returns them as 
entities.
+   *
+   * @return empty list if stored json is invalid
+   */
   public List<OperatingSystemEntity> getOperatingSystems() {
     if (StringUtils.isNotBlank(operatingSystems)) {
       try {
@@ -148,7 +155,7 @@ public class RepositoryVersionEntity {
       } catch (Exception ex) {
         // Should never happen as we validate json before storing it to DB
         LOG.error("Could not parse operating systems json stored in database:" 
+ operatingSystems, ex);
-      }  
+      }
     }
     return Collections.emptyList();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
index 9201f52..d59d8a1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
@@ -163,7 +163,7 @@ public class UpgradeCatalog200 extends 
AbstractUpgradeCatalog {
     columns.add(new DBColumnInfo("version",         String.class,  255,   
null, false));
     columns.add(new DBColumnInfo("display_name",    String.class,  128,   
null, false));
     columns.add(new DBColumnInfo("upgrade_package", String.class,  255,   
null, false));
-    columns.add(new DBColumnInfo("repositories",    char[].class,  32672, 
null, false));
+    columns.add(new DBColumnInfo("repositories",    char[].class,  null,  
null, false));
     dbAccessor.createTable("repo_version", columns, "repo_version_id");
     dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, 
sequence_value) VALUES('repo_version_id_seq', 0)", false);
     dbAccessor.executeQuery("ALTER TABLE repo_version ADD CONSTRAINT 
UQ_repo_version_display_name UNIQUE (display_name)");

http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
index cc33ae6..1e6631e 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
@@ -573,7 +573,7 @@ CREATE TABLE ambari.repo_version (
   version VARCHAR(255) NOT NULL,
   display_name VARCHAR(128) NOT NULL,
   upgrade_package VARCHAR(255) NOT NULL,
-  repositories VARCHAR NOT NULL,
+  repositories TEXT NOT NULL,
   PRIMARY KEY(repo_version_id)
 );
 GRANT ALL PRIVILEGES ON TABLE ambari.repo_version TO :username;

http://git-wip-us.apache.org/repos/asf/ambari/blob/91700e78/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
index 6c89671..76ba75b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
@@ -18,10 +18,12 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -40,6 +42,7 @@ import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.OperatingSystemInfo;
+import org.apache.ambari.server.state.RepositoryInfo;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.junit.After;
@@ -70,6 +73,7 @@ public class RepositoryVersionResourceProviderTest {
     final Set<String> validVersions = Sets.newHashSet("1.1", "1.1-17", 
"1.1.1.1", "1.1.343432.2", "1.1.343432.2-234234324");
     final AmbariMetaInfo ambariMetaInfo = Mockito.mock(AmbariMetaInfo.class);
     final InMemoryDefaultTestModule injectorModule = new 
InMemoryDefaultTestModule() {
+      @Override
       protected void configure() {
         super.configure();
         bind(AmbariMetaInfo.class).toInstance(ambariMetaInfo);
@@ -309,6 +313,19 @@ public class RepositoryVersionResourceProviderTest {
     Assert.assertEquals("name2", provider.getResources(getRequest, new 
AndPredicate(predicateStackName, 
predicateStackVersion)).iterator().next().getPropertyValue(RepositoryVersionResourceProvider.REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID));
   }
 
+  @Test
+  public void testSerializeOperatingSystems() throws Exception {
+    final List<RepositoryInfo> repositories = new ArrayList<RepositoryInfo>();
+    final RepositoryInfo repository = new RepositoryInfo();
+    repository.setBaseUrl("baseurl");
+    repository.setOsType("os");
+    repository.setRepoId("repoId");
+    repositories.add(repository);
+
+    final String serialized = 
RepositoryVersionResourceProvider.serializeOperatingSystems(repositories);
+    
Assert.assertEquals("[{\"repositories\":[{\"Repositories/base_url\":\"baseurl\",\"Repositories/repo_id\":\"repoId\"}],\"OperatingSystems/os_type\":\"os\"}]",
 serialized);
+  }
+
   @After
   public void after() {
     injector.getInstance(PersistService.class).stop();

Reply via email to