Skip to content

Commit f0d7bac

Browse files
bartoszjkevholditch
authored andcommitted
Fix refresh of target if upstream no longer exists (#70) (#73)
* Fix refresh of target if upstream no longer exists Provider should not throw error when upstream no longer exists as that means that the target no longer exists either. * Adjust documentation of upstream name to match Kong's description Hopefully removes confusion regarding presence of upstream_url on service resource (#52 (comment)) * goimports * Code review adjustments
1 parent 4556cfa commit f0d7bac

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ resource "kong_upstream" "upstream" {
314314
}
315315
```
316316

317-
* `name` is a hostname like name that can be referenced in the upstream_url field of a service.
317+
* `name` is a hostname, which must be equal to the host of a Service.
318318
* `slots` is the number of slots in the load balancer algorithm (10-65536, defaults to 10000).
319319
* `hash_on` is a hashing input type: `none `(resulting in a weighted-round-robin scheme with no hashing), `consumer`, `ip`, `header`, or `cookie`. Defaults to `none`.
320320
* `hash_fallback` is a hashing input type if the primary `hash_on` does not return a hash (eg. header is missing, or no consumer identified). One of: `none`, `consumer`, `ip`, `header`, or `cookie`. Not available if `hash_on` is set to `cookie`. Defaults to `none`.

kong/resource_kong_target.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ func resourceKongTargetCreate(d *schema.ResourceData, meta interface{}) error {
5555
func resourceKongTargetRead(d *schema.ResourceData, meta interface{}) error {
5656

5757
var ids = strings.Split(d.Id(), "/")
58+
59+
// First check if the upstream exists. If it does not then the target no longer exists either.
60+
if upstream, _ := meta.(*gokong.KongAdminClient).Upstreams().GetById(ids[0]); upstream == nil {
61+
d.SetId("")
62+
return nil
63+
}
64+
5865
targets, err := meta.(*gokong.KongAdminClient).Targets().GetTargetsFromUpstreamId(ids[0])
5966

6067
if err != nil {
@@ -79,9 +86,7 @@ func resourceKongTargetRead(d *schema.ResourceData, meta interface{}) error {
7986
func resourceKongTargetDelete(d *schema.ResourceData, meta interface{}) error {
8087

8188
var ids = strings.Split(d.Id(), "/")
82-
err := meta.(*gokong.KongAdminClient).Targets().DeleteFromUpstreamById(ids[0], ids[1])
83-
84-
if err != nil {
89+
if err := meta.(*gokong.KongAdminClient).Targets().DeleteFromUpstreamById(ids[0], ids[1]); err != nil {
8590
return fmt.Errorf("could not delete kong target: %v", err)
8691
}
8792

kong/resource_kong_target_test.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,26 @@ func TestAccKongTargetDelete(t *testing.T) {
6060
})
6161
}
6262

63+
func TestAccKongTargetCreateAndRefreshFromNonExistentUpstream(t *testing.T) {
64+
65+
resource.Test(t, resource.TestCase{
66+
Providers: testAccProviders,
67+
CheckDestroy: testAccCheckKongTargetDestroy,
68+
Steps: []resource.TestStep{
69+
{
70+
Config: testCreateTargetConfig,
71+
Check: resource.ComposeTestCheckFunc(
72+
testAccCheckKongTargetExists("kong_target.target"),
73+
resource.TestCheckResourceAttr("kong_target.target", "target", "mytarget:4000"),
74+
resource.TestCheckResourceAttr("kong_target.target", "weight", "100"),
75+
deleteUpstream("kong_upstream.upstream"),
76+
),
77+
ExpectNonEmptyPlan: true,
78+
},
79+
},
80+
})
81+
}
82+
6383
func TestAccKongTargetImport(t *testing.T) {
6484

6585
resource.Test(t, resource.TestCase{
@@ -160,12 +180,32 @@ func testAccCheckKongTargetDoesNotExist(targetResourceKey string, upstreamResour
160180
return fmt.Errorf("no upstream ID is set")
161181
}
162182

163-
targets, _ := testAccProvider.Meta().(*gokong.KongAdminClient).Targets().GetTargetsFromUpstreamId(rs.Primary.ID)
183+
targets, err := testAccProvider.Meta().(*gokong.KongAdminClient).Targets().GetTargetsFromUpstreamId(rs.Primary.ID)
164184

165185
if len(targets) > 0 {
166186
return fmt.Errorf("expecting zero target resources found %v", len(targets))
167187
}
168188

189+
if err != nil {
190+
return fmt.Errorf("error thrown when trying to read target: %v", err)
191+
}
192+
193+
return nil
194+
}
195+
}
196+
197+
func deleteUpstream(upstreamResourceKey string) resource.TestCheckFunc {
198+
return func(s *terraform.State) error {
199+
rs, ok := s.RootModule().Resources[upstreamResourceKey]
200+
201+
if !ok {
202+
return fmt.Errorf("not found: %s", upstreamResourceKey)
203+
}
204+
205+
if err := testAccProvider.Meta().(*gokong.KongAdminClient).Upstreams().DeleteById(rs.Primary.ID); err != nil {
206+
return fmt.Errorf("could not delete kong upstream: %v", err)
207+
}
208+
169209
return nil
170210
}
171211
}

0 commit comments

Comments
 (0)