Merge pull request '#3 added team resource and fixed crash in public key state persisting' (#4) from feature/tt/#3-team-management into main
Reviewed-on: #4
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor) | ||||
|  | ||||
| GOFMT ?= gofmt -s | ||||
|  | ||||
| VERSION = 0.5.0 | ||||
| VERSION = 0.6.0 | ||||
|  | ||||
| test: fmt-check | ||||
| 	go test -i $(TEST) || exit 1 | ||||
|   | ||||
							
								
								
									
										62
									
								
								docs/resources/team.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								docs/resources/team.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| --- | ||||
| # generated by https://github.com/hashicorp/terraform-plugin-docs | ||||
| page_title: "gitea_team Resource - terraform-provider-gitea" | ||||
| subcategory: "" | ||||
| description: |- | ||||
|   gitea_team manages Team that are part of an organisation. | ||||
| --- | ||||
|  | ||||
| # gitea_team (Resource) | ||||
|  | ||||
| `gitea_team` manages Team that are part of an organisation. | ||||
|  | ||||
| ## Example Usage | ||||
|  | ||||
| ```terraform | ||||
| resource "gitea_org" "test_org" { | ||||
|   name = "test-org" | ||||
| } | ||||
|  | ||||
| resource "gitea_user" "test" { | ||||
|   username             = "test" | ||||
|   login_name           = "test" | ||||
|   password             = "Geheim1!" | ||||
|   email                = "test@user.dev" | ||||
|   must_change_password = false | ||||
|   admin                = true | ||||
| } | ||||
|  | ||||
|  | ||||
| resource "gitea_team" "test_team" { | ||||
|   name         = "Devs" | ||||
|   organisation = gitea_org.test_org.name | ||||
|   description  = "Devs of Test Org" | ||||
|   permission   = "write" | ||||
|   members      = [gitea_user.test.username] | ||||
| } | ||||
| ``` | ||||
|  | ||||
| <!-- schema generated by tfplugindocs --> | ||||
| ## Schema | ||||
|  | ||||
| ### Required | ||||
|  | ||||
| - `name` (String) Name of the Team | ||||
| - `organisation` (String) The organisation which this Team is part of. | ||||
|  | ||||
| ### Optional | ||||
|  | ||||
| - `can_create_repos` (Boolean) Flag if the Teams members should be able to create Rpositories in the Organisation | ||||
| - `description` (String) Description of the Team | ||||
| - `include_all_repositories` (Boolean) Flag if the Teams members should have access to all Repositories in the Organisation | ||||
| - `members` (List of String) List of Users that should be part of this team | ||||
| - `permission` (String) Permissions associated with this Team | ||||
| Can be `none`, `read`, `write`, `admin` or `owner` | ||||
| - `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` | ||||
|  | ||||
| ### Read-Only | ||||
|  | ||||
| - `id` (String) The ID of this resource. | ||||
|  | ||||
|  | ||||
| @@ -46,3 +46,12 @@ resource "gitea_public_key" "test_user_key" { | ||||
|   read_only = true | ||||
|   username  = gitea_user.test.username | ||||
| } | ||||
|  | ||||
|  | ||||
| resource "gitea_team" "test_team" { | ||||
|   name         = "Devs" | ||||
|   organisation = gitea_org.test_org.name | ||||
|   description  = "Devs of Test Org" | ||||
|   permission   = "write" | ||||
|   members      = [gitea_user.test.username] | ||||
| } | ||||
|   | ||||
| @@ -2,7 +2,7 @@ terraform { | ||||
|   required_providers { | ||||
|     gitea = { | ||||
|       source = "terraform.local/lerentis/gitea" | ||||
|       version = "0.5.0" | ||||
|       version = "0.6.0" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										21
									
								
								examples/resources/gitea_team/resource.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								examples/resources/gitea_team/resource.tf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| resource "gitea_org" "test_org" { | ||||
|   name = "test-org" | ||||
| } | ||||
|  | ||||
| resource "gitea_user" "test" { | ||||
|   username             = "test" | ||||
|   login_name           = "test" | ||||
|   password             = "Geheim1!" | ||||
|   email                = "test@user.dev" | ||||
|   must_change_password = false | ||||
|   admin                = true | ||||
| } | ||||
|  | ||||
|  | ||||
| resource "gitea_team" "test_team" { | ||||
|   name         = "Devs" | ||||
|   organisation = gitea_org.test_org.name | ||||
|   description  = "Devs of Test Org" | ||||
|   permission   = "write" | ||||
|   members      = [gitea_user.test.username] | ||||
| } | ||||
| @@ -80,6 +80,7 @@ func Provider() terraform.ResourceProvider { | ||||
| 			"gitea_oauth2_app": resourceGiteaOauthApp(), | ||||
| 			"gitea_repository": resourceGiteaRepository(), | ||||
| 			"gitea_public_key": resourceGiteaPublicKey(), | ||||
| 			"gitea_team":       resourceGiteaTeam(), | ||||
| 		}, | ||||
|  | ||||
| 		ConfigureFunc: providerConfigure, | ||||
|   | ||||
| @@ -90,7 +90,7 @@ func resourcePublicKeyDelete(d *schema.ResourceData, meta interface{}) (err erro | ||||
|  | ||||
| func setPublicKeyResourceData(pubKey *gitea.PublicKey, d *schema.ResourceData) (err error) { | ||||
| 	d.SetId(fmt.Sprintf("%d", pubKey.ID)) | ||||
| 	d.Set(PublicKeyUser, pubKey.Owner.UserName) | ||||
| 	d.Set(PublicKeyUser, d.Get(PublicKeyUser).(string)) | ||||
| 	d.Set(PublicKey, pubKey.Key) | ||||
| 	d.Set(PublicKeyTitle, pubKey.Title) | ||||
| 	d.Set(PublicKeyReadOnlyFlag, pubKey.ReadOnly) | ||||
|   | ||||
							
								
								
									
										296
									
								
								gitea/resource_gitea_team.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								gitea/resource_gitea_team.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | ||||
| package gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	TeamName                string = "name" | ||||
| 	TeamOrg                 string = "organisation" | ||||
| 	TeamDescription         string = "description" | ||||
| 	TeamPermissions         string = "permission" | ||||
| 	TeamCreateRepoFlag      string = "can_create_repos" | ||||
| 	TeamIncludeAllReposFlag string = "include_all_repositories" | ||||
| 	TeamUnits               string = "units" | ||||
| 	TeamMembers             string = "members" | ||||
| ) | ||||
|  | ||||
| func resourceTeamRead(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	id, err := strconv.ParseInt(d.Id(), 10, 64) | ||||
|  | ||||
| 	var resp *gitea.Response | ||||
| 	var team *gitea.Team | ||||
|  | ||||
| 	team, resp, err = client.GetTeam(id) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if resp.StatusCode == 404 { | ||||
| 			d.SetId("") | ||||
| 			return nil | ||||
| 		} else { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	err = setTeamResourceData(team, d) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func resourceTeamCreate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	var team *gitea.Team | ||||
| 	var units []gitea.RepoUnitType | ||||
|  | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.code") { | ||||
| 		units = append(units, gitea.RepoUnitCode) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.issues") { | ||||
| 		units = append(units, gitea.RepoUnitIssues) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.ext_issues") { | ||||
| 		units = append(units, gitea.RepoUnitExtIssues) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.wiki") { | ||||
| 		units = append(units, gitea.RepoUnitWiki) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.pulls") { | ||||
| 		units = append(units, gitea.RepoUnitPulls) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.releases") { | ||||
| 		units = append(units, gitea.RepoUnitReleases) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.ext_wiki") { | ||||
| 		units = append(units, gitea.RepoUnitExtWiki) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.projects") { | ||||
| 		units = append(units, gitea.RepoUnitProjects) | ||||
| 	} | ||||
|  | ||||
| 	opts := gitea.CreateTeamOption{ | ||||
| 		Name:                    d.Get(TeamName).(string), | ||||
| 		Description:             d.Get(TeamDescription).(string), | ||||
| 		Permission:              gitea.AccessMode(d.Get(TeamPermissions).(string)), | ||||
| 		CanCreateOrgRepo:        d.Get(TeamCreateRepoFlag).(bool), | ||||
| 		IncludesAllRepositories: d.Get(TeamIncludeAllReposFlag).(bool), | ||||
| 		Units:                   units, | ||||
| 	} | ||||
|  | ||||
| 	team, _, err = client.CreateTeam(d.Get(TeamOrg).(string), opts) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	users := d.Get(TeamMembers).([]interface{}) | ||||
|  | ||||
| 	for _, user := range users { | ||||
| 		if user != "" { | ||||
| 			_, err = client.AddTeamMember(team.ID, user.(string)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	err = setTeamResourceData(team, d) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func resourceTeamUpdate(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	id, err := strconv.ParseInt(d.Id(), 10, 64) | ||||
|  | ||||
| 	var resp *gitea.Response | ||||
| 	var team *gitea.Team | ||||
|  | ||||
| 	team, resp, err = client.GetTeam(id) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if resp.StatusCode == 404 { | ||||
| 			resourceTeamCreate(d, meta) | ||||
| 		} else { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	description := d.Get(TeamDescription).(string) | ||||
| 	canCreateRepo := d.Get(TeamCreateRepoFlag).(bool) | ||||
| 	includeAllRepos := d.Get(TeamIncludeAllReposFlag).(bool) | ||||
|  | ||||
| 	var units []gitea.RepoUnitType | ||||
|  | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.code") { | ||||
| 		units = append(units, gitea.RepoUnitCode) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.issues") { | ||||
| 		units = append(units, gitea.RepoUnitIssues) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.ext_issues") { | ||||
| 		units = append(units, gitea.RepoUnitExtIssues) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.wiki") { | ||||
| 		units = append(units, gitea.RepoUnitWiki) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.pulls") { | ||||
| 		units = append(units, gitea.RepoUnitPulls) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.releases") { | ||||
| 		units = append(units, gitea.RepoUnitReleases) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.ext_wiki") { | ||||
| 		units = append(units, gitea.RepoUnitExtWiki) | ||||
| 	} | ||||
| 	if strings.Contains(d.Get(TeamUnits).(string), "repo.projects") { | ||||
| 		units = append(units, gitea.RepoUnitProjects) | ||||
| 	} | ||||
|  | ||||
| 	opts := gitea.EditTeamOption{ | ||||
| 		Name:                    d.Get(TeamName).(string), | ||||
| 		Description:             &description, | ||||
| 		Permission:              gitea.AccessMode(d.Get(TeamPermissions).(string)), | ||||
| 		CanCreateOrgRepo:        &canCreateRepo, | ||||
| 		IncludesAllRepositories: &includeAllRepos, | ||||
| 		Units:                   units, | ||||
| 	} | ||||
|  | ||||
| 	resp, err = client.EditTeam(id, opts) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	users := d.Get(TeamMembers).([]interface{}) | ||||
|  | ||||
| 	for _, user := range users { | ||||
| 		if user != "" { | ||||
| 			_, err = client.AddTeamMember(team.ID, user.(string)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	team, _, _ = client.GetTeam(id) | ||||
|  | ||||
| 	err = setTeamResourceData(team, d) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func resourceTeamDelete(d *schema.ResourceData, meta interface{}) (err error) { | ||||
| 	client := meta.(*gitea.Client) | ||||
|  | ||||
| 	id, err := strconv.ParseInt(d.Id(), 10, 64) | ||||
|  | ||||
| 	var resp *gitea.Response | ||||
|  | ||||
| 	resp, err = client.DeleteTeam(id) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if resp.StatusCode == 404 { | ||||
| 			return | ||||
| 		} else { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func setTeamResourceData(team *gitea.Team, d *schema.ResourceData) (err error) { | ||||
| 	d.SetId(fmt.Sprintf("%d", team.ID)) | ||||
| 	d.Set(TeamCreateRepoFlag, team.CanCreateOrgRepo) | ||||
| 	d.Set(TeamDescription, team.Description) | ||||
| 	d.Set(TeamName, team.Name) | ||||
| 	d.Set(TeamPermissions, string(team.Permission)) | ||||
| 	d.Set(TeamIncludeAllReposFlag, team.IncludesAllRepositories) | ||||
| 	d.Set(TeamUnits, d.Get(TeamUnits).(string)) | ||||
| 	d.Set(TeamOrg, d.Get(TeamOrg).(string)) | ||||
| 	d.Set(TeamMembers, d.Get(TeamMembers)) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func resourceGiteaTeam() *schema.Resource { | ||||
| 	return &schema.Resource{ | ||||
| 		Read:   resourceTeamRead, | ||||
| 		Create: resourceTeamCreate, | ||||
| 		Update: resourceTeamUpdate, | ||||
| 		Delete: resourceTeamDelete, | ||||
| 		Importer: &schema.ResourceImporter{ | ||||
| 			State: schema.ImportStatePassthrough, | ||||
| 		}, | ||||
| 		Schema: map[string]*schema.Schema{ | ||||
| 			"name": { | ||||
| 				Type:        schema.TypeString, | ||||
| 				Required:    true, | ||||
| 				ForceNew:    true, | ||||
| 				Description: "Name of the Team", | ||||
| 			}, | ||||
| 			"organisation": { | ||||
| 				Type:        schema.TypeString, | ||||
| 				Required:    true, | ||||
| 				ForceNew:    true, | ||||
| 				Description: "The organisation which this Team is part of.", | ||||
| 			}, | ||||
| 			"description": { | ||||
| 				Type:        schema.TypeString, | ||||
| 				Required:    false, | ||||
| 				Optional:    true, | ||||
| 				Default:     "", | ||||
| 				Description: "Description of the Team", | ||||
| 			}, | ||||
| 			"permission": { | ||||
| 				Type:     schema.TypeString, | ||||
| 				Required: false, | ||||
| 				Optional: true, | ||||
| 				Default:  "", | ||||
| 				Description: "Permissions associated with this Team\n" + | ||||
| 					"Can be `none`, `read`, `write`, `admin` or `owner`", | ||||
| 			}, | ||||
| 			"can_create_repos": { | ||||
| 				Type:        schema.TypeBool, | ||||
| 				Required:    false, | ||||
| 				Optional:    true, | ||||
| 				Default:     true, | ||||
| 				Description: "Flag if the Teams members should be able to create Rpositories in the Organisation", | ||||
| 			}, | ||||
| 			"include_all_repositories": { | ||||
| 				Type:        schema.TypeBool, | ||||
| 				Required:    false, | ||||
| 				Optional:    true, | ||||
| 				Default:     true, | ||||
| 				Description: "Flag if the Teams members should have access to all Repositories in the Organisation", | ||||
| 			}, | ||||
| 			"units": { | ||||
| 				Type:     schema.TypeString, | ||||
| 				Required: false, | ||||
| 				Optional: true, | ||||
| 				Default:  "[repo.code, repo.issues, repo.ext_issues, repo.wiki, repo.pulls, repo.releases, repo.projects, repo.ext_wiki]", | ||||
| 				Description: "List of types of Repositories that should be allowed to be created from Team members.\n" + | ||||
| 					"Can be `repo.code`, `repo.issues`, `repo.ext_issues`, `repo.wiki`, `repo.pulls`, `repo.releases`, `repo.projects` and/or `repo.ext_wiki`", | ||||
| 			}, | ||||
| 			"members": { | ||||
| 				Type: schema.TypeList, | ||||
| 				Elem: &schema.Schema{ | ||||
| 					Type: schema.TypeString, | ||||
| 				}, | ||||
| 				Optional:    true, | ||||
| 				Required:    false, | ||||
| 				Computed:    true, | ||||
| 				Description: "List of Users that should be part of this team", | ||||
| 			}, | ||||
| 		}, | ||||
| 		Description: "`gitea_team` manages Team that are part of an organisation.", | ||||
| 	} | ||||
| } | ||||
| @@ -196,7 +196,6 @@ func resourceUserDelete(d *schema.ResourceData, meta interface{}) (err error) { | ||||
|  | ||||
| func setUserResourceData(user *gitea.User, d *schema.ResourceData) (err error) { | ||||
| 	d.SetId(fmt.Sprintf("%d", user.ID)) | ||||
| 	d.Set("id", user.ID) | ||||
| 	d.Set(userName, user.UserName) | ||||
| 	d.Set(userEmail, user.Email) | ||||
| 	d.Set(userFullName, user.FullName) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user