Skip to content

Commit 3b47132

Browse files
author
Alex Hung
authored
Merge pull request #105 from jfrog/add-project-repository-resource
Add 'project_repository' resource
2 parents 5bfc412 + 9f4e7d2 commit 3b47132

35 files changed

+937
-470
lines changed

CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## 1.5.0 (March 13, 2024)
2+
3+
FEATURES:
4+
5+
* **New Resource:** `project_repository` - Separate resource to manage project repositories.
6+
* resource/project: Add `use_project_repository_resource` attribute to toggle if `project` resource should use its `repos` attribute or not to manage project repositories. Should be set to `false` to continue using existing `repos` attribute.
7+
8+
IMPROVEMENTS:
9+
10+
* resource/project, resource/project_environment, resource/project_role: Fix documentation for `project_key` attribute to match validation. Issue: [#103](https://github.com/jfrog/terraform-provider-project/issues/103)
11+
12+
PR: [#105](https://github.com/jfrog/terraform-provider-project/pull/105)
13+
114
## 1.4.0 (March 4, 2024)
215

316
FEATURES:

docs/index.md

+49-41
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ terraform {
3737
required_providers {
3838
artifactory = {
3939
source = "registry.terraform.io/jfrog/artifactory"
40-
version = "2.20.0"
40+
version = "10.3.0"
4141
}
4242
project = {
4343
source = "registry.terraform.io/jfrog/project"
44-
version = "1.0.3"
44+
version = "1.5.0"
4545
}
4646
}
4747
}
@@ -124,53 +124,61 @@ resource "project" "myproject" {
124124
max_storage_in_gibibytes = 10
125125
block_deployments_on_limit = false
126126
email_notification = true
127+
}
127128
128-
member {
129-
name = "user1"
130-
roles = ["Developer", "Project Admin"]
131-
}
129+
resource "project_user" "user1" {
130+
project_key = project.myproject.key
131+
name = "user1"
132+
roles = ["developer","project admin"]
133+
}
132134
133-
member {
134-
name = "user2"
135-
roles = ["Developer"]
136-
}
135+
resource "project_user" "user2" {
136+
project_key = project.myproject.key
137+
name = "user2"
138+
roles = ["developer"]
139+
}
137140
138-
group {
139-
name = "qa"
140-
roles = ["qa"]
141-
}
141+
resource "project_group" "qa" {
142+
project_key = project.myproject.key
143+
name = "qa"
144+
roles = ["qa"]
145+
}
142146
143-
group {
144-
name = "release"
145-
roles = ["Release Manager"]
146-
}
147+
resource "project_group" "release" {
148+
project_key = project.myproject.key
149+
name = "release"
150+
roles = ["release manager"]
151+
}
147152
148-
role {
149-
name = "qa"
150-
description = "QA role"
151-
type = "CUSTOM"
152-
environments = ["DEV"]
153-
actions = var.qa_roles
154-
}
153+
resource "project_role" "qa" {
154+
project_key = project.myproject.key
155+
name = "qa"
156+
type = "CUSTOM"
157+
environments = ["DEV"]
158+
actions = var.qa_roles
159+
}
155160
156-
role {
157-
name = "devop"
158-
description = "DevOp role"
159-
type = "CUSTOM"
160-
environments = ["DEV", "PROD"]
161-
actions = var.devop_roles
162-
}
161+
resource "project_role" "devop" {
162+
project_key = project.myproject.key
163+
name = "devop"
164+
type = "CUSTOM"
165+
environments = ["DEV", "PROD"]
166+
actions = var.devop_roles
167+
}
168+
169+
resource "project_repository" "docker-local" {
170+
project_key = project.myproject.key
171+
key = "docker-local"
172+
}
163173
164-
repos = ["docker-local", "npm-remote"]
174+
resource "project_repository" "npm-local" {
175+
project_key = project.myproject.key
176+
key = "npm-local"
177+
}
165178
166-
depends_on = [
167-
artifactory_user.user1,
168-
artifactory_user.user2,
169-
artifactory_group.qa-group,
170-
artifactory_group.release-group,
171-
artifactory_local_docker_v2_repository.docker-local,
172-
artifactory_remote_npm_repository.npm-remote,
173-
]
179+
resource "project_environment" "myenv" {
180+
project_key = project.myproj.key
181+
name = "myenv"
174182
}
175183
```
176184

docs/resources/environment.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ resource "project_environment" "myenv" {
2828
### Required
2929

3030
- `name` (String) Environment name. Must start with a letter and can contain letters, digits and `-` character.
31-
- `project_key` (String) Project key for this environment. This field supports only 2 - 20 lowercase alphanumeric and hyphen characters. Must begin with a letter.
31+
- `project_key` (String) Project key for this environment. This field supports only 2 - 32 lowercase alphanumeric and hyphen characters. Must begin with a letter.
3232

3333
### Read-Only
3434

docs/resources/project.md

+3-25
Original file line numberDiff line numberDiff line change
@@ -59,29 +59,6 @@ resource "project" "myproject" {
5959
max_storage_in_gibibytes = 10
6060
block_deployments_on_limit = false
6161
email_notification = true
62-
use_project_role_resource = true
63-
64-
member {
65-
name = "user1"
66-
roles = ["developer","project admin"]
67-
}
68-
69-
member {
70-
name = "user2"
71-
roles = ["developer"]
72-
}
73-
74-
group {
75-
name = "dev-group"
76-
roles = ["developer"]
77-
}
78-
79-
group {
80-
name = "release-group"
81-
roles = ["release manager"]
82-
}
83-
84-
repos = ["docker-local", "rpm-local"]
8562
}
8663
```
8764

@@ -92,7 +69,7 @@ resource "project" "myproject" {
9269

9370
- `admin_privileges` (Block Set, Min: 1) (see [below for nested schema](#nestedblock--admin_privileges))
9471
- `display_name` (String) Also known as project name on the UI
95-
- `key` (String) The Project Key is added as a prefix to resources created within a Project. This field is mandatory and supports only 2 - 20 lowercase alphanumeric and hyphen characters. Must begin with a letter. For example: `us1a-test`.
72+
- `key` (String) The Project Key is added as a prefix to resources created within a Project. This field is mandatory and supports only 2 - 32 lowercase alphanumeric and hyphen characters. Must begin with a letter. For example: `us1a-test`.
9673

9774
### Optional
9875

@@ -104,7 +81,7 @@ resource "project" "myproject" {
10481
- `group` (Block Set, Deprecated) Project group. Element has one to one mapping with the [JFrog Project Groups API](https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-UpdateGroupinProject) (see [below for nested schema](#nestedblock--group))
10582
- `max_storage_in_gibibytes` (Number) Storage quota in GiB. Must be 1 or larger. Set to -1 for unlimited storage. This is translated to binary bytes for Artifactory API. So for a 1TB quota, this should be set to 1024 (vs 1000) which will translate to 1099511627776 bytes for the API.
10683
- `member` (Block Set, Deprecated) Member of the project. Element has one to one mapping with the [JFrog Project Users API](https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-UpdateUserinProject). (see [below for nested schema](#nestedblock--member))
107-
- `repos` (Set of String) (Optional) List of existing repo keys to be assigned to the project. **Note** We *strongly* recommend using this attribute to manage the list of repositories. If you wish to use the alternate method of setting `project_key` attribute in each `artifactory_*_repository` resource in the `artifactory` provider, you will need to use `lifecycle.ignore_changes` in the `project` resource to avoid state drift.
84+
- `repos` (Set of String, Deprecated) (Optional) List of existing repo keys to be assigned to the project. **Note** We *strongly* recommend using this attribute to manage the list of repositories. If you wish to use the alternate method of setting `project_key` attribute in each `artifactory_*_repository` resource in the `artifactory` provider, you will need to use `lifecycle.ignore_changes` in the `project` resource to avoid state drift.
10885

10986
```hcl
11087
lifecycle {
@@ -115,6 +92,7 @@ lifecycle {
11592
```
11693
- `role` (Block Set, Deprecated) Project role. Element has one to one mapping with the [JFrog Project Roles API](https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-AddaNewRole) (see [below for nested schema](#nestedblock--role))
11794
- `use_project_group_resource` (Boolean) When set to true, this resource will ignore the `group` attributes and allow users to be managed by `project_group` resource instead. Default to `true`.
95+
- `use_project_repository_resource` (Boolean) When set to true, this resource will ignore the `repos` attributes and allow repository to be managed by `project_repository` resource instead. Default to `true`.
11896
- `use_project_role_resource` (Boolean) When set to true, this resource will ignore the `roles` attributes and allow roles to be managed by `project_role` resource instead. Default to `true`.
11997
- `use_project_user_resource` (Boolean) When set to true, this resource will ignore the `member` attributes and allow users to be managed by `project_user` resource instead. Default to `true`.
12098

docs/resources/repository.md

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "project_repository Resource - terraform-provider-project"
4+
subcategory: ""
5+
description: |-
6+
Assign a repository to a project. Requires a user assigned with the 'Administer the Platform' role or Project Admin permissions if admin_privileges.manage_resoures is enabled.
7+
---
8+
9+
# project_repository (Resource)
10+
11+
Assign a repository to a project. Requires a user assigned with the 'Administer the Platform' role or Project Admin permissions if `admin_privileges.manage_resoures` is enabled.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "project_repository" "myprojectrepo" {
17+
project_key = "myproj"
18+
key = "my-generic-local"
19+
}
20+
```
21+
22+
<!-- schema generated by tfplugindocs -->
23+
## Schema
24+
25+
### Required
26+
27+
- `key` (String) The key of the repository.
28+
- `project_key` (String) The key of the project to which the repository should be assigned to.
29+
30+
### Read-Only
31+
32+
- `id` (String) The ID of this resource.
33+
34+
## Import
35+
36+
Import is supported using the following syntax:
37+
38+
```shell
39+
terraform import project_repository.myprojectrepo project_key:repository_key
40+
```

docs/resources/role.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ resource "project_role" "myrole" {
3131
- `actions` (Set of String) List of pre-defined actions (READ_REPOSITORY, ANNOTATE_REPOSITORY, DEPLOY_CACHE_REPOSITORY, DELETE_OVERWRITE_REPOSITORY, MANAGE_XRAY_MD_REPOSITORY, READ_RELEASE_BUNDLE, ANNOTATE_RELEASE_BUNDLE, CREATE_RELEASE_BUNDLE, DISTRIBUTE_RELEASE_BUNDLE, DELETE_RELEASE_BUNDLE, MANAGE_XRAY_MD_RELEASE_BUNDLE, READ_BUILD, ANNOTATE_BUILD, DEPLOY_BUILD, DELETE_BUILD, MANAGE_XRAY_MD_BUILD, READ_SOURCES_PIPELINE, TRIGGER_PIPELINE, READ_INTEGRATIONS_PIPELINE, READ_POOLS_PIPELINE, MANAGE_INTEGRATIONS_PIPELINE, MANAGE_SOURCES_PIPELINE, MANAGE_POOLS_PIPELINE, TRIGGER_SECURITY, ISSUES_SECURITY, LICENCES_SECURITY, REPORTS_SECURITY, WATCHES_SECURITY, POLICIES_SECURITY, RULES_SECURITY, MANAGE_MEMBERS, MANAGE_RESOURCES)
3232
- `environments` (Set of String) A repository can be available in different environments. Members with roles defined in the set environment will have access to the repository. List of pre-defined environments (DEV, PROD)
3333
- `name` (String)
34-
- `project_key` (String) Project key for this environment. This field supports only 2 - 20 lowercase alphanumeric and hyphen characters. Must begin with a letter.
34+
- `project_key` (String) Project key for this environment. This field supports only 2 - 32 lowercase alphanumeric and hyphen characters. Must begin with a letter.
3535
- `type` (String) Type of role. Only "CUSTOM" is supported
3636

3737
### Read-Only

examples/full.tf

+49-41
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ terraform {
33
required_providers {
44
artifactory = {
55
source = "registry.terraform.io/jfrog/artifactory"
6-
version = "2.20.0"
6+
version = "10.3.0"
77
}
88
project = {
99
source = "registry.terraform.io/jfrog/project"
10-
version = "1.0.3"
10+
version = "1.5.0"
1111
}
1212
}
1313
}
@@ -90,51 +90,59 @@ resource "project" "myproject" {
9090
max_storage_in_gibibytes = 10
9191
block_deployments_on_limit = false
9292
email_notification = true
93+
}
9394

94-
member {
95-
name = "user1"
96-
roles = ["Developer", "Project Admin"]
97-
}
95+
resource "project_user" "user1" {
96+
project_key = project.myproject.key
97+
name = "user1"
98+
roles = ["developer","project admin"]
99+
}
98100

99-
member {
100-
name = "user2"
101-
roles = ["Developer"]
102-
}
101+
resource "project_user" "user2" {
102+
project_key = project.myproject.key
103+
name = "user2"
104+
roles = ["developer"]
105+
}
103106

104-
group {
105-
name = "qa"
106-
roles = ["qa"]
107-
}
107+
resource "project_group" "qa" {
108+
project_key = project.myproject.key
109+
name = "qa"
110+
roles = ["qa"]
111+
}
108112

109-
group {
110-
name = "release"
111-
roles = ["Release Manager"]
112-
}
113+
resource "project_group" "release" {
114+
project_key = project.myproject.key
115+
name = "release"
116+
roles = ["release manager"]
117+
}
113118

114-
role {
115-
name = "qa"
116-
description = "QA role"
117-
type = "CUSTOM"
118-
environments = ["DEV"]
119-
actions = var.qa_roles
120-
}
119+
resource "project_role" "qa" {
120+
project_key = project.myproject.key
121+
name = "qa"
122+
type = "CUSTOM"
123+
environments = ["DEV"]
124+
actions = var.qa_roles
125+
}
121126

122-
role {
123-
name = "devop"
124-
description = "DevOp role"
125-
type = "CUSTOM"
126-
environments = ["DEV", "PROD"]
127-
actions = var.devop_roles
128-
}
127+
resource "project_role" "devop" {
128+
project_key = project.myproject.key
129+
name = "devop"
130+
type = "CUSTOM"
131+
environments = ["DEV", "PROD"]
132+
actions = var.devop_roles
133+
}
134+
135+
resource "project_repository" "docker-local" {
136+
project_key = project.myproject.key
137+
key = "docker-local"
138+
}
129139

130-
repos = ["docker-local", "npm-remote"]
140+
resource "project_repository" "npm-local" {
141+
project_key = project.myproject.key
142+
key = "npm-local"
143+
}
131144

132-
depends_on = [
133-
artifactory_user.user1,
134-
artifactory_user.user2,
135-
artifactory_group.qa-group,
136-
artifactory_group.release-group,
137-
artifactory_local_docker_v2_repository.docker-local,
138-
artifactory_remote_npm_repository.npm-remote,
139-
]
145+
resource "project_environment" "myenv" {
146+
project_key = project.myproj.key
147+
name = "myenv"
140148
}

examples/resources/project/resource.tf

-23
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,4 @@ resource "project" "myproject" {
1010
max_storage_in_gibibytes = 10
1111
block_deployments_on_limit = false
1212
email_notification = true
13-
use_project_role_resource = true
14-
15-
member {
16-
name = "user1"
17-
roles = ["developer","project admin"]
18-
}
19-
20-
member {
21-
name = "user2"
22-
roles = ["developer"]
23-
}
24-
25-
group {
26-
name = "dev-group"
27-
roles = ["developer"]
28-
}
29-
30-
group {
31-
name = "release-group"
32-
roles = ["release manager"]
33-
}
34-
35-
repos = ["docker-local", "rpm-local"]
3613
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
terraform import project_repository.myprojectrepo project_key:repository_key
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
resource "project_repository" "myprojectrepo" {
2+
project_key = "myproj"
3+
key = "my-generic-local"
4+
}

0 commit comments

Comments
 (0)