forked from hashicorp/terraform
-
Notifications
You must be signed in to change notification settings - Fork 0
/
resource_public_key.go
148 lines (117 loc) · 3.45 KB
/
resource_public_key.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package rundeck
import (
"github.com/hashicorp/terraform/helper/schema"
"github.com/apparentlymart/go-rundeck-api/rundeck"
)
func resourceRundeckPublicKey() *schema.Resource {
return &schema.Resource{
Create: CreatePublicKey,
Update: UpdatePublicKey,
Delete: DeletePublicKey,
Exists: PublicKeyExists,
Read: ReadPublicKey,
Schema: map[string]*schema.Schema{
"path": &schema.Schema{
Type: schema.TypeString,
Required: true,
Description: "Path to the key within the key store",
ForceNew: true,
},
"key_material": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
Description: "The public key data to store, in the usual OpenSSH public key file format",
},
"url": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Description: "URL at which the key content can be retrieved",
},
"delete": &schema.Schema{
Type: schema.TypeBool,
Computed: true,
Description: "True if the key should be deleted when the resource is deleted. Defaults to true if key_material is provided in the configuration.",
},
},
}
}
func CreatePublicKey(d *schema.ResourceData, meta interface{}) error {
client := meta.(*rundeck.Client)
path := d.Get("path").(string)
keyMaterial := d.Get("key_material").(string)
if keyMaterial != "" {
err := client.CreatePublicKey(path, keyMaterial)
if err != nil {
return err
}
d.Set("delete", true)
}
d.SetId(path)
return ReadPublicKey(d, meta)
}
func UpdatePublicKey(d *schema.ResourceData, meta interface{}) error {
client := meta.(*rundeck.Client)
if d.HasChange("key_material") {
path := d.Get("path").(string)
keyMaterial := d.Get("key_material").(string)
err := client.ReplacePublicKey(path, keyMaterial)
if err != nil {
return err
}
}
return ReadPublicKey(d, meta)
}
func DeletePublicKey(d *schema.ResourceData, meta interface{}) error {
client := meta.(*rundeck.Client)
path := d.Id()
// Since this resource can be used both to create and to read existing
// public keys, we'll only actually delete the key if we remember that
// we created the key in the first place, or if the user explicitly
// opted in to have an existing key deleted.
if d.Get("delete").(bool) {
// The only "delete" call we have is oblivious to key type, but
// that's okay since our Exists implementation makes sure that we
// won't try to delete a key of the wrong type since we'll pretend
// that it's already been deleted.
err := client.DeleteKey(path)
if err != nil {
return err
}
}
d.SetId("")
return nil
}
func ReadPublicKey(d *schema.ResourceData, meta interface{}) error {
client := meta.(*rundeck.Client)
path := d.Id()
key, err := client.GetKeyMeta(path)
if err != nil {
return err
}
keyMaterial, err := client.GetKeyContent(path)
if err != nil {
return err
}
d.Set("key_material", keyMaterial)
d.Set("url", key.URL)
return nil
}
func PublicKeyExists(d *schema.ResourceData, meta interface{}) (bool, error) {
client := meta.(*rundeck.Client)
path := d.Id()
key, err := client.GetKeyMeta(path)
if err != nil {
if _, ok := err.(rundeck.NotFoundError); ok {
err = nil
}
return false, err
}
if key.KeyType != "public" {
// If the key type isn't public then as far as this resource is
// concerned it doesn't exist. (We'll fail properly when we try to
// create a key where one already exists.)
return false, nil
}
return true, nil
}