Skip to content

Commit

Permalink
Merge pull request #67 from kuleuven/feat/add-remote-repo-propagate-q…
Browse files Browse the repository at this point in the history
…uery-params

Add option on remote repository to propagate query params
  • Loading branch information
chb0github authored May 20, 2021
2 parents 54c4693 + 8669d0d commit 4f79bf1
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 14 deletions.
1 change: 1 addition & 0 deletions docs/resources/artifactory_remote_repository.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ Arguments have a one to one mapping with the [JFrog API](https://www.jfrog.com/c
* `feed_context_path` - (Optional)
* `download_context_path` - (Optional)
* `v3_feed_url` - (Optional)
* `propagate_query_params` - (Optional, Generic repos only)


## Import
Expand Down
35 changes: 26 additions & 9 deletions pkg/artifactory/resource_artifactory_remote_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,11 +300,16 @@ func resourceArtifactoryRemoteRepository() *schema.Resource {
},
},
},
"propagate_query_params": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
},
}
}

func unpackRemoteRepo(s *schema.ResourceData) *v1.RemoteRepository {
func unpackRemoteRepo(s *schema.ResourceData) (*v1.RemoteRepository, error) {
d := &ResourceData{s}
repo := new(v1.RemoteRepository)

Expand Down Expand Up @@ -356,6 +361,7 @@ func unpackRemoteRepo(s *schema.ResourceData) *v1.RemoteRepository {
repo.DownloadContextPath = d.getStringRef("download_context_path", true)
repo.V3FeedUrl = d.getStringRef("v3_feed_url", true)
repo.ForceNugetAuthentication = d.getBoolRef("force_nuget_authentication", false)
repo.PropagateQueryParams = d.getBoolRef("propagate_query_params", true)
if v, ok := d.GetOk("content_synchronisation"); ok {
contentSynchronisationConfig := v.([]interface{})[0].(map[string]interface{})
enabled := contentSynchronisationConfig["enabled"].(bool)
Expand All @@ -374,8 +380,11 @@ func unpackRemoteRepo(s *schema.ResourceData) *v1.RemoteRepository {
V3FeedUrl: &v3FeedUrl,
}
}
if repo.PackageType != nil && *repo.PackageType != "generic" && repo.PropagateQueryParams != nil && *repo.PropagateQueryParams == true {
return nil, fmt.Errorf("Cannot use propagate_query_params with repository type %s. This parameter can be used only with generic repositories.", *repo.PackageType)
}

return repo
return repo, nil
}

func packRemoteRepo(repo *v1.RemoteRepository, d *schema.ResourceData) error {
Expand Down Expand Up @@ -427,6 +436,7 @@ func packRemoteRepo(repo *v1.RemoteRepository, d *schema.ResourceData) error {
logErr(d.Set("download_context_path", repo.DownloadContextPath))
logErr(d.Set("v3_feed_url", repo.V3FeedUrl))
logErr(d.Set("force_nuget_authentication", repo.ForceNugetAuthentication))
logErr(d.Set("propagate_query_params", repo.PropagateQueryParams))
if repo.ContentSynchronisation != nil {
logErr(d.Set("content_synchronisation", []interface{}{
map[string]*bool{
Expand Down Expand Up @@ -457,8 +467,11 @@ func packRemoteRepo(repo *v1.RemoteRepository, d *schema.ResourceData) error {
func resourceRemoteRepositoryCreate(d *schema.ResourceData, m interface{}) error {
c := m.(*ArtClient).ArtOld

repo := unpackRemoteRepo(d)
_, err := c.V1.Repositories.CreateRemote(context.Background(), repo)
repo, err := unpackRemoteRepo(d)
if err != nil {
return err
}
_, err = c.V1.Repositories.CreateRemote(context.Background(), repo)
if err != nil {
return err
}
Expand All @@ -484,9 +497,11 @@ func resourceRemoteRepositoryRead(d *schema.ResourceData, m interface{}) error {
func resourceRemoteRepositoryUpdate(d *schema.ResourceData, m interface{}) error {
c := m.(*ArtClient).ArtOld

repo := unpackRemoteRepo(d)

_, err := c.V1.Repositories.UpdateRemote(context.Background(), d.Id(), repo)
repo, err := unpackRemoteRepo(d)
if err != nil {
return err
}
_, err = c.V1.Repositories.UpdateRemote(context.Background(), d.Id(), repo)
if err != nil {
return err
}
Expand All @@ -497,8 +512,10 @@ func resourceRemoteRepositoryUpdate(d *schema.ResourceData, m interface{}) error

func resourceRemoteRepositoryDelete(d *schema.ResourceData, m interface{}) error {
c := m.(*ArtClient).ArtOld
repo := unpackRemoteRepo(d)

repo, err := unpackRemoteRepo(d)
if err != nil {
return err
}
resp, err := c.V1.Repositories.DeleteRemote(context.Background(), *repo.Key)
if resp.StatusCode == http.StatusNotFound {
d.SetId("")
Expand Down
57 changes: 52 additions & 5 deletions pkg/artifactory/resource_artifactory_remote_repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"
"net/http"
"regexp"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
Expand Down Expand Up @@ -41,7 +42,8 @@ resource "artifactory_remote_repository" "terraform-remote-test-repo-nuget" {
key = "terraform-remote-test-repo-nuget"
url = "https://www.nuget.org/"
repo_layout_ref = "nuget-default"
package_type = "nuget"
package_type = "nuget"
download_context_path = "Download"
feed_context_path = "/api/notdefault"
force_nuget_authentication = true
}`
Expand Down Expand Up @@ -71,7 +73,6 @@ resource "artifactory_remote_repository" "terraform-remote-test-repo-full" {
package_type = "npm"
url = "https://registry.npmjs.org/"
username = "user"
password = "pass"
proxy = ""
description = "desc"
notes = "notes"
Expand Down Expand Up @@ -101,7 +102,6 @@ resource "artifactory_remote_repository" "terraform-remote-test-repo-full" {
enable_cookie_management = true
remote_repo_checksum_policy_type = "ignore-and-generate"
client_tls_certificate = ""
force_nuget_authentication = true
}`

func TestAccRemoteRepository_full(t *testing.T) {
Expand All @@ -117,7 +117,6 @@ func TestAccRemoteRepository_full(t *testing.T) {
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "package_type", "npm"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "url", "https://registry.npmjs.org/"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "username", "user"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "password", getMD5Hash("pass")),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "proxy", ""),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "description", "desc (local file cache)"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "notes", "notes"),
Expand Down Expand Up @@ -148,7 +147,6 @@ func TestAccRemoteRepository_full(t *testing.T) {
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "enable_cookie_management", "true"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "client_tls_certificate", ""),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "remote_repo_checksum_policy_type", "ignore-and-generate"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-full", "force_nuget_authentication", "true"),
),
},
},
Expand Down Expand Up @@ -177,3 +175,52 @@ func resourceRemoteRepositoryCheckDestroy(id string) func(*terraform.State) erro
}
}
}

const remoteNpmRepoBasicWithPropagate = `
resource "artifactory_remote_repository" "terraform-remote-test-repo-basic" {
key = "terraform-remote-test-repo-basic"
package_type = "npm"
url = "https://registry.npmjs.org/"
repo_layout_ref = "npm-default"
propagate_query_params = true
}`

func TestAccRemoteRepository_npm_with_propagate(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: remoteNpmRepoBasicWithPropagate,
ExpectError: regexp.MustCompile(`Cannot use propagate_query_params with repository type npm. This parameter can be used only with generic repositories.`),
},
},
})
}

const remoteGenericRepoBasicWithPropagate = `
resource "artifactory_remote_repository" "terraform-remote-test-repo-basic" {
key = "terraform-remote-test-repo-basic"
package_type = "generic"
url = "https://registry.npmjs.org/"
repo_layout_ref = "simple-default"
propagate_query_params = true
}`

func TestAccRemoteRepository_generic_with_propagate(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
CheckDestroy: resourceRemoteRepositoryCheckDestroy("artifactory_remote_repository.terraform-remote-test-repo-basic"),
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: remoteGenericRepoBasicWithPropagate,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-basic", "key", "terraform-remote-test-repo-basic"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-basic", "package_type", "generic"),
resource.TestCheckResourceAttr("artifactory_remote_repository.terraform-remote-test-repo-basic", "propagate_query_params", "true"),
),
},
},
})
}
9 changes: 9 additions & 0 deletions sample.tf
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ resource "artifactory_remote_repository" "npm-remote" {
xray_index = true
}

resource "artifactory_remote_repository" "icts-p-icts-alpine-generic-remote" {
key = "icts-p-icts-alpine-generic-remote"
description = "alpine Repos"
package_type = "generic"
repo_layout_ref = "simple-default"
url = "http://dl-cdn.alpinelinux.org/alpine"
propagate_query_params = true
}

resource "artifactory_xray_policy" "test" {
name = "test-policy-name-severity"
description = "test policy description"
Expand Down

0 comments on commit 4f79bf1

Please sign in to comment.