mirror of
https://git.uploadfilter24.eu/lerentis/terraform-provider-gitea.git
synced 2024-12-04 21:08:11 +00:00
Merge pull request #37 from yamadayutaka/feature/team_repositories
implement repositories attribute to gitea_team
This commit is contained in:
commit
bc28fe186f
8 changed files with 134 additions and 6 deletions
2
Makefile
2
Makefile
|
@ -5,7 +5,7 @@ KERNEL?=$$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||||
|
|
||||||
GOFMT ?= gofmt -s
|
GOFMT ?= gofmt -s
|
||||||
|
|
||||||
VERSION = 0.12.3
|
VERSION = 0.13.0
|
||||||
|
|
||||||
test: fmt-check
|
test: fmt-check
|
||||||
go test -i $(TEST) || exit 1
|
go test -i $(TEST) || exit 1
|
||||||
|
|
|
@ -17,7 +17,7 @@ terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.3"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.3"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,26 @@ resource "gitea_team" "test_team" {
|
||||||
permission = "write"
|
permission = "write"
|
||||||
members = [gitea_user.test.username]
|
members = [gitea_user.test.username]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "gitea_repository" "test" {
|
||||||
|
username = gitea_org.test_org.name
|
||||||
|
name = "test"
|
||||||
|
private = true
|
||||||
|
issue_labels = "Default"
|
||||||
|
license = "MIT"
|
||||||
|
gitignores = "Go"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "gitea_team" "test_team_restricted" {
|
||||||
|
name = "Restricted Devs"
|
||||||
|
organisation = gitea_org.test_org.name
|
||||||
|
description = "Restricted Devs of Test Org"
|
||||||
|
permission = "write"
|
||||||
|
members = [gitea_user.test.username]
|
||||||
|
include_all_repositories = false
|
||||||
|
repositories = [gitea_repository.test.name]
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- schema generated by tfplugindocs -->
|
<!-- schema generated by tfplugindocs -->
|
||||||
|
@ -52,6 +72,7 @@ resource "gitea_team" "test_team" {
|
||||||
- `members` (List of String) List of Users that should be part of this team
|
- `members` (List of String) List of Users that should be part of this team
|
||||||
- `permission` (String) Permissions associated with this Team
|
- `permission` (String) Permissions associated with this Team
|
||||||
Can be `none`, `read`, `write`, `admin` or `owner`
|
Can be `none`, `read`, `write`, `admin` or `owner`
|
||||||
|
- `repositories` (List of String) List of Repositories that should be part of this team
|
||||||
- `units` (String) List of types of Repositories that should be allowed to be created from Team members.
|
- `units` (String) List of types of Repositories that should be allowed to be created from Team members.
|
||||||
Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki`
|
Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki`
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "terraform.local/lerentis/gitea"
|
source = "terraform.local/lerentis/gitea"
|
||||||
version = "0.12.3"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
gitea = {
|
gitea = {
|
||||||
source = "Lerentis/gitea"
|
source = "Lerentis/gitea"
|
||||||
version = "0.12.3"
|
version = "0.13.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,3 +19,23 @@ resource "gitea_team" "test_team" {
|
||||||
permission = "write"
|
permission = "write"
|
||||||
members = [gitea_user.test.username]
|
members = [gitea_user.test.username]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "gitea_repository" "test" {
|
||||||
|
username = gitea_org.test_org.name
|
||||||
|
name = "test"
|
||||||
|
private = true
|
||||||
|
issue_labels = "Default"
|
||||||
|
license = "MIT"
|
||||||
|
gitignores = "Go"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "gitea_team" "test_team_restricted" {
|
||||||
|
name = "Restricted Devs"
|
||||||
|
organisation = gitea_org.test_org.name
|
||||||
|
description = "Restricted Devs of Test Org"
|
||||||
|
permission = "write"
|
||||||
|
members = [gitea_user.test.username]
|
||||||
|
include_all_repositories = false
|
||||||
|
repositories = [gitea_repository.test.name]
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package gitea
|
package gitea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -18,6 +19,7 @@ const (
|
||||||
TeamIncludeAllReposFlag string = "include_all_repositories"
|
TeamIncludeAllReposFlag string = "include_all_repositories"
|
||||||
TeamUnits string = "units"
|
TeamUnits string = "units"
|
||||||
TeamMembers string = "members"
|
TeamMembers string = "members"
|
||||||
|
TeamRepositories string = "repositories"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) {
|
func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) {
|
||||||
|
@ -75,12 +77,14 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
||||||
units = append(units, gitea.RepoUnitProjects)
|
units = append(units, gitea.RepoUnitProjects)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
includeAllRepos := d.Get(TeamIncludeAllReposFlag).(bool)
|
||||||
|
|
||||||
opts := gitea.CreateTeamOption{
|
opts := gitea.CreateTeamOption{
|
||||||
Name: d.Get(TeamName).(string),
|
Name: d.Get(TeamName).(string),
|
||||||
Description: d.Get(TeamDescription).(string),
|
Description: d.Get(TeamDescription).(string),
|
||||||
Permission: gitea.AccessMode(d.Get(TeamPermissions).(string)),
|
Permission: gitea.AccessMode(d.Get(TeamPermissions).(string)),
|
||||||
CanCreateOrgRepo: d.Get(TeamCreateRepoFlag).(bool),
|
CanCreateOrgRepo: d.Get(TeamCreateRepoFlag).(bool),
|
||||||
IncludesAllRepositories: d.Get(TeamIncludeAllReposFlag).(bool),
|
IncludesAllRepositories: includeAllRepos,
|
||||||
Units: units,
|
Units: units,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +105,13 @@ func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !includeAllRepos {
|
||||||
|
err = setTeamRepositories(team, d, meta, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err = setTeamResourceData(team, d)
|
err = setTeamResourceData(team, d)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -181,6 +192,13 @@ func resourceTeamUpdate(d *schema.ResourceData, meta interface{}) (err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !includeAllRepos {
|
||||||
|
err = setTeamRepositories(team, d, meta, true)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
team, _, _ = client.GetTeam(id)
|
team, _, _ = client.GetTeam(id)
|
||||||
|
|
||||||
err = setTeamResourceData(team, d)
|
err = setTeamResourceData(team, d)
|
||||||
|
@ -218,6 +236,7 @@ func setTeamResourceData(team *gitea.Team, d *schema.ResourceData) (err error) {
|
||||||
d.Set(TeamUnits, d.Get(TeamUnits).(string))
|
d.Set(TeamUnits, d.Get(TeamUnits).(string))
|
||||||
d.Set(TeamOrg, d.Get(TeamOrg).(string))
|
d.Set(TeamOrg, d.Get(TeamOrg).(string))
|
||||||
d.Set(TeamMembers, d.Get(TeamMembers))
|
d.Set(TeamMembers, d.Get(TeamMembers))
|
||||||
|
d.Set(TeamRepositories, d.Get(TeamRepositories))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,7 +309,75 @@ func resourceGiteaTeam() *schema.Resource {
|
||||||
Computed: true,
|
Computed: true,
|
||||||
Description: "List of Users that should be part of this team",
|
Description: "List of Users that should be part of this team",
|
||||||
},
|
},
|
||||||
|
"repositories": {
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Elem: &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
},
|
||||||
|
Optional: true,
|
||||||
|
Required: false,
|
||||||
|
Computed: true,
|
||||||
|
Description: "List of Repositories that should be part of this team",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Description: "`gitea_team` manages Team that are part of an organisation.",
|
Description: "`gitea_team` manages Team that are part of an organisation.",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setTeamRepositories(team *gitea.Team, d *schema.ResourceData, meta interface{}, update bool) (err error) {
|
||||||
|
client := meta.(*gitea.Client)
|
||||||
|
|
||||||
|
org := d.Get(TeamOrg).(string)
|
||||||
|
|
||||||
|
repositories := make(map[string]bool)
|
||||||
|
for _, repo := range d.Get(TeamRepositories).([]interface{}) {
|
||||||
|
if repo != "" {
|
||||||
|
repositories[repo.(string)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if update {
|
||||||
|
page := 1
|
||||||
|
|
||||||
|
for {
|
||||||
|
var existingRepositories []*gitea.Repository
|
||||||
|
existingRepositories, _, err = client.ListTeamRepositories(team.ID, gitea.ListTeamRepositoriesOptions{
|
||||||
|
ListOptions: gitea.ListOptions{
|
||||||
|
Page: page,
|
||||||
|
PageSize: 50,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error listeng team repositories: %s", err))
|
||||||
|
}
|
||||||
|
if len(existingRepositories) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, exr := range existingRepositories {
|
||||||
|
_, exists := repositories[exr.Name]
|
||||||
|
if exists {
|
||||||
|
repositories[exr.Name] = false
|
||||||
|
} else {
|
||||||
|
_, err = client.RemoveTeamRepository(team.ID, org, exr.Name)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error removing team repository %q: %s", exr.Name, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for repo, flag := range repositories {
|
||||||
|
if flag {
|
||||||
|
_, err = client.AddTeamRepository(team.ID, org, repo)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("[ERROR] Error adding team repository %q: %s", repo, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue