Skip to content

Commit 10e2c8f

Browse files
ceng-574-cargo-upstream
1 parent a907fbb commit 10e2c8f

File tree

3 files changed

+163
-1
lines changed

3 files changed

+163
-1
lines changed

cloudsmith/resource_repository_upstream.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
// upstream types
1616
const (
17+
Cargo = "cargo"
1718
Composer = "composer"
1819
Cran = "cran"
1920
Dart = "dart"
@@ -67,6 +68,7 @@ var (
6768
"Cache Only",
6869
}
6970
upstreamTypes = []string{
71+
Cargo,
7072
Composer,
7173
Cran,
7274
Dart,
@@ -186,6 +188,24 @@ func resourceRepositoryUpstreamCreate(d *schema.ResourceData, m interface{}) err
186188
var err error
187189

188190
switch upstreamType {
191+
case Cargo:
192+
req := pc.APIClient.ReposApi.ReposUpstreamCargoCreate(pc.Auth, namespace, repository)
193+
req = req.Data(cloudsmith.CargoUpstreamRequest{
194+
AuthMode: authMode,
195+
AuthSecret: authSecret,
196+
AuthUsername: authUsername,
197+
ExtraHeader1: extraHeader1,
198+
ExtraHeader2: extraHeader2,
199+
ExtraValue1: extraValue1,
200+
ExtraValue2: extraValue2,
201+
IsActive: isActive,
202+
Mode: mode,
203+
Name: name,
204+
Priority: priority,
205+
UpstreamUrl: upstreamUrl,
206+
VerifySsl: verifySsl,
207+
})
208+
upstream, resp, err = pc.APIClient.ReposApi.ReposUpstreamCargoCreateExecute(req)
189209
case Composer:
190210
req := pc.APIClient.ReposApi.ReposUpstreamComposerCreate(pc.Auth, namespace, repository)
191211
req = req.Data(cloudsmith.ComposerUpstreamRequest{
@@ -503,6 +523,9 @@ func getUpstream(d *schema.ResourceData, m interface{}) (Upstream, *http.Respons
503523
var upstream Upstream
504524

505525
switch upstreamType {
526+
case Cargo:
527+
req := pc.APIClient.ReposApi.ReposUpstreamCargoRead(pc.Auth, namespace, repository, d.Id())
528+
upstream, resp, err = pc.APIClient.ReposApi.ReposUpstreamCargoReadExecute(req)
506529
case Composer:
507530
req := pc.APIClient.ReposApi.ReposUpstreamComposerRead(pc.Auth, namespace, repository, d.Id())
508531
upstream, resp, err = pc.APIClient.ReposApi.ReposUpstreamComposerReadExecute(req)
@@ -639,6 +662,24 @@ func resourceRepositoryUpstreamUpdate(d *schema.ResourceData, m interface{}) err
639662
var err error
640663

641664
switch upstreamType {
665+
case Cargo:
666+
req := pc.APIClient.ReposApi.ReposUpstreamCargoUpdate(pc.Auth, namespace, repository, slugPerm)
667+
req = req.Data(cloudsmith.CargoUpstreamRequest{
668+
AuthMode: authMode,
669+
AuthSecret: authSecret,
670+
AuthUsername: authUsername,
671+
ExtraHeader1: extraHeader1,
672+
ExtraHeader2: extraHeader2,
673+
ExtraValue1: extraValue1,
674+
ExtraValue2: extraValue2,
675+
IsActive: isActive,
676+
Mode: mode,
677+
Name: name,
678+
Priority: priority,
679+
UpstreamUrl: upstreamUrl,
680+
VerifySsl: verifySsl,
681+
})
682+
upstream, _, err = pc.APIClient.ReposApi.ReposUpstreamCargoUpdateExecute(req)
642683
case Composer:
643684
req := pc.APIClient.ReposApi.ReposUpstreamComposerUpdate(pc.Auth, namespace, repository, slugPerm)
644685
req = req.Data(cloudsmith.ComposerUpstreamRequest{
@@ -946,6 +987,9 @@ func resourceRepositoryUpstreamDelete(d *schema.ResourceData, m interface{}) err
946987
var err error
947988

948989
switch upstreamType {
990+
case Cargo:
991+
req := pc.APIClient.ReposApi.ReposUpstreamCargoDelete(pc.Auth, namespace, repository, d.Id())
992+
_, err = pc.APIClient.ReposApi.ReposUpstreamCargoDeleteExecute(req)
949993
case Composer:
950994
req := pc.APIClient.ReposApi.ReposUpstreamComposerDelete(pc.Auth, namespace, repository, d.Id())
951995
_, err = pc.APIClient.ReposApi.ReposUpstreamComposerDeleteExecute(req)

cloudsmith/resource_repository_upstream_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,109 @@ import (
1818
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1919
)
2020

21+
func TestAccRepositoryUpstreamCargo_basic(t *testing.T) {
22+
t.Parallel()
23+
24+
const cargoUpstreamResourceName = "cloudsmith_repository_upstream.crates_io"
25+
26+
testAccRepositoryCargoUpstreamConfigBasic := fmt.Sprintf(`
27+
resource "cloudsmith_repository" "test" {
28+
name = "terraform-acc-test-upstream-cargo"
29+
namespace = "%s"
30+
}
31+
32+
resource "cloudsmith_repository_upstream" "crates_io" {
33+
namespace = cloudsmith_repository.test.namespace
34+
repository = cloudsmith_repository.test.slug
35+
name = cloudsmith_repository.test.name
36+
upstream_type = "cargo"
37+
upstream_url = "https://index.crates.io"
38+
}
39+
`, namespace)
40+
41+
testAccRepositoryCargoUpstreamConfigUpdate := fmt.Sprintf(`
42+
resource "cloudsmith_repository" "test" {
43+
name = "terraform-acc-test-upstream-cargo"
44+
namespace = "%s"
45+
}
46+
47+
resource "cloudsmith_repository_upstream" "crates_io" {
48+
extra_header_1 = "X-Custom-Header"
49+
extra_header_2 = "Access-Control-Allow-Origin"
50+
extra_value_1 = "custom-value"
51+
extra_value_2 = "*"
52+
is_active = true
53+
mode = "Proxy Only"
54+
name = cloudsmith_repository.test.name
55+
namespace = cloudsmith_repository.test.namespace
56+
priority = 12345
57+
repository = cloudsmith_repository.test.slug
58+
upstream_type = "cargo"
59+
upstream_url = "https://index.crates.io"
60+
verify_ssl = false
61+
}
62+
`, namespace)
63+
64+
resource.Test(t, resource.TestCase{
65+
PreCheck: func() { testAccPreCheck(t) },
66+
Providers: testAccProviders,
67+
CheckDestroy: testAccRepositoryUpstreamCheckDestroy(cargoUpstreamResourceName),
68+
Steps: []resource.TestStep{
69+
{
70+
Config: testAccRepositoryCargoUpstreamConfigBasic,
71+
Check: resource.ComposeTestCheckFunc(
72+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, AuthMode, "None"),
73+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, AuthUsername, ""),
74+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, Component),
75+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, CreatedAt),
76+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, DistroVersion),
77+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, DistroVersions),
78+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, ExtraHeader1, ""),
79+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, ExtraHeader2, ""),
80+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, ExtraValue1, ""),
81+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, ExtraValue2, ""),
82+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, IncludeSources),
83+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, IsActive, "true"),
84+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, Mode, "Proxy Only"),
85+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, Priority),
86+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, SlugPerm),
87+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, UpdatedAt),
88+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, UpstreamDistribution),
89+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, VerifySsl, "true"),
90+
),
91+
},
92+
{
93+
Config: testAccRepositoryCargoUpstreamConfigUpdate,
94+
Check: resource.ComposeTestCheckFunc(
95+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, Component),
96+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, CreatedAt),
97+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, DistroVersion),
98+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, DistroVersions),
99+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, IncludeSources),
100+
resource.TestCheckResourceAttrSet(cargoUpstreamResourceName, UpdatedAt),
101+
resource.TestCheckNoResourceAttr(cargoUpstreamResourceName, UpstreamDistribution),
102+
resource.TestCheckResourceAttr(cargoUpstreamResourceName, IsActive, "true"),
103+
),
104+
},
105+
{
106+
ResourceName: cargoUpstreamResourceName,
107+
ImportState: true,
108+
ImportStateIdFunc: func(s *terraform.State) (string, error) {
109+
resourceState := s.RootModule().Resources[cargoUpstreamResourceName]
110+
return fmt.Sprintf(
111+
"%s.%s.%s.%s",
112+
resourceState.Primary.Attributes[Namespace],
113+
resourceState.Primary.Attributes[Repository],
114+
resourceState.Primary.Attributes[UpstreamType],
115+
resourceState.Primary.Attributes[SlugPerm],
116+
), nil
117+
},
118+
ImportStateVerify: true,
119+
},
120+
},
121+
})
122+
}
123+
21124
func TestAccRepositoryUpstreamDart_basic(t *testing.T) {
22125
t.Parallel()
23126

@@ -1424,6 +1527,9 @@ func testAccRepositoryUpstreamCheckDestroy(resourceName string) resource.TestChe
14241527
var err error
14251528

14261529
switch upstreamType {
1530+
case Cargo:
1531+
req := pc.APIClient.ReposApi.ReposUpstreamCargoRead(pc.Auth, namespace, repository, slugPerm)
1532+
_, resp, err = pc.APIClient.ReposApi.ReposUpstreamCargoReadExecute(req)
14271533
case Composer:
14281534
req := pc.APIClient.ReposApi.ReposUpstreamComposerRead(pc.Auth, namespace, repository, slugPerm)
14291535
_, resp, err = pc.APIClient.ReposApi.ReposUpstreamComposerReadExecute(req)

docs/resources/repository_upstream.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ resource "cloudsmith_repository" "my_repository" {
2727

2828
...minimal configuration for various upstream types might be added as per the following examples for popular package registries.
2929

30+
### Cargo
31+
32+
```hcl
33+
resource "cloudsmith_repository_upstream" "crates_io" {
34+
name = "Crates.io"
35+
namespace = "${data.cloudsmith_organization.my_organization.slug_perm}"
36+
repository = "${resource.cloudsmith_repository.my_repository.slug_perm}"
37+
upstream_type = "cargo"
38+
upstream_url = "https://crates.io"
39+
}
40+
```
41+
3042
### Composer
3143

3244
```hcl
@@ -247,7 +259,7 @@ The following arguments are supported:
247259
| `priority` | N | number | N/A | Upstream sources are selected for resolving requests by sequential order (1..n), followed by creation date. |
248260
| `repository` | Y | string | N/A | The Repository to which the upstream belongs. |
249261
| `upstream_distribution` | N | string | N/A | Used only in conjunction with an `upstream_type` of `"deb"` to declare the [distribution](https://wiki.debian.org/DebianRepository/Format#Overview) to fetch from the upstream. |
250-
| `upstream_type` | Y | string | `"composer"`<br>`"cran"`<br>`"dart"`<br>`"deb"`<br>`"docker"`<br>`"go"`<br>`"helm"`<br>`"maven"`<br>`"npm"`<br>`"nuget"`<br>`"python"`<br>`"rpm"`<br>`"ruby"`<br>`"swift"` | The type of Upstream. |
262+
| `upstream_type` | Y | string | `"cargo"`<br>`"composer"`<br>`"cran"`<br>`"dart"`<br>`"deb"`<br>`"docker"`<br>`"go"`<br>`"helm"`<br>`"maven"`<br>`"npm"`<br>`"nuget"`<br>`"python"`<br>`"rpm"`<br>`"ruby"`<br>`"swift"` | The type of Upstream. |
251263
| `upstream_url` | Y | string | N/A | The URL for this upstream source. This must be a fully qualified URL including any path elements required to reach the root of the repository. The URL cannot end with a trailing slash. |
252264
| `verify_ssl` | N | bool | N/A | If enabled, SSL certificates are verified when requests are made to this upstream. It's recommended to leave this enabled for all public sources to help mitigate Man-In-The-Middle (MITM) attacks. Please note this only applies to HTTPS upstreams. |
253265

0 commit comments

Comments
 (0)