Skip to content

Commit b5430cb

Browse files
authored
Merge pull request #178 from rawmind0/token
New rancher2_token resource
2 parents bd12944 + 8688782 commit b5430cb

9 files changed

Lines changed: 726 additions & 1 deletion

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
FEATURES:
44

5-
5+
* **New Resource:** `rancher2_token`
66

77
ENHANCEMENTS:
88

rancher2/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ func Provider() terraform.ResourceProvider {
115115
"rancher2_role_template": resourceRancher2RoleTemplate(),
116116
"rancher2_secret": resourceRancher2Secret(),
117117
"rancher2_setting": resourceRancher2Setting(),
118+
"rancher2_token": resourceRancher2Token(),
118119
"rancher2_user": resourceRancher2User(),
119120
},
120121

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package rancher2
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"time"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9+
)
10+
11+
func resourceRancher2Token() *schema.Resource {
12+
return &schema.Resource{
13+
Create: resourceRancher2TokenCreate,
14+
Read: resourceRancher2TokenRead,
15+
Update: resourceRancher2TokenUpdate,
16+
Delete: resourceRancher2TokenDelete,
17+
18+
Schema: tokenFields(),
19+
Timeouts: &schema.ResourceTimeout{
20+
Create: schema.DefaultTimeout(5 * time.Minute),
21+
Update: schema.DefaultTimeout(5 * time.Minute),
22+
Delete: schema.DefaultTimeout(5 * time.Minute),
23+
},
24+
}
25+
}
26+
27+
func resourceRancher2TokenCreate(d *schema.ResourceData, meta interface{}) error {
28+
log.Printf("[INFO] Creating Token")
29+
token, err := expandToken(d)
30+
if err != nil {
31+
return err
32+
}
33+
34+
client, err := meta.(*Config).ManagementClient()
35+
if err != nil {
36+
return err
37+
}
38+
39+
newToken, err := client.Token.Create(token)
40+
if err != nil {
41+
return err
42+
}
43+
44+
err = flattenToken(d, newToken)
45+
if err != nil {
46+
return err
47+
}
48+
49+
return resourceRancher2TokenRead(d, meta)
50+
}
51+
52+
func resourceRancher2TokenRead(d *schema.ResourceData, meta interface{}) error {
53+
log.Printf("[INFO] Refreshing Token ID %s", d.Id())
54+
client, err := meta.(*Config).ManagementClient()
55+
if err != nil {
56+
return err
57+
}
58+
59+
token, err := client.Token.ByID(d.Id())
60+
if err != nil {
61+
if IsNotFound(err) {
62+
log.Printf("[INFO] Token ID %s not found.", d.Id())
63+
d.SetId("")
64+
return nil
65+
}
66+
return err
67+
}
68+
69+
renew := d.Get("renew").(bool)
70+
if (!*token.Enabled || token.Expired) && renew {
71+
d.Set("renew", false)
72+
}
73+
74+
err = flattenToken(d, token)
75+
if err != nil {
76+
return err
77+
}
78+
79+
return nil
80+
}
81+
82+
func resourceRancher2TokenUpdate(d *schema.ResourceData, meta interface{}) error {
83+
return resourceRancher2TokenRead(d, meta)
84+
}
85+
86+
func resourceRancher2TokenDelete(d *schema.ResourceData, meta interface{}) error {
87+
log.Printf("[INFO] Deleting Token ID %s", d.Id())
88+
id := d.Id()
89+
client, err := meta.(*Config).ManagementClient()
90+
if err != nil {
91+
return err
92+
}
93+
94+
token, err := client.Token.ByID(id)
95+
if err != nil {
96+
if IsNotFound(err) {
97+
log.Printf("[INFO] Token ID %s not found.", d.Id())
98+
d.SetId("")
99+
return nil
100+
}
101+
return err
102+
}
103+
104+
err = client.Token.Delete(token)
105+
if err != nil {
106+
return fmt.Errorf("Error removing Token: %s", err)
107+
}
108+
109+
d.SetId("")
110+
return nil
111+
}
Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
package rancher2
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
9+
managementClient "github.com/rancher/types/client/management/v3"
10+
)
11+
12+
const (
13+
testAccRancher2TokenType = "rancher2_token"
14+
)
15+
16+
var (
17+
testAccRancher2TokenUserConfig string
18+
testAccRancher2TokenConfig string
19+
testAccRancher2TokenUpdateConfig string
20+
testAccRancher2TokenRecreateConfig string
21+
testAccRancher2TokenClusterConfig string
22+
testAccRancher2TokenClusterUpdateConfig string
23+
testAccRancher2TokenClusterRecreateConfig string
24+
)
25+
26+
func init() {
27+
testAccRancher2TokenConfig = `
28+
resource "rancher2_token" "foo" {
29+
description = "Terraform token acceptance test"
30+
ttl = 120
31+
}
32+
`
33+
34+
testAccRancher2TokenUpdateConfig = `
35+
resource "rancher2_token" "foo" {
36+
description = "Terraform token acceptance test - Updated"
37+
ttl = 120
38+
}
39+
`
40+
41+
testAccRancher2TokenRecreateConfig = `
42+
resource "rancher2_token" "foo" {
43+
description = "Terraform token acceptance test"
44+
ttl = 120
45+
}
46+
`
47+
testAccRancher2TokenClusterConfig = `
48+
resource "rancher2_token" "foo" {
49+
cluster_id = "` + testAccRancher2ClusterID + `"
50+
description = "Terraform token acceptance test"
51+
ttl = 120
52+
}
53+
`
54+
55+
testAccRancher2TokenClusterUpdateConfig = `
56+
resource "rancher2_token" "foo" {
57+
cluster_id = "` + testAccRancher2ClusterID + `"
58+
description = "Terraform token acceptance test - Updated"
59+
ttl = 120
60+
}
61+
`
62+
63+
testAccRancher2TokenClusterRecreateConfig = `
64+
resource "rancher2_token" "foo" {
65+
cluster_id = "` + testAccRancher2ClusterID + `"
66+
description = "Terraform token acceptance test"
67+
ttl = 120
68+
}
69+
`
70+
}
71+
72+
func TestAccRancher2Token_basic(t *testing.T) {
73+
var token *managementClient.Token
74+
75+
resource.Test(t, resource.TestCase{
76+
Providers: testAccProviders,
77+
CheckDestroy: testAccCheckRancher2TokenDestroy,
78+
Steps: []resource.TestStep{
79+
resource.TestStep{
80+
Config: testAccRancher2TokenConfig,
81+
Check: resource.ComposeTestCheckFunc(
82+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
83+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test"),
84+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
85+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
86+
),
87+
},
88+
resource.TestStep{
89+
Config: testAccRancher2TokenUpdateConfig,
90+
Check: resource.ComposeTestCheckFunc(
91+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
92+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test - Updated"),
93+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
94+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
95+
),
96+
},
97+
resource.TestStep{
98+
Config: testAccRancher2TokenRecreateConfig,
99+
Check: resource.ComposeTestCheckFunc(
100+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
101+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test"),
102+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
103+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
104+
),
105+
},
106+
},
107+
})
108+
}
109+
110+
func TestAccRancher2Token_disappears(t *testing.T) {
111+
var token *managementClient.Token
112+
113+
resource.Test(t, resource.TestCase{
114+
Providers: testAccProviders,
115+
CheckDestroy: testAccCheckRancher2TokenDestroy,
116+
Steps: []resource.TestStep{
117+
resource.TestStep{
118+
Config: testAccRancher2TokenConfig,
119+
Check: resource.ComposeTestCheckFunc(
120+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
121+
testAccRancher2TokenDisappears(token),
122+
),
123+
ExpectNonEmptyPlan: true,
124+
},
125+
},
126+
})
127+
}
128+
129+
func TestAccRancher2TokenScoped_basic(t *testing.T) {
130+
var token *managementClient.Token
131+
132+
resource.Test(t, resource.TestCase{
133+
Providers: testAccProviders,
134+
CheckDestroy: testAccCheckRancher2TokenDestroy,
135+
Steps: []resource.TestStep{
136+
resource.TestStep{
137+
Config: testAccRancher2TokenClusterConfig,
138+
Check: resource.ComposeTestCheckFunc(
139+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
140+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test"),
141+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
142+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
143+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "cluster_id", testAccRancher2ClusterID),
144+
),
145+
},
146+
resource.TestStep{
147+
Config: testAccRancher2TokenClusterUpdateConfig,
148+
Check: resource.ComposeTestCheckFunc(
149+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
150+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test - Updated"),
151+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
152+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
153+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "cluster_id", testAccRancher2ClusterID),
154+
),
155+
},
156+
resource.TestStep{
157+
Config: testAccRancher2TokenClusterRecreateConfig,
158+
Check: resource.ComposeTestCheckFunc(
159+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
160+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "description", "Terraform token acceptance test"),
161+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "ttl", "120"),
162+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "enabled", "true"),
163+
resource.TestCheckResourceAttr(testAccRancher2TokenType+".foo", "cluster_id", testAccRancher2ClusterID),
164+
),
165+
},
166+
},
167+
})
168+
}
169+
170+
func TestAccRancher2TokenScoped_disappears(t *testing.T) {
171+
var token *managementClient.Token
172+
173+
resource.Test(t, resource.TestCase{
174+
Providers: testAccProviders,
175+
CheckDestroy: testAccCheckRancher2TokenDestroy,
176+
Steps: []resource.TestStep{
177+
resource.TestStep{
178+
Config: testAccRancher2TokenClusterConfig,
179+
Check: resource.ComposeTestCheckFunc(
180+
testAccCheckRancher2TokenExists(testAccRancher2TokenType+".foo", token),
181+
testAccRancher2TokenDisappears(token),
182+
),
183+
ExpectNonEmptyPlan: true,
184+
},
185+
},
186+
})
187+
}
188+
189+
func testAccRancher2TokenDisappears(token *managementClient.Token) resource.TestCheckFunc {
190+
return func(s *terraform.State) error {
191+
for _, rs := range s.RootModule().Resources {
192+
if rs.Type != testAccRancher2TokenType {
193+
continue
194+
}
195+
client, err := testAccProvider.Meta().(*Config).ManagementClient()
196+
if err != nil {
197+
return err
198+
}
199+
200+
token, err = client.Token.ByID(rs.Primary.ID)
201+
if err != nil {
202+
if IsNotFound(err) {
203+
return nil
204+
}
205+
return err
206+
}
207+
208+
err = client.Token.Delete(token)
209+
if err != nil {
210+
return fmt.Errorf("Error removing Token: %s", err)
211+
}
212+
}
213+
return nil
214+
215+
}
216+
}
217+
218+
func testAccCheckRancher2TokenExists(n string, token *managementClient.Token) resource.TestCheckFunc {
219+
return func(s *terraform.State) error {
220+
rs, ok := s.RootModule().Resources[n]
221+
222+
if !ok {
223+
return fmt.Errorf("Not found: %s", n)
224+
}
225+
226+
if rs.Primary.ID == "" {
227+
return fmt.Errorf("No Token ID is set")
228+
}
229+
230+
client, err := testAccProvider.Meta().(*Config).ManagementClient()
231+
if err != nil {
232+
return err
233+
}
234+
235+
foundToken, err := client.Token.ByID(rs.Primary.ID)
236+
if err != nil {
237+
if IsNotFound(err) {
238+
return fmt.Errorf("Token not found")
239+
}
240+
return err
241+
}
242+
243+
token = foundToken
244+
245+
return nil
246+
}
247+
}
248+
249+
func testAccCheckRancher2TokenDestroy(s *terraform.State) error {
250+
for _, rs := range s.RootModule().Resources {
251+
if rs.Type != testAccRancher2TokenType {
252+
continue
253+
}
254+
client, err := testAccProvider.Meta().(*Config).ManagementClient()
255+
if err != nil {
256+
return err
257+
}
258+
259+
_, err = client.Token.ByID(rs.Primary.ID)
260+
if err != nil {
261+
if IsNotFound(err) {
262+
return nil
263+
}
264+
return err
265+
}
266+
return fmt.Errorf("Token still exists")
267+
}
268+
return nil
269+
}

0 commit comments

Comments
 (0)