terraform-provider-gitea/gitea/resource_gitea_organisation.go
lerentis 7ba385d44a propose features upstream (#2)
Hi @techknowlogick 👋

as discussed on twitter the changes i made on my fork 😃

not sure if you are aware of this but currently hashicorp only allows publishing via github, so if you want to publish this provider to the terraform registry as well, feel free to also take a look at my goreleaser config and drone/github actions usage her: https://git.uploadfilter24.eu/lerentis/terraform-provider-gitea

Co-authored-by: Tobias Trabelsi <lerentis@uploadfilter24.eu>
Reviewed-on: https://gitea.com/gitea/terraform-provider-gitea/pulls/2
Co-authored-by: lerentis <lerentis@noreply.gitea.io>
Co-committed-by: lerentis <lerentis@noreply.gitea.io>
2022-08-22 23:54:13 +08:00

191 lines
4.6 KiB
Go

package gitea
import (
"fmt"
"code.gitea.io/sdk/gitea"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
const (
orgName string = "name"
orgFullName string = "full_name"
orgDescription string = "description"
orgWebsite string = "website"
orgLocation string = "location"
orgVisibility string = "visibility"
RepoAdminChangeTeamAccess string = "repo_admin_change_team_access"
)
func resourceOrgRead(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
var org *gitea.Organization
var resp *gitea.Response
org, resp, err = client.GetOrg(d.Get(orgName).(string))
if err != nil {
if resp.StatusCode == 404 {
d.SetId("")
return nil
} else {
return err
}
}
err = setOrgResourceData(org, d)
return
}
func resourceOrgCreate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
opts := gitea.CreateOrgOption{
Name: d.Get(orgName).(string),
FullName: d.Get(orgFullName).(string),
Description: d.Get(orgDescription).(string),
Website: d.Get(orgWebsite).(string),
Location: d.Get(orgLocation).(string),
Visibility: gitea.VisibleType(d.Get(orgVisibility).(string)),
RepoAdminChangeTeamAccess: d.Get(RepoAdminChangeTeamAccess).(bool),
}
org, _, err := client.CreateOrg(opts)
if err != nil {
return
}
err = setOrgResourceData(org, d)
return
}
func resourceOrgUpdate(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
var org *gitea.Organization
var resp *gitea.Response
org, resp, err = client.GetOrg(d.Get(orgName).(string))
if err != nil {
if resp.StatusCode == 404 {
resourceOrgCreate(d, meta)
} else {
return err
}
}
opts := gitea.EditOrgOption{
FullName: d.Get(orgFullName).(string),
Description: d.Get(orgDescription).(string),
Website: d.Get(orgWebsite).(string),
Location: d.Get(orgLocation).(string),
Visibility: gitea.VisibleType(d.Get(orgVisibility).(string)),
}
client.EditOrg(d.Get(orgName).(string), opts)
org, resp, err = client.GetOrg(d.Get(orgName).(string))
err = setOrgResourceData(org, d)
return
}
func resourceOrgDelete(d *schema.ResourceData, meta interface{}) (err error) {
client := meta.(*gitea.Client)
var resp *gitea.Response
resp, err = client.DeleteOrg(d.Get(orgName).(string))
if err != nil {
if resp.StatusCode == 404 {
return
} else {
return err
}
}
return
}
func setOrgResourceData(org *gitea.Organization, d *schema.ResourceData) (err error) {
d.SetId(fmt.Sprintf("%d", org.ID))
d.Set("name", org.UserName)
d.Set("full_name", org.FullName)
d.Set("avatar_url", org.AvatarURL)
d.Set("description", org.Description)
d.Set("website", org.Website)
d.Set("location", org.Location)
d.Set("visibility", org.Visibility)
return
}
func resourceGiteaOrg() *schema.Resource {
return &schema.Resource{
Read: resourceOrgRead,
Create: resourceOrgCreate,
Update: resourceOrgUpdate,
Delete: resourceOrgDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "The name of the organisation without spaces.",
},
"full_name": {
Type: schema.TypeString,
Required: false,
Optional: true,
Description: "The display name of the organisation. Defaults to the value of `name`.",
},
"description": {
Type: schema.TypeString,
Required: false,
Optional: true,
Description: "A description of this organisation.",
},
"website": {
Type: schema.TypeString,
Required: false,
Optional: true,
Description: "A link to a website with more information about this organisation.",
},
"location": {
Type: schema.TypeString,
Required: false,
Optional: true,
},
"repo_admin_change_team_access": {
Type: schema.TypeBool,
Required: false,
Optional: true,
Default: true,
},
"avatar_url": {
Type: schema.TypeString,
Required: false,
Computed: true,
},
"visibility": {
Type: schema.TypeString,
Required: false,
Optional: true,
Default: "public",
Description: "Flag is this organisation should be publicly visible or not.",
},
},
Description: "`gitea_org` manages a gitea organisation.\n\n" +
"Organisations are a way to group repositories and abstract permission management in a gitea instance.",
}
}