From 9dee39b594987271ad2113b87408b49a0e309d36 Mon Sep 17 00:00:00 2001 From: saravanan30erd Date: Wed, 1 Aug 2018 20:57:51 +0400 Subject: [PATCH 1/4] fix issue #5412 --- aws/resource_aws_ssm_maintenance_window.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/aws/resource_aws_ssm_maintenance_window.go b/aws/resource_aws_ssm_maintenance_window.go index e895b532355f..a7c939cc7477 100644 --- a/aws/resource_aws_ssm_maintenance_window.go +++ b/aws/resource_aws_ssm_maintenance_window.go @@ -102,6 +102,11 @@ func resourceAwsSsmMaintenanceWindowUpdate(d *schema.ResourceData, meta interfac _, err := ssmconn.UpdateMaintenanceWindow(params) if err != nil { + if isAWSErr(err, ssm.ErrCodeDoesNotExistException, "") { + log.Printf("[WARN] Maintenance Window %s not found, removing from state", d.Id()) + d.SetId("") + return nil + } return err } @@ -117,6 +122,11 @@ func resourceAwsSsmMaintenanceWindowRead(d *schema.ResourceData, meta interface{ resp, err := ssmconn.GetMaintenanceWindow(params) if err != nil { + if isAWSErr(err, ssm.ErrCodeDoesNotExistException, "") { + log.Printf("[WARN] Maintenance Window %s not found, removing from state", d.Id()) + d.SetId("") + return nil + } return err } From 34e34c767b0af90dfc049746ad99feaab6ef34f9 Mon Sep 17 00:00:00 2001 From: saravanan30erd Date: Thu, 2 Aug 2018 09:50:13 +0400 Subject: [PATCH 2/4] verify acceptance test --- ...esource_aws_ssm_maintenance_window_test.go | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/aws/resource_aws_ssm_maintenance_window_test.go b/aws/resource_aws_ssm_maintenance_window_test.go index 2fca94f3739c..e736f7494470 100644 --- a/aws/resource_aws_ssm_maintenance_window_test.go +++ b/aws/resource_aws_ssm_maintenance_window_test.go @@ -54,6 +54,25 @@ func TestAccAWSSSMMaintenanceWindow_basic(t *testing.T) { }) } +func TestAccAWSSSMMaintenanceWindow_disappears(t *testing.T) { + name := acctest.RandString(10) + resourceName := "aws_ssm_maintenance_window.foo" + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSSSMMaintenanceWindowDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSSSMMaintenanceWindowBasicConfig(name), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSSSMMaintenanceWindowExists(resourceName), + testAccCheckAWSSSMMaintenanceWindowDisappears(fmt.Sprintf("maintenance-window-%s", name)), + ), + }, + }, + }) +} + func testAccCheckAWSSSMMaintenanceWindowExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -89,6 +108,20 @@ func testAccCheckAWSSSMMaintenanceWindowExists(n string) resource.TestCheckFunc } } +func testAccCheckAWSSSMMaintenanceWindowDisappears(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := testAccProvider.Meta().(*AWSClient).ssmconn + + _, err := conn.DeleteMaintenanceWindow(&ssm.DeleteMaintenanceWindowInput{ + WindowId: aws.String(n), + }) + if err != nil { + return fmt.Errorf("error deleting maintenance window %s: %s", n, err) + } + return nil + } +} + func testAccCheckAWSSSMMaintenanceWindowDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).ssmconn From e7314dc0292ad3cb45f2b05a15b0be9efe301f65 Mon Sep 17 00:00:00 2001 From: saravanan30erd Date: Thu, 2 Aug 2018 19:02:51 +0400 Subject: [PATCH 3/4] add acceptance test to address issue #5412 --- ...esource_aws_ssm_maintenance_window_test.go | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/aws/resource_aws_ssm_maintenance_window_test.go b/aws/resource_aws_ssm_maintenance_window_test.go index e736f7494470..887920a44b11 100644 --- a/aws/resource_aws_ssm_maintenance_window_test.go +++ b/aws/resource_aws_ssm_maintenance_window_test.go @@ -55,8 +55,10 @@ func TestAccAWSSSMMaintenanceWindow_basic(t *testing.T) { } func TestAccAWSSSMMaintenanceWindow_disappears(t *testing.T) { + var winId ssm.MaintenanceWindowIdentity name := acctest.RandString(10) resourceName := "aws_ssm_maintenance_window.foo" + resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, @@ -65,9 +67,10 @@ func TestAccAWSSSMMaintenanceWindow_disappears(t *testing.T) { { Config: testAccAWSSSMMaintenanceWindowBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSSSMMaintenanceWindowExists(resourceName), - testAccCheckAWSSSMMaintenanceWindowDisappears(fmt.Sprintf("maintenance-window-%s", name)), + testAccCheckAWSSSMMaintenanceWindowDisappearsExists(resourceName, &winId), + testAccCheckAWSSSMMaintenanceWindowDisappears(&winId), ), + ExpectNonEmptyPlan: true, }, }, }) @@ -108,15 +111,52 @@ func testAccCheckAWSSSMMaintenanceWindowExists(n string) resource.TestCheckFunc } } -func testAccCheckAWSSSMMaintenanceWindowDisappears(n string) resource.TestCheckFunc { +func testAccCheckAWSSSMMaintenanceWindowDisappearsExists(n string, res *ssm.MaintenanceWindowIdentity) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No SSM Maintenance Window ID is set") + } + + conn := testAccProvider.Meta().(*AWSClient).ssmconn + + resp, err := conn.DescribeMaintenanceWindows(&ssm.DescribeMaintenanceWindowsInput{ + Filters: []*ssm.MaintenanceWindowFilter{ + { + Key: aws.String("Name"), + Values: []*string{aws.String(rs.Primary.Attributes["name"])}, + }, + }, + }) + if err != nil { + return err + } + + for _, i := range resp.WindowIdentities { + if *i.WindowId == rs.Primary.ID { + *res = *i + return nil + } + } + + return fmt.Errorf("No AWS SSM Maintenance window found") + } +} + +func testAccCheckAWSSSMMaintenanceWindowDisappears(maintenanceWindowIdentity *ssm.MaintenanceWindowIdentity) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).ssmconn + id := aws.StringValue(maintenanceWindowIdentity.WindowId) _, err := conn.DeleteMaintenanceWindow(&ssm.DeleteMaintenanceWindowInput{ - WindowId: aws.String(n), + WindowId: aws.String(id), }) if err != nil { - return fmt.Errorf("error deleting maintenance window %s: %s", n, err) + return fmt.Errorf("error deleting maintenance window %s: %s", id, err) } return nil } From 138909223b86c278dbee709a498c76bec0b8286b Mon Sep 17 00:00:00 2001 From: saravanan30erd Date: Thu, 2 Aug 2018 19:57:34 +0400 Subject: [PATCH 4/4] update acceptance tests for ssm_maintenance_window --- ...esource_aws_ssm_maintenance_window_test.go | 45 +++---------------- 1 file changed, 6 insertions(+), 39 deletions(-) diff --git a/aws/resource_aws_ssm_maintenance_window_test.go b/aws/resource_aws_ssm_maintenance_window_test.go index 887920a44b11..068f47667dd6 100644 --- a/aws/resource_aws_ssm_maintenance_window_test.go +++ b/aws/resource_aws_ssm_maintenance_window_test.go @@ -12,7 +12,9 @@ import ( ) func TestAccAWSSSMMaintenanceWindow_basic(t *testing.T) { + var winId ssm.MaintenanceWindowIdentity name := acctest.RandString(10) + resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, @@ -21,7 +23,7 @@ func TestAccAWSSSMMaintenanceWindow_basic(t *testing.T) { { Config: testAccAWSSSMMaintenanceWindowBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSSSMMaintenanceWindowExists("aws_ssm_maintenance_window.foo"), + testAccCheckAWSSSMMaintenanceWindowExists("aws_ssm_maintenance_window.foo", &winId), resource.TestCheckResourceAttr( "aws_ssm_maintenance_window.foo", "schedule", "cron(0 16 ? * TUE *)"), resource.TestCheckResourceAttr( @@ -37,7 +39,7 @@ func TestAccAWSSSMMaintenanceWindow_basic(t *testing.T) { { Config: testAccAWSSSMMaintenanceWindowBasicConfigUpdated(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSSSMMaintenanceWindowExists("aws_ssm_maintenance_window.foo"), + testAccCheckAWSSSMMaintenanceWindowExists("aws_ssm_maintenance_window.foo", &winId), resource.TestCheckResourceAttr( "aws_ssm_maintenance_window.foo", "schedule", "cron(0 16 ? * WED *)"), resource.TestCheckResourceAttr( @@ -67,7 +69,7 @@ func TestAccAWSSSMMaintenanceWindow_disappears(t *testing.T) { { Config: testAccAWSSSMMaintenanceWindowBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSSSMMaintenanceWindowDisappearsExists(resourceName, &winId), + testAccCheckAWSSSMMaintenanceWindowExists(resourceName, &winId), testAccCheckAWSSSMMaintenanceWindowDisappears(&winId), ), ExpectNonEmptyPlan: true, @@ -76,42 +78,7 @@ func TestAccAWSSSMMaintenanceWindow_disappears(t *testing.T) { }) } -func testAccCheckAWSSSMMaintenanceWindowExists(n string) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[n] - if !ok { - return fmt.Errorf("Not found: %s", n) - } - - if rs.Primary.ID == "" { - return fmt.Errorf("No SSM Maintenance Window ID is set") - } - - conn := testAccProvider.Meta().(*AWSClient).ssmconn - - resp, err := conn.DescribeMaintenanceWindows(&ssm.DescribeMaintenanceWindowsInput{ - Filters: []*ssm.MaintenanceWindowFilter{ - { - Key: aws.String("Name"), - Values: []*string{aws.String(rs.Primary.Attributes["name"])}, - }, - }, - }) - - for _, i := range resp.WindowIdentities { - if *i.WindowId == rs.Primary.ID { - return nil - } - } - if err != nil { - return err - } - - return fmt.Errorf("No AWS SSM Maintenance window found") - } -} - -func testAccCheckAWSSSMMaintenanceWindowDisappearsExists(n string, res *ssm.MaintenanceWindowIdentity) resource.TestCheckFunc { +func testAccCheckAWSSSMMaintenanceWindowExists(n string, res *ssm.MaintenanceWindowIdentity) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok {