/**
* 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.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.apache.ambari.server.controller.RepositoryResponse;
import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
import org.apache.ambari.server.orm.entities.RepositoryEntity;
import org.apache.ambari.server.state.RepositoryInfo;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimaps;
public class RepoUtilTest {
private static final List<String> OPERATING_SYSTEMS = ImmutableList.of("redhat6", "sles11", "ubuntu12");
@Test public void testAddServiceReposToOperatingSystemEntities_SimpleCase() {
List<OperatingSystemEntity> operatingSystems = new ArrayList<>();
for (String os: OPERATING_SYSTEMS) {
RepositoryEntity repo1 = repoEntity("HDP", "HDP-2.3", "http://hdp.org/2.3");
RepositoryEntity repo2 = repoEntity("HDP-UTILS", "HDP-UTILS-1.1.0", "http://hdp.org/utils/1.1.0");
operatingSystems.add(osEntity(os, repo1, repo2));
}
ListMultimap<String, RepositoryInfo> serviceRepos = serviceRepos(ImmutableList.of("redhat5", "redhat6", "sles11"),
"MSFT_R", "MSFT_R-8.1", "http://msft.r");
RepoUtil.addServiceReposToOperatingSystemEntities(operatingSystems, serviceRepos);
// Verify results. Service repos should be added only to redhat6 and sles11
for (OperatingSystemEntity os: operatingSystems) {
Assert.assertNotSame("Redhat5 should not be added as new operating system.", "redhat5", os.getOsType());
Optional<RepositoryEntity> msft_r = findRepoEntityById(os.getRepositories(), "MSFT_R-8.1");
Assert.assertTrue(
String.format("Only redhat6 and sles11 should contain the service repo. os: %s, repo: %s", os.getOsType(), msft_r),
findRepoEntityById(os.getRepositories(), "MSFT_R-8.1").isPresent() == ImmutableList.of("redhat6", "sles11").contains(os.getOsType())) ;
}
}
@Test public void testAddServiceReposToOperatingSystemEntities_RepoAlreadExists() {
List<OperatingSystemEntity> operatingSystems = new ArrayList<>();
for (String os: OPERATING_SYSTEMS) {
RepositoryEntity repo1 = repoEntity("HDP", "HDP-2.3", "http://hdp.org/2.3");
RepositoryEntity repo2 = repoEntity("HDP-UTILS", "HDP-UTILS-1.1.0", "http://hdp.org/utils/1.1.0");
RepositoryEntity repo3 = repoEntity("MSFT_R", "MSFT_R-8.1", "http://msft.r.ORIGINAL");
operatingSystems.add(osEntity(os, repo1, repo2, repo3));
}
ListMultimap<String, RepositoryInfo> serviceRepos = serviceRepos(ImmutableList.of("redhat6"),
"MSFT_R", "MSFT_R-8.2", "http://msft.r.NEW");
RepoUtil.addServiceReposToOperatingSystemEntities(operatingSystems, serviceRepos);
// Verify results. Service repo should not be added second time.
for (OperatingSystemEntity os: operatingSystems) {
Optional<RepositoryEntity> msft_r_orig = findRepoEntityById(os.getRepositories(), "MSFT_R-8.1");
Optional<RepositoryEntity> msft_r_new = findRepoEntityById(os.getRepositories(), "MSFT_R-8.2");
Assert.assertTrue("Original repo is missing", msft_r_orig.isPresent());
Assert.assertTrue("Service repo with duplicate name should not have been added", !msft_r_new.isPresent());
}
}
@Test public void testGetServiceRepos() {
List<RepositoryInfo> vdfRepos = Lists.newArrayList(repoInfo("HDP", "HDP-2.3", "redhat6"),
repoInfo("HDP-UTILS", "HDP-UTILS-1.1.0.20", "redhat6"),
repoInfo("HDP", "HDP-2.3", "redhat5"),
repoInfo("HDP-UTILS", "HDP-UTILS-1.1.0.20", "redhat5"));
List<RepositoryInfo> stackRepos = Lists.newArrayList(vdfRepos);
stackRepos.add(repoInfo("MSFT_R", "MSFT_R-8.1", "redhat6"));
ImmutableListMultimap<String, RepositoryInfo> stackReposByOs =
Multimaps.index(stackRepos, RepositoryInfo.GET_OSTYPE_FUNCTION);
List<RepositoryInfo> serviceRepos = RepoUtil.getServiceRepos(vdfRepos, stackReposByOs);
Assert.assertEquals("Expected 1 service repo", 1, serviceRepos.size());
Assert.assertEquals("Expected MSFT_R service repo", "MSFT_R", serviceRepos.get(0).getRepoName());
}
@Test public void testAsRepositoryResponses() {
List<RepositoryInfo> repos = Lists.newArrayList(repoInfo("HDP", "HDP-2.3", "redhat6"),
repoInfo("HDP-UTILS", "HDP-UTILS-1.1.0.20", "redhat6"),
repoInfo("HDP", "HDP-2.3", "redhat5"),
repoInfo("HDP-UTILS", "HDP-UTILS-1.1.0.20", "redhat5"));
List<RepositoryResponse> responses = RepoUtil.asResponses(repos, "HDP-2.3", "HDP", "2.3");
Assert.assertEquals("Wrong number of responses", repos.size(), responses.size());
for (RepositoryResponse response: responses) {
Assert.assertEquals("Unexpected version definition id", "HDP-2.3", response.getVersionDefinitionId());
Assert.assertEquals("Unexpected stack name", "HDP", response.getStackName());
Assert.assertEquals("Unexpected stack version", "2.3", response.getStackVersion());
}
}
private static Optional<RepositoryEntity> findRepoEntityById(Iterable<RepositoryEntity> repos, String repoId) {
for (RepositoryEntity repo: repos) if (Objects.equals(repo.getRepositoryId(), repoId)) {
return Optional.of(repo);
}
return Optional.absent();
}
private static OperatingSystemEntity osEntity(String os, RepositoryEntity... repoEntities) {
OperatingSystemEntity entity = new OperatingSystemEntity();
entity.setOsType(os);
for (RepositoryEntity repo: repoEntities) {
entity.getRepositories().add(repo);
}
return entity;
}
private static RepositoryEntity repoEntity(String name, String repoId, String baseUrl) {
RepositoryEntity repo = new RepositoryEntity();
repo.setName(name);
repo.setRepositoryId(repoId);
repo.setBaseUrl(baseUrl);
return repo;
}
private static RepositoryInfo repoInfo(String name, String repoId, String osType) {
RepositoryInfo repo = new RepositoryInfo();
repo.setRepoName(name);
repo.setRepoId(repoId);
repo.setOsType(osType);
return repo;
}
private static ListMultimap<String, RepositoryInfo> serviceRepos(List<String> operatingSystems,
String repoName, String repoId, String baseUrl) {
ListMultimap<String, RepositoryInfo> multimap = ArrayListMultimap.create();
for (String os: operatingSystems) {
RepositoryInfo repoInfo = new RepositoryInfo();
repoInfo.setOsType(os);
repoInfo.setRepoId(repoId);
repoInfo.setRepoName(repoName);
repoInfo.setBaseUrl(baseUrl);
multimap.put(os, repoInfo);
}
return multimap;
}
}