use of org.haiku.haikudepotserver.dataobjects.RepositorySource in project haikudepotserver by haiku.
the class UserRatingOrchestrationServiceIT method createTestUserRatingData.
private UserRatingTestData createTestUserRatingData(ObjectContext context) {
UserRatingTestData userRatingTestData = new UserRatingTestData();
Repository repository = Repository.tryGetByCode(context, "testrepo").get();
RepositorySource repositorySource = RepositorySource.tryGetByCode(context, "testreposrc_xyz").get();
Architecture x86_64 = Architecture.tryGetByCode(context, "x86_64").get();
Architecture x86_gcc2 = Architecture.tryGetByCode(context, "x86_gcc2").get();
userRatingTestData.pkg = integrationTestSupportService.createPkg(context, "urtestpkg");
pkgService.ensurePkgProminence(context, userRatingTestData.pkg, repository, Prominence.ORDERING_LAST);
userRatingTestData.user1 = integrationTestSupportService.createBasicUser(context, "urtestuser1", "password");
userRatingTestData.user2 = integrationTestSupportService.createBasicUser(context, "urtestuser2", "password");
userRatingTestData.user3 = integrationTestSupportService.createBasicUser(context, "urtestuser3", "password");
userRatingTestData.user4 = integrationTestSupportService.createBasicUser(context, "urtestuser4", "password");
userRatingTestData.user5 = integrationTestSupportService.createBasicUser(context, "urtestuser5", "password");
userRatingTestData.pkgVersion_0_0_9__x86_gcc2 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_64, 0, 0, 9, null, false);
userRatingTestData.pkgVersion_1_0_0__x86_gcc2 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_64, 1, 0, 0, null, false);
userRatingTestData.pkgVersion_1_0_1__x86_gcc2 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_64, 1, 0, 1, null, false);
userRatingTestData.pkgVersion_1_0_1_1__x86_gcc2 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_64, 1, 0, 1, 1, false);
userRatingTestData.pkgVersion_1_0_2__x86_gcc2 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_64, 1, 0, 2, null, false);
userRatingTestData.pkgVersion_1_0_2__x86_64 = createTestUserRatingPkgVersion(context, repositorySource, userRatingTestData.pkg, x86_gcc2, 1, 0, 2, null, false);
return userRatingTestData;
}
use of org.haiku.haikudepotserver.dataobjects.RepositorySource in project haikudepotserver by haiku.
the class RepositoryHpkrIngressServiceIT method testImportThenCheck.
@Test
public void testImportThenCheck() throws Exception {
File temporaryDir;
File temporaryRepoFile = null;
File temporaryRepoInfoFile = null;
try {
temporaryDir = Files.createTempDir();
temporaryRepoFile = new File(temporaryDir, "repo");
temporaryRepoInfoFile = new File(temporaryDir, "repo.info");
// get the test hpkr data and copy it into a temporary file that can be used as a source
// for a repository.
Files.write(getResourceData("sample-repo.info"), temporaryRepoInfoFile);
Files.write(getResourceData("sample-repo.hpkr"), temporaryRepoFile);
// first setup a fake repository to import that points at the local test HPKR file.
{
ObjectContext context = serverRuntime.newContext();
Repository repository = context.newObject(Repository.class);
repository.setCode("test");
repository.setName("Test Repository");
RepositorySource repositorySource = context.newObject(RepositorySource.class);
repositorySource.setCode("testsrc_xyz");
repositorySource.setIdentifier("file://" + temporaryDir.getAbsolutePath());
repository.addToManyTarget(Repository.REPOSITORY_SOURCES.getName(), repositorySource, true);
RepositorySourceMirror repositorySourceMirror = context.newObject(RepositorySourceMirror.class);
repositorySourceMirror.setBaseUrl("file://" + temporaryDir.getAbsolutePath());
repositorySourceMirror.setIsPrimary(true);
repositorySourceMirror.setCode("testsrc_xyz_mirror");
repositorySourceMirror.setCountry(Country.getByCode(context, Country.CODE_NZ));
repositorySource.addToManyTarget(RepositorySource.REPOSITORY_SOURCE_MIRRORS.getName(), repositorySourceMirror, true);
context.commitChanges();
}
// setup another repository that is not related to the import test to check some stuff...
{
ObjectContext context = serverRuntime.newContext();
Repository repository = context.newObject(Repository.class);
repository.setCode("test2");
repository.setName("Test 2");
RepositorySource repositorySource = context.newObject(RepositorySource.class);
repositorySource.setCode("testsrc2_xyz");
// just after epoc second.
repositorySource.setLastImportTimestamp(new java.sql.Timestamp(12345L));
repository.addToManyTarget(Repository.REPOSITORY_SOURCES.getName(), repositorySource, true);
RepositorySourceMirror repositorySourceMirror = context.newObject(RepositorySourceMirror.class);
repositorySourceMirror.setBaseUrl("file://does-not-exist/path");
repositorySourceMirror.setIsPrimary(true);
repositorySourceMirror.setCode("testsrc2_xyz_mirror");
repositorySourceMirror.setCountry(Country.getByCode(context, Country.CODE_NZ));
repositorySource.addToManyTarget(RepositorySource.REPOSITORY_SOURCE_MIRRORS.getName(), repositorySourceMirror, true);
context.commitChanges();
}
// add a package version from this repository that is known not to be in that example and then
// latterly check that the package version is no longer active.
{
ObjectContext context = serverRuntime.newContext();
Pkg pkg = integrationTestSupportService.createPkg(context, "taranaki");
pkgService.ensurePkgProminence(context, pkg, Repository.tryGetByCode(context, "test").get());
pkgService.ensurePkgProminence(context, pkg, Repository.tryGetByCode(context, "test2").get());
// this one should get deactivated
{
PkgVersion pkgVersion = context.newObject(PkgVersion.class);
pkgVersion.setPkg(pkg);
pkgVersion.setMajor("1");
pkgVersion.setMinor("2");
pkgVersion.setArchitecture(Architecture.tryGetByCode(context, "x86_64").get());
pkgVersion.setIsLatest(true);
pkgVersion.setRepositorySource(RepositorySource.tryGetByCode(context, "testsrc_xyz").get());
}
// this one should remain
{
PkgVersion pkgVersion = context.newObject(PkgVersion.class);
pkgVersion.setPkg(pkg);
pkgVersion.setMajor("1");
pkgVersion.setMinor("3");
pkgVersion.setArchitecture(Architecture.tryGetByCode(context, "x86_64").get());
pkgVersion.setIsLatest(true);
pkgVersion.setRepositorySource(RepositorySource.tryGetByCode(context, "testsrc2_xyz").get());
}
context.commitChanges();
}
// add an inactive package version from this repository that is known to be in the repository. This
// package should be activated and re-used.
ObjectId originalFfmpegPkgOid;
{
ObjectContext context = serverRuntime.newContext();
Pkg pkg = integrationTestSupportService.createPkg(context, "ffmpeg");
pkgService.ensurePkgProminence(context, pkg, Repository.tryGetByCode(context, "test").get());
pkgService.ensurePkgProminence(context, pkg, Repository.tryGetByCode(context, "test2").get());
PkgVersion pkgVersion = context.newObject(PkgVersion.class);
pkgVersion.setPkg(pkg);
pkgVersion.setMajor("3");
pkgVersion.setMinor("3");
pkgVersion.setMicro("2");
pkgVersion.setRevision(1);
pkgVersion.setArchitecture(Architecture.tryGetByCode(context, "x86_64").get());
pkgVersion.setIsLatest(true);
// to be sure!
pkgVersion.setActive(false);
pkgVersion.setRepositorySource(RepositorySource.tryGetByCode(context, "testsrc_xyz").get());
PkgVersionUrl pkgVersionUrl = context.newObject(PkgVersionUrl.class);
pkgVersionUrl.setPkgUrlType(PkgUrlType.getByCode(context, org.haiku.pkg.model.PkgUrlType.HOMEPAGE.name().toLowerCase()).get());
pkgVersionUrl.setUrl("http://noop");
pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_URLS.getName(), pkgVersionUrl, true);
PkgVersionCopyright pkgVersionCopyright = context.newObject(PkgVersionCopyright.class);
pkgVersionCopyright.setBody("Norfolk pine");
pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_COPYRIGHTS.getName(), pkgVersionCopyright, true);
PkgVersionLicense pkgVersionLicense = context.newObject(PkgVersionLicense.class);
pkgVersionLicense.setBody("Punga");
pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_LICENSES.getName(), pkgVersionLicense, true);
context.commitChanges();
originalFfmpegPkgOid = pkgVersion.getObjectId();
}
// do the import.
String guid = jobService.submit(new RepositoryHpkrIngressJobSpecification("test"), JobSnapshot.COALESCE_STATUSES_NONE);
// wait for it to finish.
{
long startMs = System.currentTimeMillis();
while (Jobs.isQueuedOrStarted(jobService.tryGetJob(guid).get()) && (System.currentTimeMillis() - startMs) < DELAY_PROCESSSUBMITTEDTESTJOB) {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
}
if (Jobs.isQueuedOrStarted(jobService.tryGetJob(guid).get())) {
throw new IllegalStateException("test processing of the sample repo has taken > " + DELAY_PROCESSSUBMITTEDTESTJOB + "ms");
}
}
// check that the sample url is loaded into the repository source.
{
ObjectContext context = serverRuntime.newContext();
RepositorySource repositorySource = RepositorySource.tryGetByCode(context, "testsrc_xyz").get();
Assertions.assertThat(repositorySource.getIdentifier()).isEqualTo("f0c086e5-e096-429c-b38d-57beabd764e9");
// ^^ as defined in the repo info file.
Assertions.assertThat(repositorySource.getArchitecture().getCode()).isEqualTo("x86_gcc2");
// ^^ as defined in the repo info file.
}
// now pull out some known packages and make sure they are imported correctly.
// TODO - this is a fairly simplistic test; do some more checks.
{
ObjectContext context = serverRuntime.newContext();
verifyPackage(context, "apr");
verifyPackage(context, "schroedinger");
// this one is not in the import and so should be inactive afterwards.
List<PkgVersion> pkgVersions = ObjectSelect.query(PkgVersion.class).where(PkgVersion.PKG.dot(Pkg.NAME).eq("taranaki")).select(context);
Assertions.assertThat(pkgVersions.size()).isEqualTo(2);
for (PkgVersion pkgVersion : pkgVersions) {
boolean isTestRepository = pkgVersion.getRepositorySource().getRepository().getCode().equals("test");
Assertions.assertThat(pkgVersion.getActive()).isEqualTo(!isTestRepository);
}
// check that the ffmpeg package was re-used and populated; as an example.
{
PkgVersion pkgVersion = PkgVersion.get(context, originalFfmpegPkgOid);
Assertions.assertThat(pkgVersion.getActive()).isTrue();
Assertions.assertThat(pkgVersion.getIsLatest()).isTrue();
Assertions.assertThat(PkgVersion.getForPkg(context, pkgVersion.getPkg(), Repository.tryGetByCode(context, "test").get(), true).size()).isEqualTo(// include inactive
1);
PkgVersionLocalization localization = pkgVersion.getPkgVersionLocalization(NaturalLanguage.getByCode(context, NaturalLanguage.CODE_ENGLISH)).get();
Assertions.assertThat(localization.getDescription().get()).startsWith("FFmpeg is a complete, cro");
Assertions.assertThat(localization.getSummary().get()).startsWith("Audio and video rec");
// the former rubbish copyright is removed
List<String> copyrights = pkgVersion.getCopyrights();
Assertions.assertThat(copyrights.size()).isEqualTo(2);
Assertions.assertThat(ImmutableSet.copyOf(copyrights)).containsOnly("2000-2003 Fabrice Bellard", "2003-2017 the FFmpeg developers");
// the former rubbish license is removed
List<String> licenses = pkgVersion.getLicenses();
Assertions.assertThat(licenses.size()).isEqualTo(2);
Assertions.assertThat(ImmutableSet.copyOf(licenses)).containsOnly("GNU LGPL v2.1", "GNU GPL v2");
Optional<PkgVersionUrl> pkgVersionUrlOptional = pkgVersion.getPkgVersionUrlForType(PkgUrlType.getByCode(context, org.haiku.pkg.model.PkgUrlType.HOMEPAGE.name().toLowerCase()).get());
Assertions.assertThat(pkgVersionUrlOptional.isPresent()).isTrue();
Assertions.assertThat(pkgVersionUrlOptional.get().getUrl()).isEqualTo("https://ffmpeg.org/");
}
}
} finally {
if (null != temporaryRepoFile) {
if (!temporaryRepoFile.delete()) {
LOGGER.warn("unable to delete the temporary 'repo' file");
}
}
if (null != temporaryRepoInfoFile) {
if (!temporaryRepoInfoFile.delete()) {
LOGGER.warn("unable to delete the temporary 'repo.info' file");
}
}
}
}
use of org.haiku.haikudepotserver.dataobjects.RepositorySource in project haikudepotserver by haiku.
the class RepositoryApiImpl method updateRepositorySource.
@Override
public UpdateRepositorySourceResult updateRepositorySource(UpdateRepositorySourceRequest request) {
Preconditions.checkArgument(null != request);
Preconditions.checkArgument(StringUtils.isNotBlank(request.code), "a code is required to identify the repository source to update");
Preconditions.checkArgument(null != request.filter, "filters must be provided to specify what aspects of the repository source should be updated");
final ObjectContext context = serverRuntime.newContext();
RepositorySource repositorySource = getRepositorySourceOrThrow(context, request.code);
if (!permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), repositorySource.getRepository(), Permission.REPOSITORY_EDIT)) {
throw new AccessDeniedException("cannot edit the repository [" + repositorySource.getRepository() + "]");
}
for (UpdateRepositorySourceRequest.Filter filter : request.filter) {
switch(filter) {
case ACTIVE:
if (null == request.active) {
throw new IllegalArgumentException("the active field must be provided if the request requires it to be updated");
}
repositorySource.setActive(request.active);
LOGGER.info("did set the repository source {} active to {}", repositorySource, request.active);
break;
case FORCED_INTERNAL_BASE_URL:
repositorySource.setForcedInternalBaseUrl(StringUtils.trimToNull(request.forcedInternalBaseUrl));
LOGGER.info("did set the repository source forced internal base url");
break;
case EXTRA_IDENTIFIERS:
{
Set<String> existing = Set.copyOf(repositorySource.getExtraIdentifiers());
Set<String> desired = Set.copyOf(CollectionUtils.emptyIfNull(request.extraIdentifiers));
SetUtils.difference(existing, desired).stream().map(repositorySource::tryGetRepositorySourceExtraIdentifierForIdentifier).map(Optional::orElseThrow).forEach(rsei -> {
repositorySource.removeFromRepositorySourceExtraIdentifiers(rsei);
context.deleteObject(rsei);
});
SetUtils.difference(desired, existing).forEach(i -> {
RepositorySourceExtraIdentifier rsei = context.newObject(RepositorySourceExtraIdentifier.class);
rsei.setRepositorySource(repositorySource);
rsei.setIdentifier(i);
repositorySource.addToRepositorySourceExtraIdentifiers(rsei);
});
break;
}
default:
throw new IllegalStateException("unhandled filter; " + filter.name());
}
}
if (context.hasChanges()) {
repositorySource.getRepository().setModifyTimestamp();
context.commitChanges();
} else {
LOGGER.info("update repository source {} with no changes made", repositorySource);
}
return new UpdateRepositorySourceResult();
}
use of org.haiku.haikudepotserver.dataobjects.RepositorySource in project haikudepotserver by haiku.
the class RepositoryApiImpl method triggerImportRepository.
// note; no integration test for this one.
@Override
public TriggerImportRepositoryResult triggerImportRepository(TriggerImportRepositoryRequest triggerImportRepositoryRequest) {
Preconditions.checkNotNull(triggerImportRepositoryRequest);
Preconditions.checkState(!Strings.isNullOrEmpty(triggerImportRepositoryRequest.repositoryCode));
Preconditions.checkArgument(null == triggerImportRepositoryRequest.repositorySourceCodes || !triggerImportRepositoryRequest.repositorySourceCodes.isEmpty(), "bad repository sources");
final ObjectContext context = serverRuntime.newContext();
Optional<Repository> repositoryOptional = Repository.tryGetByCode(context, triggerImportRepositoryRequest.repositoryCode);
if (repositoryOptional.isEmpty()) {
throw new ObjectNotFoundException(Repository.class.getSimpleName(), triggerImportRepositoryRequest.repositoryCode);
}
Repository repository = repositoryOptional.get();
if (!permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), repository, Permission.REPOSITORY_IMPORT)) {
throw new AccessDeniedException("attempt to trigger repository import for [" + repository + "]");
}
Set<RepositorySource> repositorySources = null;
if (null != triggerImportRepositoryRequest.repositorySourceCodes) {
repositorySources = new HashSet<>();
for (String repositorySourceCode : triggerImportRepositoryRequest.repositorySourceCodes) {
repositorySources.add(repository.getRepositorySources().stream().filter(rs -> rs.getCode().equals(repositorySourceCode)).collect(SingleCollector.optional()).orElseThrow(() -> new ObjectNotFoundException(RepositorySource.class.getSimpleName(), repositorySourceCode)));
}
}
jobService.submit(new RepositoryHpkrIngressJobSpecification(repository.getCode(), null == repositorySources ? null : repositorySources.stream().map(RepositorySource::getCode).collect(Collectors.toSet())), JobSnapshot.COALESCE_STATUSES_QUEUED);
return new TriggerImportRepositoryResult();
}
use of org.haiku.haikudepotserver.dataobjects.RepositorySource in project haikudepotserver by haiku.
the class RepositoryApiImpl method getRepositorySource.
@Override
public GetRepositorySourceResult getRepositorySource(GetRepositorySourceRequest request) {
Preconditions.checkArgument(null != request);
Preconditions.checkArgument(!Strings.isNullOrEmpty(request.code));
final ObjectContext context = serverRuntime.newContext();
Optional<RepositorySource> repositorySourceOptional = RepositorySource.tryGetByCode(context, request.code);
if (repositorySourceOptional.isEmpty()) {
throw new ObjectNotFoundException(RepositorySource.class.getSimpleName(), request.code);
}
RepositorySource repositorySource = repositorySourceOptional.get();
GetRepositorySourceResult result = new GetRepositorySourceResult();
result.active = repositorySource.getActive();
result.code = repositorySource.getCode();
result.repositoryCode = repositorySource.getRepository().getCode();
result.identifier = repositorySource.getIdentifier();
result.architectureCode = Optional.ofNullable(repositorySource.getArchitecture()).map(Architecture::getCode).orElse(null);
if (null != repositorySource.getLastImportTimestamp()) {
result.lastImportTimestamp = repositorySource.getLastImportTimestamp().getTime();
}
result.extraIdentifiers = repositorySource.getExtraIdentifiers();
result.repositorySourceMirrors = repositorySource.getRepositorySourceMirrors().stream().filter(m -> m.getActive() || BooleanUtils.isTrue(request.includeInactiveRepositorySourceMirrors)).sorted().map(rsm -> {
GetRepositorySourceResult.RepositorySourceMirror mirror = new GetRepositorySourceResult.RepositorySourceMirror();
mirror.active = rsm.getActive();
mirror.baseUrl = rsm.getBaseUrl();
mirror.countryCode = rsm.getCountry().getCode();
mirror.isPrimary = rsm.getIsPrimary();
mirror.code = rsm.getCode();
return mirror;
}).collect(Collectors.toList());
if (permissionEvaluator.hasPermission(SecurityContextHolder.getContext().getAuthentication(), repositorySource.getRepository(), Permission.REPOSITORY_EDIT)) {
result.forcedInternalBaseUrl = repositorySourceOptional.get().getForcedInternalBaseUrl();
}
return result;
}
Aggregations