Skip to content

Commit fce2baa

Browse files
Add support for OCI package type #386 (#387)
1 parent dc993c3 commit fce2baa

File tree

9 files changed

+166
-6
lines changed

9 files changed

+166
-6
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.jfrog.artifactory.client.model.repository.settings;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
5+
@JsonIgnoreProperties(ignoreUnknown = true)
6+
public interface OciRepositorySettings extends DockerRepositorySettings {
7+
8+
}

services/src/main/java/org/jfrog/artifactory/client/impl/jackson/RepositorySettingsMixIn.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
@JsonSubTypes.Type(value = HelmRepositorySettingsImpl.class, name = "helm"),
4444
@JsonSubTypes.Type(value = GoRepositorySettingsImpl.class, name = "go"),
4545
@JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo"),
46-
@JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform")
46+
@JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform"),
47+
@JsonSubTypes.Type(value = OciRepositorySettingsImpl.class, name = "oci")
4748
})
4849

4950
public abstract class RepositorySettingsMixIn {

services/src/main/java/org/jfrog/artifactory/client/model/impl/FederatedRepositoryBuilderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
public class FederatedRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<FederatedRepositoryBuilder, FederatedRepository> implements FederatedRepositoryBuilder {
1818
private static Set<PackageType> federatedRepositorySupportedTypes = new HashSet<>(Arrays.asList(
19-
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
19+
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
2020
));
2121

2222
protected List<FederatedMember> members = new ArrayList<>();

services/src/main/java/org/jfrog/artifactory/client/model/impl/LocalRepositoryBuilderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
public class LocalRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<LocalRepositoryBuilder, LocalRepository> implements LocalRepositoryBuilder {
1919
private static Set<PackageType> localRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
20-
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
20+
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
2121
));
2222

2323
protected LocalRepositoryBuilderImpl() {

services/src/main/java/org/jfrog/artifactory/client/model/impl/PackageTypeImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ public enum PackageTypeImpl implements PackageType {
3333
helm,
3434
go,
3535
cargo,
36-
terraform;
36+
terraform,
37+
oci;
3738

3839
@Override
3940
public boolean isCustom() {

services/src/main/java/org/jfrog/artifactory/client/model/impl/RemoteRepositoryBuilderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
public class RemoteRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase<RemoteRepositoryBuilder, RemoteRepository> implements RemoteRepositoryBuilder {
1919
private static Set<PackageType> remoteRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
20-
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
20+
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
2121
));
2222

2323
private String url;

services/src/main/java/org/jfrog/artifactory/client/model/impl/VirtualRepositoryBuilderImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
public class VirtualRepositoryBuilderImpl extends RepositoryBuilderBase<VirtualRepositoryBuilder, VirtualRepository> implements VirtualRepositoryBuilder {
1717
private static Set<PackageType> virtualRepositorySupportedTypes = new HashSet<PackageType>(Arrays.asList(
18-
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
18+
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
1919
));
2020

2121
private Collection<String> repositories = Collections.emptyList();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.jfrog.artifactory.client.model.repository.settings.impl;
2+
3+
import org.jfrog.artifactory.client.model.PackageType;
4+
import org.jfrog.artifactory.client.model.impl.PackageTypeImpl;
5+
import org.jfrog.artifactory.client.model.repository.settings.OciRepositorySettings;
6+
7+
public class OciRepositorySettingsImpl extends DockerRepositorySettingsImpl implements OciRepositorySettings {
8+
public static String defaultLayout = "simple-default";
9+
10+
public PackageType getPackageType() {
11+
return PackageTypeImpl.oci;
12+
}
13+
14+
@Override
15+
public boolean equals(Object o) {
16+
if (!(o instanceof OciRepositorySettingsImpl)) {
17+
return false;
18+
}
19+
return super.equals(o);
20+
}
21+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package org.jfrog.artifactory.client
2+
3+
import org.hamcrest.CoreMatchers
4+
import org.jfrog.artifactory.client.model.RepositoryType
5+
import org.jfrog.artifactory.client.model.repository.settings.RepositorySettings
6+
import org.jfrog.artifactory.client.model.repository.settings.docker.DockerApiVersion
7+
import org.jfrog.artifactory.client.model.repository.settings.impl.OciRepositorySettingsImpl
8+
import org.testng.annotations.BeforeMethod
9+
import org.testng.annotations.Test
10+
11+
/**
12+
* test that client correctly sends and receives repository configuration with `oci` package type
13+
*
14+
*/
15+
class OciPackageTypeRepositoryTests extends BaseRepositoryTests {
16+
17+
OciPackageTypeRepositoryTests() {
18+
remoteRepoUrl = "https://registry-1.docker.io"
19+
}
20+
21+
@Override
22+
RepositorySettings getRepositorySettings(RepositoryType repositoryType) {
23+
def settings = new OciRepositorySettingsImpl()
24+
25+
settings.with {
26+
// local
27+
dockerApiVersion = DockerApiVersion.V2
28+
dockerTagRetention = Math.abs(rnd.nextInt())
29+
30+
// remote
31+
enableTokenAuthentication = rnd.nextBoolean()
32+
listRemoteFolderItems = rnd.nextBoolean()
33+
}
34+
35+
return settings
36+
}
37+
38+
@BeforeMethod
39+
protected void setUp() {
40+
storeArtifactsLocallyInRemoteRepo = true
41+
super.setUp()
42+
}
43+
44+
@Test(groups = "ociPackageTypeRepo")
45+
void testOciLocalRepo() {
46+
artifactory.repositories().create(0, localRepo)
47+
def expectedSettings = localRepo.repositorySettings
48+
49+
def resp = artifactory.repository(localRepo.getKey()).get()
50+
assertThat(resp, CoreMatchers.notNullValue())
51+
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
52+
resp.getRepositorySettings().with {
53+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
54+
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))
55+
56+
// local
57+
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
58+
assertThat(dockerTagRetention, CoreMatchers.is(expectedSettings.getDockerTagRetention()))
59+
60+
// remote
61+
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
62+
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
63+
}
64+
}
65+
66+
@Test(groups = "ociPackageTypeRepo")
67+
void testOciFederatedRepo() {
68+
artifactory.repositories().create(0, federatedRepo)
69+
def expectedSettings = federatedRepo.repositorySettings
70+
71+
def resp = artifactory.repository(federatedRepo.getKey()).get()
72+
assertThat(resp, CoreMatchers.notNullValue())
73+
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
74+
resp.getRepositorySettings().with {
75+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
76+
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))
77+
78+
// local
79+
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
80+
81+
// remote
82+
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
83+
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
84+
}
85+
}
86+
87+
@Test(groups = "ociPackageTypeRepo")
88+
void testOciRemoteRepo() {
89+
artifactory.repositories().create(0, remoteRepo)
90+
def expectedSettings = remoteRepo.repositorySettings
91+
92+
def resp = artifactory.repository(remoteRepo.getKey()).get()
93+
assertThat(resp, CoreMatchers.notNullValue())
94+
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
95+
resp.getRepositorySettings().with {
96+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
97+
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))
98+
99+
// local
100+
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
101+
// always in resp payload
102+
103+
// remote
104+
assertThat(enableTokenAuthentication, CoreMatchers.is(expectedSettings.getEnableTokenAuthentication()))
105+
assertThat(listRemoteFolderItems, CoreMatchers.is(expectedSettings.getListRemoteFolderItems()))
106+
}
107+
}
108+
109+
@Test(groups = "ociPackageTypeRepo")
110+
void testDockerVirtualRepo() {
111+
artifactory.repositories().create(0, virtualRepo)
112+
def expectedSettings = virtualRepo.repositorySettings
113+
114+
def resp = artifactory.repository(virtualRepo.getKey()).get()
115+
assertThat(resp, CoreMatchers.notNullValue())
116+
assertThat(resp.repoLayoutRef, CoreMatchers.is(OciRepositorySettingsImpl.defaultLayout))
117+
resp.getRepositorySettings().with {
118+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
119+
assertThat(repoLayout, CoreMatchers.is(expectedSettings.getRepoLayout()))
120+
121+
// local
122+
assertThat(dockerApiVersion, CoreMatchers.is(expectedSettings.getDockerApiVersion()))
123+
124+
// remote
125+
assertThat(enableTokenAuthentication, CoreMatchers.is(CoreMatchers.nullValue()))
126+
assertThat(listRemoteFolderItems, CoreMatchers.is(CoreMatchers.nullValue()))
127+
}
128+
}
129+
}

0 commit comments

Comments
 (0)