Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions artifactory/services/localrepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ func NewSwiftLocalRepositoryParams() SwiftLocalRepositoryParams {

type TerraformLocalRepositoryParams struct {
LocalRepositoryBaseParams
TerraformRepositoryParams
}

func NewTerraformLocalRepositoryParams() TerraformLocalRepositoryParams {
Expand Down
19 changes: 17 additions & 2 deletions artifactory/services/remoterepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ func (rrs *RemoteRepositoryService) Alpine(params AlpineRemoteRepositoryParams)
return rrs.performRequest(params, params.Key)
}

func (rrs *RemoteRepositoryService) Ansible(params AnsibleRemoteRepositoryParams) error {
return rrs.performRequest(params, params.Key)
}

func (rrs *RemoteRepositoryService) Bower(params BowerRemoteRepositoryParams) error {
return rrs.performRequest(params, params.Key)
}
Expand Down Expand Up @@ -232,6 +236,14 @@ func NewAlpineRemoteRepositoryParams() AlpineRemoteRepositoryParams {
return AlpineRemoteRepositoryParams{RemoteRepositoryBaseParams: NewRemoteRepositoryPackageParams("alpine")}
}

type AnsibleRemoteRepositoryParams struct {
RemoteRepositoryBaseParams
}

func NewAnsibleRemoteRepositoryParams() AnsibleRemoteRepositoryParams {
return AnsibleRemoteRepositoryParams{RemoteRepositoryBaseParams: NewRemoteRepositoryPackageParams("ansible")}
}

type BowerRemoteRepositoryParams struct {
RemoteRepositoryBaseParams
VcsGitRemoteRepositoryParams
Expand Down Expand Up @@ -371,7 +383,7 @@ func NewGradleRemoteRepositoryParams() GradleRemoteRepositoryParams {

type HelmRemoteRepositoryParams struct {
RemoteRepositoryBaseParams
ChartsBaseUrl string `json:"chartsBaseUrl,omitempty"`
ChartsBaseUrl string `json:"chartsBaseUrl"` // do not set omitempty to be able to empty the value when updating
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if let's say this used for updating, are we making sure any empty value sent to the server is not updated in the database?

Copy link
Author

@richardlt richardlt Nov 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about the implementation in the Artifactory API since I don't have the source for it. But in the client updating local and remote repositories config will result in a call to the method https://github.com/jfrog/jfrog-client-go/blob/master/artifactory/services/repository.go#L28 that will marshal the struct (remove the empty values from the body) and send a POST request. Maybe the POST is implemented like a PATCH on the server and ignore missing fields.

Copy link
Author

@richardlt richardlt Nov 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also what strange in that performRequest function is that the update will run a POST while the create will do a PUT.

ExternalDependenciesEnabled bool `json:"externalDependenciesEnabled,omitempty"`
ExternalDependenciesPatterns []string `json:"externalDependenciesPatterns,omitempty"`
}
Expand Down Expand Up @@ -408,10 +420,11 @@ func NewNpmRemoteRepositoryParams() NpmRemoteRepositoryParams {

type NugetRemoteRepositoryParams struct {
RemoteRepositoryBaseParams
FeedContextPath string `json:"feedContextPath,omitempty"`
FeedContextPath string `json:"feedContextPath"` // do not set omitempty to be able to empty the value according https://jfrog.com/help/r/artifactory-step-by-step-guide-to-configure-nuget-smart-remote-repository/step-4
DownloadContextPath string `json:"downloadContextPath,omitempty"`
V3FeedUrl string `json:"v3FeedUrl,omitempty"`
ForceNugetAuthentication *bool `json:"forceNugetAuthentication,omitempty"`
SymbolServerUrl string `json:"symbolServerUrl,omitempty"`
}

func NewNugetRemoteRepositoryParams() NugetRemoteRepositoryParams {
Expand Down Expand Up @@ -484,6 +497,8 @@ type TerraformRemoteRepositoryParams struct {
VcsGitRemoteRepositoryParams
TerraformRegistryUrl string `json:"terraformRegistryUrl,omitempty"`
TerraformProvidersUrl string `json:"terraformProvidersUrl,omitempty"`
ProvidersUrl string `json:"providersUrl,omitempty"`
TerraformType string `json:"terraformType,omitempty"`
}

func NewTerraformRemoteRepositoryParams() TerraformRemoteRepositoryParams {
Expand Down
5 changes: 5 additions & 0 deletions artifactory/services/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ type AdditionalRepositoryBaseParams struct {

type CargoRepositoryParams struct {
CargoAnonymousAccess *bool `json:"cargoAnonymousAccess,omitempty"`
CargoInternalIndex *bool `json:"cargoInternalIndex,omitempty"`
}

type DebianRepositoryParams struct {
Expand All @@ -104,6 +105,10 @@ type JavaPackageManagersRepositoryParams struct {
ChecksumPolicyType string `json:"checksumPolicyType,omitempty"`
}

type TerraformRepositoryParams struct {
TerraformType string `json:"terraformType"`
}

type KeyPairRefsRepositoryParams struct {
PrimaryKeyPairRef string `json:"primaryKeyPairRef,omitempty"`
SecondaryKeyPairRef string `json:"secondaryKeyPairRef,omitempty"`
Expand Down
2 changes: 2 additions & 0 deletions tests/artifactorylocalrepository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,7 @@ func localTerraformTest(t *testing.T) {
tlp := services.NewTerraformLocalRepositoryParams()
tlp.Key = repoKey
setLocalRepositoryBaseParams(&tlp.LocalRepositoryBaseParams, false)
setTerraformRepositoryParams(&tlp.TerraformRepositoryParams, false)

err := testsCreateLocalRepositoryService.Terraform(tlp)
if !assert.NoError(t, err, "Failed to create "+repoKey) {
Expand All @@ -658,6 +659,7 @@ func localTerraformTest(t *testing.T) {
validateRepoConfig(t, repoKey, tlp)

setLocalRepositoryBaseParams(&tlp.LocalRepositoryBaseParams, true)
setTerraformRepositoryParams(&tlp.TerraformRepositoryParams, true)

err = testsUpdateLocalRepositoryService.Terraform(tlp)
if assert.NoError(t, err, "Failed to update "+repoKey) {
Expand Down
25 changes: 25 additions & 0 deletions tests/artifactoryremoterepository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const MavenCentralUrl = "https://repo.maven.apache.org"
func TestArtifactoryRemoteRepository(t *testing.T) {
initRepositoryTest(t)
t.Run("remoteAlpineTest", remoteAlpineTest)
t.Run("remoteAnsibleTest", remoteAnsibleTest)
t.Run("remoteBowerTest", remoteBowerTest)
t.Run("remoteCargoTest", remoteCargoTest)
t.Run("remoteChefTest", remoteChefTest)
Expand Down Expand Up @@ -154,6 +155,28 @@ func remoteAlpineTest(t *testing.T) {
}
}

func remoteAnsibleTest(t *testing.T) {
repoKey := GenerateRepoKeyForRepoServiceTest()
arp := services.NewAnsibleRemoteRepositoryParams()
arp.Key = repoKey
arp.Url = "https://galaxy.ansible.com"
setRemoteRepositoryBaseParams(&arp.RemoteRepositoryBaseParams, false)

err := testsCreateRemoteRepositoryService.Ansible(arp)
if !assert.NoError(t, err, "Failed to create "+repoKey) {
return
}
deleteRepoOnTestDone(t, repoKey)
validateRepoConfig(t, repoKey, arp)

setRemoteRepositoryBaseParams(&arp.RemoteRepositoryBaseParams, true)

err = testsUpdateRemoteRepositoryService.Ansible(arp)
if assert.NoError(t, err, "Failed to update "+repoKey) {
validateRepoConfig(t, repoKey, arp)
}
}

func remoteBowerTest(t *testing.T) {
repoKey := GenerateRepoKeyForRepoServiceTest()
brp := services.NewBowerRemoteRepositoryParams()
Expand Down Expand Up @@ -623,6 +646,7 @@ func remoteNugetTest(t *testing.T) {
nrp.DownloadContextPath = "api/v1/package"
nrp.V3FeedUrl = "https://api.nuget.org/v3/index.json"
nrp.ForceNugetAuthentication = utils.Pointer(true)
nrp.SymbolServerUrl = "https://community.chocolatey.org"

err := testsCreateRemoteRepositoryService.Nuget(nrp)
if !assert.NoError(t, err, "Failed to create "+repoKey) {
Expand All @@ -636,6 +660,7 @@ func remoteNugetTest(t *testing.T) {
nrp.DownloadContextPath = ""
nrp.V3FeedUrl = ""
nrp.ForceNugetAuthentication = utils.Pointer(true)
nrp.SymbolServerUrl = "https://community.chocolatey.org"

err = testsUpdateRemoteRepositoryService.Nuget(nrp)
if assert.NoError(t, err, "Failed to update "+repoKey) {
Expand Down
2 changes: 0 additions & 2 deletions tests/artifactoryvirtualrepository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -675,8 +675,6 @@ func virtualTerraformTest(t *testing.T) {
setCacheVirtualRepositoryParams(&tvp.CommonCacheVirtualRepositoryParams, true)

err = testsUpdateVirtualRepositoryService.Terraform(tvp)
assert.NoError(t, err, "Failed to update "+repoKey)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't this assertion valid? Is it possible to provide proper comment in the codebase why it was decided to be removed?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed this two lines because there are the same assertions at line 680.

validateRepoConfig(t, repoKey, tvp)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

if assert.NoError(t, err, "Failed to update "+repoKey) {
validateRepoConfig(t, repoKey, tvp)
}
Expand Down
10 changes: 10 additions & 0 deletions tests/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -794,8 +794,10 @@ func setAdditionalRepositoryBaseParams(params *services.AdditionalRepositoryBase
func setCargoRepositoryParams(params *services.CargoRepositoryParams, isUpdate bool) {
if !isUpdate {
params.CargoAnonymousAccess = clientutils.Pointer(true)
params.CargoInternalIndex = clientutils.Pointer(true)
} else {
params.CargoAnonymousAccess = clientutils.Pointer(false)
params.CargoInternalIndex = clientutils.Pointer(false)
}
}

Expand Down Expand Up @@ -875,6 +877,14 @@ func setRpmRepositoryParams(params *services.RpmRepositoryParams, isUpdate bool)
}
}

func setTerraformRepositoryParams(params *services.TerraformRepositoryParams, isUpdate bool) {
if !isUpdate {
params.TerraformType = "provider"
} else {
params.TerraformType = "module"
}
}

func getRepoConfig(repoKey string) ([]byte, error) {
artDetails := GetRtDetails()
artHttpDetails := artDetails.CreateHttpClientDetails()
Expand Down
Loading