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>
This commit is contained in:
lerentis
2022-08-22 23:54:13 +08:00
committed by techknowlogick
parent 6879c07e9f
commit 7ba385d44a
27 changed files with 2375 additions and 5 deletions

View File

@ -0,0 +1,190 @@
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.",
}
}