github.com/hobbeswalsh/terraform@v0.3.7-0.20150619183303-ad17cf55a0fa/builtin/providers/aws/resource_aws_ecs_service_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/ecs"
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  )
    12  
    13  func TestParseTaskDefinition(t *testing.T) {
    14  	cases := map[string]map[string]interface{}{
    15  		"invalid": map[string]interface{}{
    16  			"family":   "",
    17  			"revision": "",
    18  			"isValid":  false,
    19  		},
    20  		"invalidWithColon:": map[string]interface{}{
    21  			"family":   "",
    22  			"revision": "",
    23  			"isValid":  false,
    24  		},
    25  		"1234": map[string]interface{}{
    26  			"family":   "",
    27  			"revision": "",
    28  			"isValid":  false,
    29  		},
    30  		"invalid:aaa": map[string]interface{}{
    31  			"family":   "",
    32  			"revision": "",
    33  			"isValid":  false,
    34  		},
    35  		"invalid=family:1": map[string]interface{}{
    36  			"family":   "",
    37  			"revision": "",
    38  			"isValid":  false,
    39  		},
    40  		"invalid:name:1": map[string]interface{}{
    41  			"family":   "",
    42  			"revision": "",
    43  			"isValid":  false,
    44  		},
    45  		"valid:1": map[string]interface{}{
    46  			"family":   "valid",
    47  			"revision": "1",
    48  			"isValid":  true,
    49  		},
    50  		"abc12-def:54": map[string]interface{}{
    51  			"family":   "abc12-def",
    52  			"revision": "54",
    53  			"isValid":  true,
    54  		},
    55  		"lorem_ip-sum:123": map[string]interface{}{
    56  			"family":   "lorem_ip-sum",
    57  			"revision": "123",
    58  			"isValid":  true,
    59  		},
    60  		"lorem-ipsum:1": map[string]interface{}{
    61  			"family":   "lorem-ipsum",
    62  			"revision": "1",
    63  			"isValid":  true,
    64  		},
    65  	}
    66  
    67  	for input, expectedOutput := range cases {
    68  		family, revision, err := parseTaskDefinition(input)
    69  		isValid := expectedOutput["isValid"].(bool)
    70  		if !isValid && err == nil {
    71  			t.Fatalf("Task definition %s should fail", input)
    72  		}
    73  
    74  		expectedFamily := expectedOutput["family"].(string)
    75  		if family != expectedFamily {
    76  			t.Fatalf("Unexpected family (%#v) for task definition %s\n%#v", family, input, err)
    77  		}
    78  		expectedRevision := expectedOutput["revision"].(string)
    79  		if revision != expectedRevision {
    80  			t.Fatalf("Unexpected revision (%#v) for task definition %s\n%#v", revision, input, err)
    81  		}
    82  	}
    83  }
    84  
    85  func TestAccAWSEcsServiceWithARN(t *testing.T) {
    86  	resource.Test(t, resource.TestCase{
    87  		PreCheck:     func() { testAccPreCheck(t) },
    88  		Providers:    testAccProviders,
    89  		CheckDestroy: testAccCheckAWSEcsServiceDestroy,
    90  		Steps: []resource.TestStep{
    91  			resource.TestStep{
    92  				Config: testAccAWSEcsService,
    93  				Check: resource.ComposeTestCheckFunc(
    94  					testAccCheckAWSEcsServiceExists("aws_ecs_service.mongo"),
    95  				),
    96  			},
    97  
    98  			resource.TestStep{
    99  				Config: testAccAWSEcsServiceModified,
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAWSEcsServiceExists("aws_ecs_service.mongo"),
   102  				),
   103  			},
   104  		},
   105  	})
   106  }
   107  
   108  func TestAccAWSEcsServiceWithFamilyAndRevision(t *testing.T) {
   109  	resource.Test(t, resource.TestCase{
   110  		PreCheck:     func() { testAccPreCheck(t) },
   111  		Providers:    testAccProviders,
   112  		CheckDestroy: testAccCheckAWSEcsServiceDestroy,
   113  		Steps: []resource.TestStep{
   114  			resource.TestStep{
   115  				Config: testAccAWSEcsServiceWithFamilyAndRevision,
   116  				Check: resource.ComposeTestCheckFunc(
   117  					testAccCheckAWSEcsServiceExists("aws_ecs_service.jenkins"),
   118  				),
   119  			},
   120  
   121  			resource.TestStep{
   122  				Config: testAccAWSEcsServiceWithFamilyAndRevisionModified,
   123  				Check: resource.ComposeTestCheckFunc(
   124  					testAccCheckAWSEcsServiceExists("aws_ecs_service.jenkins"),
   125  				),
   126  			},
   127  		},
   128  	})
   129  }
   130  
   131  func testAccCheckAWSEcsServiceDestroy(s *terraform.State) error {
   132  	conn := testAccProvider.Meta().(*AWSClient).ecsconn
   133  
   134  	for _, rs := range s.RootModule().Resources {
   135  		if rs.Type != "aws_ecs_service" {
   136  			continue
   137  		}
   138  
   139  		out, err := conn.DescribeServices(&ecs.DescribeServicesInput{
   140  			Services: []*string{aws.String(rs.Primary.ID)},
   141  		})
   142  
   143  		if err == nil {
   144  			if len(out.Services) > 0 {
   145  				return fmt.Errorf("ECS service still exists:\n%#v", out.Services)
   146  			}
   147  		}
   148  
   149  		return err
   150  	}
   151  
   152  	return nil
   153  }
   154  
   155  func testAccCheckAWSEcsServiceExists(name string) resource.TestCheckFunc {
   156  	return func(s *terraform.State) error {
   157  		_, ok := s.RootModule().Resources[name]
   158  		if !ok {
   159  			return fmt.Errorf("Not found: %s", name)
   160  		}
   161  
   162  		return nil
   163  	}
   164  }
   165  
   166  var testAccAWSEcsService = `
   167  resource "aws_ecs_cluster" "default" {
   168  	name = "terraformecstest1"
   169  }
   170  
   171  resource "aws_ecs_task_definition" "mongo" {
   172    family = "mongodb"
   173    container_definitions = <<DEFINITION
   174  [
   175    {
   176      "cpu": 128,
   177      "essential": true,
   178      "image": "mongo:latest",
   179      "memory": 128,
   180      "name": "mongodb"
   181    }
   182  ]
   183  DEFINITION
   184  }
   185  
   186  resource "aws_ecs_service" "mongo" {
   187    name = "mongodb"
   188    cluster = "${aws_ecs_cluster.default.id}"
   189    task_definition = "${aws_ecs_task_definition.mongo.arn}"
   190    desired_count = 1
   191  }
   192  `
   193  
   194  var testAccAWSEcsServiceModified = `
   195  resource "aws_ecs_cluster" "default" {
   196  	name = "terraformecstest1"
   197  }
   198  
   199  resource "aws_ecs_task_definition" "mongo" {
   200    family = "mongodb"
   201    container_definitions = <<DEFINITION
   202  [
   203    {
   204      "cpu": 128,
   205      "essential": true,
   206      "image": "mongo:latest",
   207      "memory": 128,
   208      "name": "mongodb"
   209    }
   210  ]
   211  DEFINITION
   212  }
   213  
   214  resource "aws_ecs_service" "mongo" {
   215    name = "mongodb"
   216    cluster = "${aws_ecs_cluster.default.id}"
   217    task_definition = "${aws_ecs_task_definition.mongo.arn}"
   218    desired_count = 2
   219  }
   220  `
   221  
   222  var testAccAWSEcsServiceWithFamilyAndRevision = `
   223  resource "aws_ecs_cluster" "default" {
   224  	name = "terraformecstest2"
   225  }
   226  
   227  resource "aws_ecs_task_definition" "jenkins" {
   228    family = "jenkins"
   229    container_definitions = <<DEFINITION
   230  [
   231    {
   232      "cpu": 128,
   233      "essential": true,
   234      "image": "jenkins:latest",
   235      "memory": 128,
   236      "name": "jenkins"
   237    }
   238  ]
   239  DEFINITION
   240  }
   241  
   242  resource "aws_ecs_service" "jenkins" {
   243    name = "jenkins"
   244    cluster = "${aws_ecs_cluster.default.id}"
   245    task_definition = "${aws_ecs_task_definition.jenkins.family}:${aws_ecs_task_definition.jenkins.revision}"
   246    desired_count = 1
   247  }
   248  `
   249  
   250  var testAccAWSEcsServiceWithFamilyAndRevisionModified = `
   251  resource "aws_ecs_cluster" "default" {
   252  	name = "terraformecstest2"
   253  }
   254  
   255  resource "aws_ecs_task_definition" "jenkins" {
   256    family = "jenkins"
   257    container_definitions = <<DEFINITION
   258  [
   259    {
   260      "cpu": 128,
   261      "essential": true,
   262      "image": "jenkins:latest",
   263      "memory": 128,
   264      "name": "jenkins"
   265    }
   266  ]
   267  DEFINITION
   268  }
   269  
   270  resource "aws_ecs_service" "jenkins" {
   271    name = "jenkins"
   272    cluster = "${aws_ecs_cluster.default.id}"
   273    task_definition = "${aws_ecs_task_definition.jenkins.family}:${aws_ecs_task_definition.jenkins.revision}"
   274    desired_count = 1
   275  }
   276  `