diff --git a/api/src/main/java/org/jfrog/artifactory/client/model/repository/settings/TerraformRepositorySettings.java b/api/src/main/java/org/jfrog/artifactory/client/model/repository/settings/TerraformRepositorySettings.java new file mode 100644 index 00000000..3660f01a --- /dev/null +++ b/api/src/main/java/org/jfrog/artifactory/client/model/repository/settings/TerraformRepositorySettings.java @@ -0,0 +1,31 @@ +package org.jfrog.artifactory.client.model.repository.settings; + +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider; +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType; + +public interface TerraformRepositorySettings extends RepositorySettings{ + + // local and federated settings + enum TerraformType { + module, + provider + } + + // local and federated settings + TerraformType getTerraformType(); + + // remote settings + + // url is already declared in RemoteRepo + + VcsType getVcsType(); + + VcsGitProvider getVcsGitProvider(); + + String getTerraformRegistryUrl(); + + String getTerraformProvidersUrl(); + + String getRemoteRepoLayoutRef(); + +} diff --git a/services/src/main/java/org/jfrog/artifactory/client/impl/jackson/RepositorySettingsMixIn.java b/services/src/main/java/org/jfrog/artifactory/client/impl/jackson/RepositorySettingsMixIn.java index 2d21e320..7439f7e9 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/impl/jackson/RepositorySettingsMixIn.java +++ b/services/src/main/java/org/jfrog/artifactory/client/impl/jackson/RepositorySettingsMixIn.java @@ -42,7 +42,8 @@ @JsonSubTypes.Type(value = PuppetRepositorySettingsImpl.class, name = "puppet"), @JsonSubTypes.Type(value = HelmRepositorySettingsImpl.class, name = "helm"), @JsonSubTypes.Type(value = GoRepositorySettingsImpl.class, name = "go"), - @JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo") + @JsonSubTypes.Type(value = CargoRepositorySettingsImpl.class, name = "cargo"), + @JsonSubTypes.Type(value = TerraformRepositorySettingsImpl.class, name = "terraform") }) public abstract class RepositorySettingsMixIn { diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/FederatedRepositoryBuilderImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/FederatedRepositoryBuilderImpl.java index e807a15d..9e25dac5 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/model/impl/FederatedRepositoryBuilderImpl.java +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/FederatedRepositoryBuilderImpl.java @@ -16,7 +16,7 @@ */ public class FederatedRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase implements FederatedRepositoryBuilder { private static Set 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 + 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 )); protected List members = new ArrayList<>(); diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/LocalRepositoryBuilderImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/LocalRepositoryBuilderImpl.java index 2d7a04bd..0d536340 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/model/impl/LocalRepositoryBuilderImpl.java +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/LocalRepositoryBuilderImpl.java @@ -17,7 +17,7 @@ */ public class LocalRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase implements LocalRepositoryBuilder { private static Set localRepositorySupportedTypes = 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 + 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 )); protected LocalRepositoryBuilderImpl() { diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/PackageTypeImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/PackageTypeImpl.java index df7c7848..23d85eb1 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/model/impl/PackageTypeImpl.java +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/PackageTypeImpl.java @@ -32,7 +32,8 @@ public enum PackageTypeImpl implements PackageType { puppet, helm, go, - cargo; + cargo, + terraform; @Override public boolean isCustom() { diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/RemoteRepositoryBuilderImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/RemoteRepositoryBuilderImpl.java index 8b2625ec..bef2adc0 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/model/impl/RemoteRepositoryBuilderImpl.java +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/RemoteRepositoryBuilderImpl.java @@ -17,7 +17,7 @@ */ public class RemoteRepositoryBuilderImpl extends NonVirtualRepositoryBuilderBase implements RemoteRepositoryBuilder { private static Set remoteRepositorySupportedTypes = new HashSet(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 + 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 )); private String url; diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/VirtualRepositoryBuilderImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/VirtualRepositoryBuilderImpl.java index 651a3b90..b29b8b54 100644 --- a/services/src/main/java/org/jfrog/artifactory/client/model/impl/VirtualRepositoryBuilderImpl.java +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/VirtualRepositoryBuilderImpl.java @@ -15,7 +15,7 @@ */ public class VirtualRepositoryBuilderImpl extends RepositoryBuilderBase implements VirtualRepositoryBuilder { private static Set virtualRepositorySupportedTypes = new HashSet(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 + 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 )); private Collection repositories = Collections.emptyList(); diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/repository/settings/impl/TerraformRepositorySettingsImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/repository/settings/impl/TerraformRepositorySettingsImpl.java new file mode 100644 index 00000000..f81a8771 --- /dev/null +++ b/services/src/main/java/org/jfrog/artifactory/client/model/repository/settings/impl/TerraformRepositorySettingsImpl.java @@ -0,0 +1,84 @@ +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.AbstractRepositorySettings; +import org.jfrog.artifactory.client.model.repository.settings.TerraformRepositorySettings; +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider; +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType; + +public class TerraformRepositorySettingsImpl extends AbstractRepositorySettings implements TerraformRepositorySettings { + + public static String defaultLayout = "simple-default"; + public static String moduleLayout = "terraform-module-default"; + public static String providerLayout = "terraform-provider-default"; + private TerraformType terraformType; + private String terraformRegistryUrl; + private String terraformProvidersUrl; + private VcsType vcsType; + private VcsGitProvider vcsGitProvider; + private String remoteRepoLayoutRef; + + public TerraformRepositorySettingsImpl() { + super(defaultLayout); + } + + @Override + public PackageType getPackageType() { + return PackageTypeImpl.terraform; + } + + @Override + public TerraformType getTerraformType() { + return terraformType; + } + + @Override + public VcsType getVcsType() { + return vcsType; + } + + @Override + public VcsGitProvider getVcsGitProvider() { + return vcsGitProvider; + } + + @Override + public String getTerraformRegistryUrl() { + return terraformRegistryUrl; + } + + @Override + public String getTerraformProvidersUrl() { + return terraformProvidersUrl; + } + + @Override + public String getRemoteRepoLayoutRef() { + return remoteRepoLayoutRef; + } + + public void setTerraformType(TerraformType terraformType) { + this.terraformType = terraformType; + } + + public void setVcsType(VcsType vcsType) { + this.vcsType = vcsType; + } + + public void setVcsGitProvider(VcsGitProvider vcsGitProvider) { + this.vcsGitProvider = vcsGitProvider; + } + + public void setTerraformRegistryUrl(String terraformRegistryUrl) { + this.terraformRegistryUrl = terraformRegistryUrl; + } + + public void setTerraformProvidersUrl(String terraformProvidersUrl) { + this.terraformProvidersUrl = terraformProvidersUrl; + } + + public void setRemoteRepoLayoutRef(String remoteRepoLayoutRef) { + this.remoteRepoLayoutRef = remoteRepoLayoutRef; + } +} diff --git a/services/src/test/groovy/org/jfrog/artifactory/client/BaseRepositoryTests.groovy b/services/src/test/groovy/org/jfrog/artifactory/client/BaseRepositoryTests.groovy index 1b7419ad..911dd282 100644 --- a/services/src/test/groovy/org/jfrog/artifactory/client/BaseRepositoryTests.groovy +++ b/services/src/test/groovy/org/jfrog/artifactory/client/BaseRepositoryTests.groovy @@ -76,7 +76,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase { .build() } if (prepareLocalRepo) { - RepositorySettings settings = getRepositorySettings() + RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.LOCAL) localRepo = artifactory.repositories().builders().localRepositoryBuilder() .key("$REPO_NAME_PREFIX-local-$id") .description("local-$id") @@ -95,12 +95,12 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase { List members = new ArrayList() if(federationUrl != null && StringUtils.isNoneBlank(federationUrl)) { if (!federationUrl.endsWith("/")) { - federationUrl += "/"; + federationUrl += "/" } FederatedMember member = new FederatedMember( federationUrl+"$REPO_NAME_PREFIX-fed-$id", true) members.add(member) } - RepositorySettings settings = getRepositorySettings() + RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.FEDERATED) federatedRepo = artifactory.repositories().builders().federatedRepositoryBuilder() .key("$REPO_NAME_PREFIX-fed-$id") .description("fed-$id") @@ -118,7 +118,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase { } if (prepareRemoteRepo) { - RepositorySettings settings = getRepositorySettings() + RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.REMOTE) ContentSync contentSync = new ContentSyncImpl() remoteRepo = artifactory.repositories().builders().remoteRepositoryBuilder() .key("$REPO_NAME_PREFIX-remote-$id") @@ -152,7 +152,7 @@ abstract class BaseRepositoryTests extends ArtifactoryTestsBase { } if (prepareVirtualRepo) { - RepositorySettings settings = getRepositorySettings() + RepositorySettings settings = getRepositorySettings(RepositoryTypeImpl.VIRTUAL) artifactory.repositories().create(0, genericRepo) def repos = new ArrayList() repos.add(genericRepo.getKey()) diff --git a/services/src/test/groovy/org/jfrog/artifactory/client/TerraformPackageTypeRepositoryTests.groovy b/services/src/test/groovy/org/jfrog/artifactory/client/TerraformPackageTypeRepositoryTests.groovy new file mode 100644 index 00000000..3b49b3ea --- /dev/null +++ b/services/src/test/groovy/org/jfrog/artifactory/client/TerraformPackageTypeRepositoryTests.groovy @@ -0,0 +1,159 @@ +package org.jfrog.artifactory.client + +import org.hamcrest.CoreMatchers +import org.jfrog.artifactory.client.model.RepositoryType +import org.jfrog.artifactory.client.model.impl.RepositoryTypeImpl +import org.jfrog.artifactory.client.model.repository.settings.RepositorySettings +import org.jfrog.artifactory.client.model.repository.settings.TerraformRepositorySettings +import org.jfrog.artifactory.client.model.repository.settings.impl.TerraformRepositorySettingsImpl +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsGitProvider +import org.jfrog.artifactory.client.model.repository.settings.vcs.VcsType +import org.testng.annotations.BeforeMethod +import org.testng.annotations.Test + +class TerraformPackageTypeRepositoryTests extends BaseRepositoryTests { + + TerraformPackageTypeRepositoryTests() { + remoteRepoUrl = "https://github.com" + } + + @Override + RepositorySettings getRepositorySettings(RepositoryType repositoryType) { + + if (repositoryType == RepositoryTypeImpl.REMOTE) { + def settings = new TerraformRepositorySettingsImpl() + settings.with { + repoLayout = defaultLayout + vcsType = VcsType.GIT + vcsGitProvider = VcsGitProvider.GITHUB + terraformRegistryUrl = "https://registry.terraform.io" + terraformProvidersUrl = "https://releases.hashicorp.com" + remoteRepoLayoutRef = defaultLayout + } + return settings + } + + if (repositoryType == RepositoryTypeImpl.VIRTUAL) { + def settings = new TerraformRepositorySettingsImpl() + settings.with { + repoLayout = moduleLayout + } + return settings + } + + if (repositoryType == RepositoryTypeImpl.FEDERATED) { + def settings = new TerraformRepositorySettingsImpl() + settings.with { + terraformType = TerraformRepositorySettings.TerraformType.module + repoLayout = moduleLayout + } + return settings + } + + return null + } + + @BeforeMethod + protected void setUp() { + super.setUp() + } + + @Test(groups = "terraformPackageTypeRepo") + void testTerraformLocalRepoModule() { + def mySettings = new TerraformRepositorySettingsImpl() + mySettings.with { + terraformType = TerraformRepositorySettings.TerraformType.module + repoLayout = moduleLayout + } + + testLocalRepoWithSettings(mySettings) + } + + @Test(groups = "terraformPackageTypeRepo") + void testTerraformLocalRepoProvider() { + def mySettings = new TerraformRepositorySettingsImpl() + mySettings.with { + terraformType = TerraformRepositorySettings.TerraformType.provider + repoLayout = providerLayout + } + + testLocalRepoWithSettings(mySettings) + } + + @Test(groups = "terraformPackageTypeRepo") + void testTerraformRemoteRepo() { + 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(expectedSettings.repoLayout)) + assertThat(resp.url, CoreMatchers.is(remoteRepoUrl)) + resp.getRepositorySettings().with { + assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType())) + + // remote + assertThat(vcsType, CoreMatchers.is(expectedSettings.vcsType)) + assertThat(vcsGitProvider, CoreMatchers.is(expectedSettings.vcsGitProvider)) + assertThat(terraformRegistryUrl, CoreMatchers.is(expectedSettings.terraformRegistryUrl)) + assertThat(terraformProvidersUrl, CoreMatchers.is(expectedSettings.terraformProvidersUrl)) + assertThat(remoteRepoLayoutRef, CoreMatchers.is(expectedSettings.remoteRepoLayoutRef)) + } + } + + @Test(groups = "terraformPackageTypeRepo") + void testTerraformVirtualRepo() { + 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(expectedSettings.repoLayout)) + + resp.getRepositorySettings().with { + assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType())) + } + } + + @Test(groups = "terraformPackageTypeRepo") + void testTerraformFederatedRepo() { + 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(expectedSettings.repoLayout)) + + resp.getRepositorySettings().with { + assertThat(packageType, CoreMatchers.is(expectedSettings.getPackageType())) + } + } + + private void testLocalRepoWithSettings(TerraformRepositorySettingsImpl mySettings) { + String id = Long.toString(repoUniqueId) + def myLocalRepo = artifactory.repositories().builders().localRepositoryBuilder() + .key("$REPO_NAME_PREFIX-local-$id") + .description("local-$id") + .notes("notes-${rnd.nextInt()}") + .archiveBrowsingEnabled(rnd.nextBoolean()) + .blackedOut(rnd.nextBoolean()) + .excludesPattern("org/${rnd.nextInt()}/**") + .includesPattern("org/${rnd.nextInt()}/**") + .propertySets(Collections.emptyList()) // no property sets configured + .repositorySettings(mySettings) + .xraySettings(xraySettings) + .customProperties(customProperties) + .build() + artifactory.repositories().create(0, myLocalRepo) + def expectedSettings = myLocalRepo.repositorySettings + + def resp = artifactory.repository(myLocalRepo.getKey()).get() + assertThat(resp, CoreMatchers.notNullValue()) + assertThat(resp.repoLayoutRef, CoreMatchers.is(expectedSettings.repoLayout)) + + resp.getRepositorySettings().with { + assertThat(packageType, CoreMatchers.is(expectedSettings.packageType)) + assertThat(terraformType, CoreMatchers.is(expectedSettings.terraformType)) + } + } +}