**Is your feature request related to a problem? Please describe.**
I hate to manually set Action secrets and variables. It is error-prone. It is super useful to set them via terraform as those values are probably in your state 😃.
Because my changes to gitea go-sdk were approved, it is now possible!
a239deff5a
**Describe the solution you'd like**
```
resource "gitea_repository_actions_variable" "test" {
repository_owner = "marek"
repository = "nginx"
variable_name = "FROM_TF"
value = "Test value"
}
resource "gitea_repository_actions_secret" "test" {
repository_owner = "marek"
repository = "nginx"
secret_name = "SECRET_FROM_TF"
secret_value = "Test secret"
}
```
closes #89
Co-authored-by: Marek Mościchowski <marek.moscichowski@miquido.com>
Reviewed-on: https://gitea.com/gitea/terraform-provider-gitea/pulls/88
Co-authored-by: Marek Mościchowski <marek@noreply.gitea.com>
Co-committed-by: Marek Mościchowski <marek@noreply.gitea.com>
205 lines
4.9 KiB
Go
205 lines
4.9 KiB
Go
package gitea
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
|
)
|
|
|
|
func resourceGiteaRepositoryActionsSecret() *schema.Resource {
|
|
return &schema.Resource{
|
|
Create: resourceGiteaRepositoryActionsSecretCreate,
|
|
Read: resourceGiteaRepositoryActionsSecretRead,
|
|
Update: resourceGiteaRepositoryActionsSecretUpdate,
|
|
Delete: resourceGiteaRepositoryActionsSecretDelete,
|
|
Importer: &schema.ResourceImporter{
|
|
StateContext: schema.ImportStatePassthroughContext,
|
|
},
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"repository_owner": {
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
ForceNew: true,
|
|
Description: "Owner of the repository.",
|
|
},
|
|
"repository": {
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
ForceNew: true,
|
|
Description: "Name of the repository.",
|
|
},
|
|
"secret_name": {
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
ForceNew: true,
|
|
Description: "Name of the secret.",
|
|
},
|
|
"secret_value": {
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
Description: "Value of the secret.",
|
|
Sensitive: true,
|
|
},
|
|
"created_at": {
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Description: "Date of 'actions_secret' creation.",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func resourceGiteaRepositoryActionsSecretCreate(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*gitea.Client)
|
|
|
|
repoOwnerData, usernameOk := d.GetOk("repository_owner")
|
|
if !usernameOk {
|
|
return fmt.Errorf("name of repo owner must be passed")
|
|
}
|
|
repoOwner := strings.ToLower(repoOwnerData.(string))
|
|
|
|
repositoryData, nameOk := d.GetOk("repository")
|
|
if !nameOk {
|
|
return fmt.Errorf("CREATE name of repo must be passed")
|
|
}
|
|
repository := strings.ToLower(repositoryData.(string))
|
|
|
|
secretNameData, nameOk := d.GetOk("secret_name")
|
|
if !nameOk {
|
|
return fmt.Errorf("secret_name must be passed")
|
|
}
|
|
secretName := secretNameData.(string)
|
|
|
|
valueData, nameOk := d.GetOk("secret_value")
|
|
if !nameOk {
|
|
return fmt.Errorf("value must be passed")
|
|
}
|
|
value := valueData.(string)
|
|
|
|
_, err := client.CreateRepoActionSecret(repoOwner, repository, gitea.CreateSecretOption{
|
|
Name: secretName,
|
|
Data: value,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
d.SetId(buildThreePartID(repoOwner, repository, secretName))
|
|
|
|
return resourceGiteaRepositoryActionsSecretRead(d, meta)
|
|
}
|
|
|
|
func resourceGiteaRepositoryActionsSecretUpdate(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*gitea.Client)
|
|
|
|
repoOwnerData, usernameOk := d.GetOk("repository_owner")
|
|
if !usernameOk {
|
|
return fmt.Errorf("name of repo owner must be passed")
|
|
}
|
|
repoOwner := strings.ToLower(repoOwnerData.(string))
|
|
|
|
repositoryData, nameOk := d.GetOk("repository")
|
|
if !nameOk {
|
|
return fmt.Errorf("name of repo must be passed")
|
|
}
|
|
repository := strings.ToLower(repositoryData.(string))
|
|
|
|
variableNameData, nameOk := d.GetOk("secret_name")
|
|
if !nameOk {
|
|
return fmt.Errorf("secret_name of repo must be passed")
|
|
}
|
|
variableName := variableNameData.(string)
|
|
|
|
valueData, nameOk := d.GetOk("secret_value")
|
|
if !nameOk {
|
|
return fmt.Errorf("secret_value must be passed")
|
|
}
|
|
value := valueData.(string)
|
|
|
|
_, err := client.CreateRepoActionSecret(repoOwner, repository, gitea.CreateSecretOption{
|
|
Name: variableName,
|
|
Data: value,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return resourceGiteaRepositoryActionsSecretRead(d, meta)
|
|
}
|
|
|
|
func resourceGiteaRepositoryActionsSecretRead(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*gitea.Client)
|
|
|
|
repoOwner, repository, secretName, _ := parseThreePartID(d.Id(), "repository_owner", "repository", "secret_name")
|
|
|
|
var requestedSecret *gitea.Secret
|
|
|
|
page := 0
|
|
for requestedSecret == nil {
|
|
page = page + 1
|
|
|
|
secrets, _, _ := client.ListRepoActionSecret(repoOwner, repository, gitea.ListRepoActionSecretOption{
|
|
ListOptions: gitea.ListOptions{
|
|
Page: page,
|
|
PageSize: 100,
|
|
},
|
|
})
|
|
|
|
if len(secrets) == 0 {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
|
|
for _, secret := range secrets {
|
|
if secret.Name == secretName {
|
|
requestedSecret = secret
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
createdAtData, dateOk := d.GetOk("created_at")
|
|
|
|
if requestedSecret == nil {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
|
|
if dateOk {
|
|
if requestedSecret.Created.String() != createdAtData.(string) {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
if err := d.Set("repository_owner", repoOwner); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := d.Set("repository", repository); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := d.Set("secret_name", secretName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := d.Set("created_at", requestedSecret.Created.String()); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func resourceGiteaRepositoryActionsSecretDelete(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*gitea.Client)
|
|
|
|
repoOwner, repository, secretName, _ := parseThreePartID(d.Id(), "repository_owner", "repository", "secret_name")
|
|
|
|
_, err := client.DeleteRepoActionSecret(repoOwner, repository, secretName)
|
|
|
|
return err
|
|
}
|