Skip to content

Commit

Permalink
add preheat instance (issue #445) (#446)
Browse files Browse the repository at this point in the history
Signed-off-by: flbla <[email protected]>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
flbla and github-actions[bot] authored Jun 7, 2024
1 parent dafd683 commit 19b61ac
Show file tree
Hide file tree
Showing 9 changed files with 457 additions and 0 deletions.
34 changes: 34 additions & 0 deletions client/preheat_instance.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package client

import (
"github.com/goharbor/terraform-provider-harbor/models"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func PreheatInstanceBody(d *schema.ResourceData) models.PreheatInstance {
authInfo := models.PreheatInstanceAuthInfo{}
authMode := d.Get("auth_mode").(string)

switch authMode {
case "NONE":
// No token, username, or password
case "BASIC":
authInfo.Username = d.Get("username").(string)
authInfo.Password = d.Get("password").(string)
case "OAUTH":
authInfo.Token = d.Get("token").(string)
}

body := models.PreheatInstance{
Name: d.Get("name").(string),
Description: d.Get("description").(string),
Vendor: d.Get("vendor").(string),
Endpoint: d.Get("endpoint").(string),
AuthMode: authMode,
AuthInfo: authInfo,
Enabled: d.Get("enabled").(bool),
Default: d.Get("default").(bool),
Insecure: d.Get("insecure").(bool),
}
return body
}
67 changes: 67 additions & 0 deletions docs/resources/preheat_instance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "harbor_preheat_instance Resource - terraform-provider-harbor"
subcategory: ""
description: |-
---

# harbor_preheat_instance (Resource)

<!-- schema generated by tfplugindocs -->

## Example Usage

### Basic Usage

```terraform
resource "harbor_preheat_instance" "example" {
name = "example-preheat-instance"
vendor = "dragonfly"
endpoint = "http://example.com"
}
```

### Usage with Authentication

```terraform
resource "harbor_preheat_instance" "example" {
name = "example-preheat-instance"
vendor = "dragonfly"
endpoint = "http://example.com"
auth_mode = "BASIC"
username = "example-user"
password = "example-password"
}
```

## Schema

### Required

- `name` (String) The name of the preheat instance.
- `vendor` (String) The vendor of the preheat instance. Must be either "dragonfly" or "kraken".
- `endpoint` (String) The endpoint of the preheat instance.

### Optional

- `description` (String) The description of the preheat instance. Defaults to an empty string.
- `auth_mode` (String) The authentication mode for the preheat instance. Must be either "NONE", "BASIC", or "OAUTH". Defaults to "NONE".
- `username` (String) The username for the preheat instance. Required if `auth_mode` is "BASIC". Defaults to an empty string.
- `password` (String, Sensitive) The password for the preheat instance. Required if `auth_mode` is "BASIC". Defaults to an empty string.
- `token` (String, Sensitive) The token for the preheat instance. Required if `auth_mode` is "OAUTH". Defaults to an empty string.
- `default` (Boolean) Whether the preheat instance is the default instance. Defaults to false.
- `enabled` (Boolean) Whether the preheat instance is enabled. Defaults to true.
- `insecure` (Boolean) Whether to allow insecure connections to the preheat instance. Defaults to false.

### Read-Only

- `id` (String) The ID of the preheat instance.

## Import

The `harbor_preheat_instance` resource can be imported using the preheat instance ID.

```sh
terraform import harbor_preheat_instance.example /p2p/preheat/instances/example-preheat-instance
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
resource "harbor_preheat_instance" "example" {
name = "example-preheat-instance"
vendor = "dragonfly"
endpoint = "http://example.com"
auth_mode = "BASIC"
username = "example-user"
password = "example-password"
}
5 changes: 5 additions & 0 deletions examples/resources/harbor_preheat_instance/basic.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
resource "harbor_preheat_instance" "example" {
name = "example-preheat-instance"
vendor = "dragonfly"
endpoint = "http://example.com"
}
24 changes: 24 additions & 0 deletions models/preheat_instance.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package models

var PathPreheatInstance = "/p2p/preheat/instances"

type PreheatInstance struct {
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Vendor string `json:"vendor"`
Endpoint string `json:"endpoint"`
AuthMode string `json:"auth_mode"`
AuthInfo PreheatInstanceAuthInfo `json:"auth_info"`
Status string `json:"status"`
Enabled bool `json:"enabled"`
Default bool `json:"default"`
Insecure bool `json:"insecure"`
SetupTimestamp int64 `json:"setup_timestamp"`
}

type PreheatInstanceAuthInfo struct {
Token string `json:"token,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
}
1 change: 1 addition & 0 deletions provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func Provider() *schema.Provider {
"harbor_garbage_collection": resourceGC(),
"harbor_purge_audit_log": resourcePurgeAudit(),
"harbor_label": resourceLabel(),
"harbor_preheat_instance": resourcePreheatInstance(),
"harbor_immutable_tag_rule": resourceImmutableTagRule(),
},
DataSourcesMap: map[string]*schema.Resource{
Expand Down
161 changes: 161 additions & 0 deletions provider/resource_preheat__instance.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
package provider

import (
"encoding/json"
"fmt"

"github.com/goharbor/terraform-provider-harbor/client"
"github.com/goharbor/terraform-provider-harbor/models"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func resourcePreheatInstance() *schema.Resource {
return &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"vendor": {
Type: schema.TypeString,
Required: true,
ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) {
v := val.(string)
if v != "dragonfly" && v != "kraken" {
errs = append(errs, fmt.Errorf("%q must be either 'dragonfly' or 'kraken', got: %s", key, v))
}
return
},
},
"description": {
Type: schema.TypeString,
Optional: true,
Default: "",
},
"endpoint": {
Type: schema.TypeString,
Required: true,
},
"auth_mode": {
Type: schema.TypeString,
Optional: true,
Default: "NONE",
ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) {
v := val.(string)
if v != "NONE" && v != "BASIC" && v != "OAUTH" {
errs = append(errs, fmt.Errorf("%q must be either 'NONE' or 'BASIC' or 'OAUTH', got: %s", key, v))
}
return
},
},
"username": {
Type: schema.TypeString,
Optional: true,
Default: "",
},
"password": {
Type: schema.TypeString,
Sensitive: true,
Optional: true,
Default: "",
},
"token": {
Type: schema.TypeString,
Sensitive: true,
Optional: true,
Default: "",
},
"default": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"insecure": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
Create: resourcePreheatInstanceCreate,
Read: resourcePreheatInstanceRead,
Update: resourcePreheatInstanceUpdate,
Delete: resourcePreheatInstanceDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
}
}

func resourcePreheatInstanceCreate(d *schema.ResourceData, m interface{}) error {
apiClient := m.(*client.Client)
body := client.PreheatInstanceBody(d)

_, headers, _, err := apiClient.SendRequest("POST", models.PathPreheatInstance, body, 201)
if err != nil {
return err
}

id, err := client.GetID(headers)
d.SetId(id)
return resourcePreheatInstanceRead(d, m)
}

func resourcePreheatInstanceRead(d *schema.ResourceData, m interface{}) error {
apiClient := m.(*client.Client)

resp, _, respCode, err := apiClient.SendRequest("GET", d.Id(), nil, 200)
if respCode == 404 && err != nil {
d.SetId("")
return nil
} else if err != nil {
return fmt.Errorf("resource not found %s", d.Id())
}

var jsonData models.PreheatInstance
err = json.Unmarshal([]byte(resp), &jsonData)
if err != nil {
return fmt.Errorf("Resource not found %s", d.Id())
}

d.Set("name", jsonData.Name)
d.Set("description", jsonData.Description)
d.Set("vendor", jsonData.Vendor)
d.Set("endpoint", jsonData.Endpoint)
d.Set("auth_mode", jsonData.AuthMode)
d.Set("enabled", jsonData.Enabled)
d.Set("default", jsonData.Default)
d.Set("insecure", jsonData.Insecure)
d.Set("username", jsonData.AuthInfo.Username)
d.Set("password", jsonData.AuthInfo.Password)
d.Set("token", jsonData.AuthInfo.Token)

return nil
}

func resourcePreheatInstanceUpdate(d *schema.ResourceData, m interface{}) error {
apiClient := m.(*client.Client)
body := client.PreheatInstanceBody(d)

_, _, _, err := apiClient.SendRequest("PUT", d.Id(), body, 200)
if err != nil {
return err
}

return resourcePreheatInstanceRead(d, m)
}

func resourcePreheatInstanceDelete(d *schema.ResourceData, m interface{}) error {
apiClient := m.(*client.Client)

_, _, respCode, err := apiClient.SendRequest("DELETE", d.Id(), nil, 200)
if respCode != 404 && err != nil { // We can't delete something that doesn't exist. Hence the 404-check
return err
}
return nil
}
Loading

0 comments on commit 19b61ac

Please sign in to comment.