Skip to content

Commit aa4d64d

Browse files
authored
Add support for Terraform package type #354 (#380)
1 parent de29d0b commit aa4d64d

File tree

10 files changed

+284
-11
lines changed

10 files changed

+284
-11
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.jfrog.artifactory.client.model.repository.settings;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider;
5+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType;
6+
7+
@JsonIgnoreProperties(ignoreUnknown = true)
8+
public interface TerraformRepositorySettings extends RepositorySettings {
9+
10+
// Local and federated settings
11+
enum TerraformType {
12+
module,
13+
provider
14+
}
15+
16+
TerraformType getTerraformType();
17+
18+
// Remote settings
19+
// Url is already declared in RemoteRepo
20+
21+
VcsType getVcsType();
22+
23+
VcsGitProvider getVcsGitProvider();
24+
25+
String getTerraformRegistryUrl();
26+
27+
String getTerraformProvidersUrl();
28+
29+
String getRemoteRepoLayoutRef();
30+
}

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
@@ -42,7 +42,8 @@
4242
@JsonSubTypes.Type(value = PuppetRepositorySettingsImpl.class, name = "puppet"),
4343
@JsonSubTypes.Type(value = HelmRepositorySettingsImpl.class, name = "helm"),
4444
@JsonSubTypes.Type(value = GoRepositorySettingsImpl.class, name = "go"),
45-
@JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo")
45+
@JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo"),
46+
@JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform")
4647
})
4748

4849
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
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
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
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
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
@@ -32,7 +32,8 @@ public enum PackageTypeImpl implements PackageType {
3232
puppet,
3333
helm,
3434
go,
35-
cargo;
35+
cargo,
36+
terraform;
3637

3738
@Override
3839
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
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
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
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
1919
));
2020

2121
private Collection<String> repositories = Collections.emptyList();
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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.AbstractRepositorySettings;
6+
import org.jfrog.artifactory.client.model.repository.settings.TerraformRepositorySettings;
7+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider;
8+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType;
9+
10+
public class TerraformRepositorySettingsImpl extends AbstractRepositorySettings implements TerraformRepositorySettings {
11+
12+
public static String defaultLayout = "simple-default";
13+
public static String moduleLayout = "terraform-module-default";
14+
public static String providerLayout = "terraform-provider-default";
15+
private TerraformType terraformType;
16+
private String terraformRegistryUrl;
17+
private String terraformProvidersUrl;
18+
private VcsType vcsType;
19+
private VcsGitProvider vcsGitProvider;
20+
private String remoteRepoLayoutRef;
21+
22+
public TerraformRepositorySettingsImpl() {
23+
super(defaultLayout);
24+
}
25+
26+
@Override
27+
public PackageType getPackageType() {
28+
return PackageTypeImpl.terraform;
29+
}
30+
31+
@Override
32+
public TerraformType getTerraformType() {
33+
return terraformType;
34+
}
35+
36+
@Override
37+
public VcsType getVcsType() {
38+
return vcsType;
39+
}
40+
41+
@Override
42+
public VcsGitProvider getVcsGitProvider() {
43+
return vcsGitProvider;
44+
}
45+
46+
@Override
47+
public String getTerraformRegistryUrl() {
48+
return terraformRegistryUrl;
49+
}
50+
51+
@Override
52+
public String getTerraformProvidersUrl() {
53+
return terraformProvidersUrl;
54+
}
55+
56+
@Override
57+
public String getRemoteRepoLayoutRef() {
58+
return remoteRepoLayoutRef;
59+
}
60+
61+
public void setTerraformType(TerraformType terraformType) {
62+
this.terraformType = terraformType;
63+
}
64+
65+
public void setVcsType(VcsType vcsType) {
66+
this.vcsType = vcsType;
67+
}
68+
69+
public void setVcsGitProvider(VcsGitProvider vcsGitProvider) {
70+
this.vcsGitProvider = vcsGitProvider;
71+
}
72+
73+
public void setTerraformRegistryUrl(String terraformRegistryUrl) {
74+
this.terraformRegistryUrl = terraformRegistryUrl;
75+
}
76+
77+
public void setTerraformProvidersUrl(String terraformProvidersUrl) {
78+
this.terraformProvidersUrl = terraformProvidersUrl;
79+
}
80+
81+
public void setRemoteRepoLayoutRef(String remoteRepoLayoutRef) {
82+
this.remoteRepoLayoutRef = remoteRepoLayoutRef;
83+
}
84+
}

services/src/test/groovy/org/jfrog/artifactory/client/BaseRepositoryTests.groovy

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase {
7676
.build()
7777
}
7878
if (prepareLocalRepo) {
79-
RepositorySettings settings = getRepositorySettings()
79+
RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.LOCAL)
8080
localRepo = artifactory.repositories().builders().localRepositoryBuilder()
8181
.key("$REPO_NAME_PREFIX-local-$id")
8282
.description("local-$id")
@@ -95,12 +95,12 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase {
9595
List<FederatedMember> members = new ArrayList<FederatedMember>()
9696
if(federationUrl != null && StringUtils.isNoneBlank(federationUrl)) {
9797
if (!federationUrl.endsWith("/")) {
98-
federationUrl += "/";
98+
federationUrl += "/"
9999
}
100100
FederatedMember member = new FederatedMember( federationUrl+"$REPO_NAME_PREFIX-fed-$id", true)
101101
members.add(member)
102102
}
103-
RepositorySettings settings = getRepositorySettings()
103+
RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.FEDERATED)
104104
federatedRepo = artifactory.repositories().builders().federatedRepositoryBuilder()
105105
.key("$REPO_NAME_PREFIX-fed-$id")
106106
.description("fed-$id")
@@ -118,7 +118,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase {
118118
}
119119

120120
if (prepareRemoteRepo) {
121-
RepositorySettings settings = getRepositorySettings()
121+
RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.REMOTE)
122122
ContentSync contentSync = new ContentSyncImpl()
123123
remoteRepo = artifactory.repositories().builders().remoteRepositoryBuilder()
124124
.key("$REPO_NAME_PREFIX-remote-$id")
@@ -152,7 +152,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase {
152152
}
153153

154154
if (prepareVirtualRepo) {
155-
RepositorySettings settings = getRepositorySettings()
155+
RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.VIRTUAL)
156156
artifactory.repositories().create(0, genericRepo)
157157
def repos = new ArrayList<String>()
158158
repos.add(genericRepo.getKey())
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
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.impl.RepositoryTypeImpl
6+
import org.jfrog.artifactory.client.model.repository.settings.RepositorySettings
7+
import org.jfrog.artifactory.client.model.repository.settings.TerraformRepositorySettings
8+
import org.jfrog.artifactory.client.model.repository.settings.impl.TerraformRepositorySettingsImpl
9+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider
10+
import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType
11+
import org.testng.annotations.BeforeMethod
12+
import org.testng.annotations.Test
13+
14+
class TerraformPackageTypeRepositoryTests extends BaseRepositoryTests {
15+
16+
TerraformPackageTypeRepositoryTests() {
17+
remoteRepoUrl = "https://github.com"
18+
}
19+
20+
@Override
21+
RepositorySettings getRepositorySettings(RepositoryType repositoryType) {
22+
def settings = new TerraformRepositorySettingsImpl()
23+
24+
switch (repositoryType) {
25+
case RepositoryTypeImpl.REMOTE:
26+
settings.with {
27+
repoLayout = defaultLayout
28+
vcsType = VcsType.GIT
29+
vcsGitProvider = VcsGitProvider.GITHUB
30+
terraformRegistryUrl = "https://registry.terraform.io"
31+
terraformProvidersUrl = "https://releases.hashicorp.com"
32+
remoteRepoLayoutRef = defaultLayout
33+
}
34+
break
35+
case RepositoryTypeImpl.VIRTUAL:
36+
settings.with {
37+
repoLayout = moduleLayout
38+
}
39+
break
40+
case RepositoryTypeImpl.FEDERATED:
41+
settings.with {
42+
terraformType = TerraformRepositorySettings.TerraformType.module
43+
repoLayout = moduleLayout
44+
}
45+
break
46+
default:
47+
settings = null
48+
}
49+
50+
return settings
51+
52+
}
53+
54+
@BeforeMethod
55+
protected void setUp() {
56+
super.setUp()
57+
}
58+
59+
@Test(groups = "terraformPackageTypeRepo")
60+
void testTerraformLocalRepoModule() {
61+
def mySettings = new TerraformRepositorySettingsImpl()
62+
mySettings.with {
63+
terraformType = TerraformRepositorySettings.TerraformType.module
64+
repoLayout = moduleLayout
65+
}
66+
67+
testLocalRepoWithSettings(mySettings)
68+
}
69+
70+
@Test(groups = "terraformPackageTypeRepo")
71+
void testTerraformLocalRepoProvider() {
72+
def mySettings = new TerraformRepositorySettingsImpl()
73+
mySettings.with {
74+
terraformType = TerraformRepositorySettings.TerraformType.provider
75+
repoLayout = providerLayout
76+
}
77+
78+
testLocalRepoWithSettings(mySettings)
79+
}
80+
81+
@Test(groups = "terraformPackageTypeRepo")
82+
void testTerraformRemoteRepo() {
83+
artifactory.repositories().create(0, remoteRepo)
84+
def expectedSettings = remoteRepo.repositorySettings
85+
86+
def resp = artifactory.repository(remoteRepo.getKey()).get()
87+
assertThat(resp, CoreMatchers.notNullValue())
88+
assertThat(resp.repoLayoutRef, CoreMatchers.is(expectedSettings.repoLayout))
89+
assertThat(resp.url, CoreMatchers.is(remoteRepoUrl))
90+
resp.getRepositorySettings().with {
91+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
92+
93+
// remote
94+
assertThat(vcsType, CoreMatchers.is(expectedSettings.vcsType))
95+
assertThat(vcsGitProvider, CoreMatchers.is(expectedSettings.vcsGitProvider))
96+
assertThat(terraformRegistryUrl, CoreMatchers.is(expectedSettings.terraformRegistryUrl))
97+
assertThat(terraformProvidersUrl, CoreMatchers.is(expectedSettings.terraformProvidersUrl))
98+
assertThat(remoteRepoLayoutRef, CoreMatchers.is(expectedSettings.remoteRepoLayoutRef))
99+
}
100+
}
101+
102+
@Test(groups = "terraformPackageTypeRepo")
103+
void testTerraformVirtualRepo() {
104+
artifactory.repositories().create(0, virtualRepo)
105+
def expectedSettings = virtualRepo.repositorySettings
106+
107+
def resp = artifactory.repository(virtualRepo.getKey()).get()
108+
assertThat(resp, CoreMatchers.notNullValue())
109+
assertThat(resp.repoLayoutRef, CoreMatchers.is(expectedSettings.repoLayout))
110+
111+
resp.getRepositorySettings().with {
112+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
113+
}
114+
}
115+
116+
@Test(groups = "terraformPackageTypeRepo")
117+
void testTerraformFederatedRepo() {
118+
artifactory.repositories().create(0, federatedRepo)
119+
def expectedSettings = federatedRepo.repositorySettings
120+
121+
def resp = artifactory.repository(federatedRepo.getKey()).get()
122+
assertThat(resp, CoreMatchers.notNullValue())
123+
assertThat(resp.repoLayoutRef, CoreMatchers.is(expectedSettings.repoLayout))
124+
125+
resp.getRepositorySettings().with {
126+
assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType()))
127+
}
128+
}
129+
130+
private void testLocalRepoWithSettings(TerraformRepositorySettingsImpl mySettings) {
131+
String id = Long.toString(repoUniqueId)
132+
def myLocalRepo = artifactory.repositories().builders().localRepositoryBuilder()
133+
.key("$REPO_NAME_PREFIX-local-$id")
134+
.description("local-$id")
135+
.notes("notes-${rnd.nextInt()}")
136+
.archiveBrowsingEnabled(rnd.nextBoolean())
137+
.blackedOut(rnd.nextBoolean())
138+
.excludesPattern("org/${rnd.nextInt()}/**")
139+
.includesPattern("org/${rnd.nextInt()}/**")
140+
.propertySets(Collections.emptyList()) // no property sets configured
141+
.repositorySettings(mySettings)
142+
.xraySettings(xraySettings)
143+
.customProperties(customProperties)
144+
.build()
145+
artifactory.repositories().create(0, myLocalRepo)
146+
def expectedSettings = myLocalRepo.repositorySettings
147+
148+
def resp = artifactory.repository(myLocalRepo.getKey()).get()
149+
assertThat(resp, CoreMatchers.notNullValue())
150+
assertThat(resp.repoLayoutRef, CoreMatchers.is(expectedSettings.repoLayout))
151+
152+
resp.getRepositorySettings().with {
153+
assertThat(packageType, CoreMatchers.is(expectedSettings.packageType))
154+
assertThat(terraformType, CoreMatchers.is(expectedSettings.terraformType))
155+
}
156+
}
157+
}

0 commit comments

Comments
 (0)