Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for OCI package type #386 #387

Merged
merged 2 commits into from
Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.jfrog.artifactory.client.model.repository.settings;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public interface OciRepositorySettings extends DockerRepositorySettings {

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
@JsonSubTypes.Type(value = HelmRepositorySettingsImpl.class, name = "helm"),
@JsonSubTypes.Type(value = GoRepositorySettingsImpl.class, name = "go"),
@JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo"),
@JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform")
@JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform"),
@JsonSubTypes.Type(value = OciRepositorySettingsImpl.class, name = "oci")
})

public abstract class RepositorySettingsMixIn {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/
public class FederatedRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<FederatedRepositoryBuilder, FederatedRepository> implements FederatedRepositoryBuilder {
private static Set<PackageType> federatedRepositorySupportedTypes = new HashSet<>(Arrays.asList(
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, pypi, sbt, vagrant, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, pypi, sbt, vagrant, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform, oci
));

protected List<FederatedMember> members = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/
public class LocalRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<LocalRepositoryBuilder, LocalRepository> implements LocalRepositoryBuilder {
private static Set<PackageType> localRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, pypi, sbt, vagrant, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, pypi, sbt, vagrant, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform, oci
));

protected LocalRepositoryBuilderImpl() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public enum PackageTypeImpl implements PackageType {
helm,
go,
cargo,
terraform;
terraform,
oci;

@Override
public boolean isCustom() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/
public class RemoteRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<RemoteRepositoryBuilder, RemoteRepository> implements RemoteRepositoryBuilder {
private static Set<PackageType> remoteRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, p2, pypi, sbt, vcs, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform
bower, cocoapods, cran, conda, debian, docker, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, opkg, p2, pypi, sbt, vcs, yum, rpm, composer, conan, chef, puppet, helm, go, cargo, terraform, oci
));

private String url;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
public class VirtualRepositoryBuilderImpl extends RepositoryBuilderBase<VirtualRepositoryBuilder, VirtualRepository> implements VirtualRepositoryBuilder {
private static Set<PackageType> virtualRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
bower, cran, conda, docker, debian, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, p2, pypi, sbt, yum, rpm, composer, conan, chef, puppet, helm, go, terraform
bower, cran, conda, docker, debian, gems, generic, gitlfs, gradle, ivy, maven, npm, nuget, p2, pypi, sbt, yum, rpm, composer, conan, chef, puppet, helm, go, terraform, oci
));

private Collection<String> repositories = Collections.emptyList();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.jfrog.artifactory.client.model.repository.settings.impl;

import org.jfrog.artifactory.client.model.PackageType;
import org.jfrog.artifactory.client.model.impl.PackageTypeImpl;
import org.jfrog.artifactory.client.model.repository.settings.OciRepositorySettings;

public class OciRepositorySettingsImpl extends DockerRepositorySettingsImpl implements OciRepositorySettings {
public static String defaultLayout = "simple-default";

public OciRepositorySettingsImpl() {
super();
}
jcoste-orange marked this conversation as resolved.
Show resolved Hide resolved

public PackageType getPackageType() {
return PackageTypeImpl.oci;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OciRepositorySettingsImpl)) return false;
if (!super.equals(o)) return false;

OciRepositorySettingsImpl that = (OciRepositorySettingsImpl) o;

return true;
jcoste-orange marked this conversation as resolved.
Show resolved Hide resolved
}

@Override
public int hashCode() {
int result = super.hashCode();
return result;
}
jcoste-orange marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package org.jfrog.artifactory.client

import org.hamcrest.CoreMatchers
import org.jfrog.artifactory.client.model.RepositoryType
import org.jfrog.artifactory.client.model.repository.settings.RepositorySettings
import org.jfrog.artifactory.client.model.repository.settings.docker.DockerApiVersion
import org.jfrog.artifactory.client.model.repository.settings.impl.OciRepositorySettingsImpl
import org.testng.annotations.BeforeMethod
import org.testng.annotations.Test

/**
* test that client correctly sends and receives repository configuration with `oci` package type
*
*/
class OciPackageTypeRepositoryTests extends BaseRepositoryTests {

OciPackageTypeRepositoryTests() {
remoteRepoUrl = "https://registry-1.docker.io"
}

@Override
RepositorySettings getRepositorySettings(RepositoryType repositoryType) {
def settings = new OciRepositorySettingsImpl()

settings.with {
// local
dockerApiVersion = DockerApiVersion.V2
dockerTagRetention = Math.abs(rnd.nextInt())

// remote
enableTokenAuthentication = rnd.nextBoolean()
listRemoteFolderItems = rnd.nextBoolean()
}

return settings
}

@BeforeMethod
protected void setUp() {
storeArtifactsLocallyInRemoteRepo = true
super.setUp()
}

@Test(groups = "ociPackageTypeRepo")
void testOciLocalRepo() {
artifactory.repositories().create(0, localRepo)
def expectedSettings = localRepo.repositorySettings

def resp = artifactory.repository(localRepo.getKey()).get()
assertThat(resp, CoreMatchers.notNullValue())
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
resp.getRepositorySettings().with {
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))

// local
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
assertThat(dockerTagRetention, CoreMatchers.is(expectedSettings.getDockerTagRetention()))

// remote
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
}
}

@Test(groups = "ociPackageTypeRepo")
void testOciFederatedRepo() {
artifactory.repositories().create(0, federatedRepo)
def expectedSettings = federatedRepo.repositorySettings

def resp = artifactory.repository(federatedRepo.getKey()).get()
assertThat(resp, CoreMatchers.notNullValue())
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
resp.getRepositorySettings().with {
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))

// local
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))

// remote
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
}
}

@Test(groups = "ociPackageTypeRepo")
void testOciRemoteRepo() {
artifactory.repositories().create(0, remoteRepo)
def expectedSettings = remoteRepo.repositorySettings

def resp = artifactory.repository(remoteRepo.getKey()).get()
assertThat(resp, CoreMatchers.notNullValue())
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
resp.getRepositorySettings().with {
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))

// local
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
// always in resp payload

// remote
assertThat(enableTokenAuthentication, CoreMatchers.is(expectedSettings.getEnableTokenAuthentication()))
assertThat(listRemoteFolderItems, CoreMatchers.is(expectedSettings.getListRemoteFolderItems()))
}
}

@Test(groups = "ociPackageTypeRepo")
void testDockerVirtualRepo() {
artifactory.repositories().create(0, virtualRepo)
def expectedSettings = virtualRepo.repositorySettings

def resp = artifactory.repository(virtualRepo.getKey()).get()
assertThat(resp, CoreMatchers.notNullValue())
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
resp.getRepositorySettings().with {
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))

// local
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))

// remote
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
}
}
}
Loading