github.com/IBM-Cloud/terraform@v0.6.4-0.20170726051544-8872b87621df/builtin/providers/nomad/resource_job_test.go (about)

     1  package nomad
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	r "github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  
    12  	"github.com/hashicorp/nomad/api"
    13  )
    14  
    15  func TestResourceJob_basic(t *testing.T) {
    16  	r.Test(t, r.TestCase{
    17  		Providers: testProviders,
    18  		PreCheck:  func() { testAccPreCheck(t) },
    19  		Steps: []r.TestStep{
    20  			{
    21  				Config: testResourceJob_initialConfig,
    22  				Check:  testResourceJob_initialCheck,
    23  			},
    24  		},
    25  
    26  		CheckDestroy: testResourceJob_checkDestroy("foo"),
    27  	})
    28  }
    29  
    30  func TestResourceJob_refresh(t *testing.T) {
    31  	r.Test(t, r.TestCase{
    32  		Providers: testProviders,
    33  		PreCheck:  func() { testAccPreCheck(t) },
    34  		Steps: []r.TestStep{
    35  			{
    36  				Config: testResourceJob_initialConfig,
    37  				Check:  testResourceJob_initialCheck,
    38  			},
    39  
    40  			// This should successfully cause the job to be recreated,
    41  			// testing the Exists function.
    42  			{
    43  				PreConfig: testResourceJob_deregister(t, "foo"),
    44  				Config:    testResourceJob_initialConfig,
    45  			},
    46  		},
    47  	})
    48  }
    49  
    50  func TestResourceJob_disableDestroyDeregister(t *testing.T) {
    51  	r.Test(t, r.TestCase{
    52  		Providers: testProviders,
    53  		PreCheck:  func() { testAccPreCheck(t) },
    54  		Steps: []r.TestStep{
    55  			{
    56  				Config: testResourceJob_noDestroy,
    57  				Check:  testResourceJob_initialCheck,
    58  			},
    59  
    60  			// Destroy with our setting set
    61  			{
    62  				Destroy: true,
    63  				Config:  testResourceJob_noDestroy,
    64  				Check:   testResourceJob_checkExists,
    65  			},
    66  
    67  			// Re-apply without the setting set
    68  			{
    69  				Config: testResourceJob_initialConfig,
    70  				Check:  testResourceJob_checkExists,
    71  			},
    72  		},
    73  	})
    74  }
    75  
    76  func TestResourceJob_idChange(t *testing.T) {
    77  	r.Test(t, r.TestCase{
    78  		Providers: testProviders,
    79  		PreCheck:  func() { testAccPreCheck(t) },
    80  		Steps: []r.TestStep{
    81  			{
    82  				Config: testResourceJob_initialConfig,
    83  				Check:  testResourceJob_initialCheck,
    84  			},
    85  
    86  			// Change our ID
    87  			{
    88  				Config: testResourceJob_updateConfig,
    89  				Check:  testResourceJob_updateCheck,
    90  			},
    91  		},
    92  	})
    93  }
    94  
    95  func TestResourceJob_parameterizedJob(t *testing.T) {
    96  	r.Test(t, r.TestCase{
    97  		Providers: testProviders,
    98  		PreCheck:  func() { testAccPreCheck(t) },
    99  		Steps: []r.TestStep{
   100  			{
   101  				Config: testResourceJob_parameterizedJob,
   102  				Check:  testResourceJob_initialCheck,
   103  			},
   104  		},
   105  	})
   106  }
   107  
   108  var testResourceJob_initialConfig = `
   109  resource "nomad_job" "test" {
   110      jobspec = <<EOT
   111  job "foo" {
   112      datacenters = ["dc1"]
   113      type = "service"
   114      group "foo" {
   115          task "foo" {
   116              driver = "raw_exec"
   117              config {
   118                  command = "/bin/sleep"
   119                  args = ["1"]
   120              }
   121  
   122              resources {
   123                  cpu = 20
   124                  memory = 10
   125              }
   126  
   127              logs {
   128                  max_files = 3
   129                  max_file_size = 10
   130              }
   131          }
   132      }
   133  }
   134  EOT
   135  }
   136  `
   137  
   138  var testResourceJob_noDestroy = `
   139  resource "nomad_job" "test" {
   140      deregister_on_destroy = false
   141      jobspec = <<EOT
   142  job "foo" {
   143      datacenters = ["dc1"]
   144      type = "service"
   145      group "foo" {
   146          task "foo" {
   147              driver = "raw_exec"
   148              config {
   149                  command = "/bin/sleep"
   150                  args = ["1"]
   151              }
   152  
   153              resources {
   154                  cpu = 20
   155                  memory = 10
   156              }
   157  
   158              logs {
   159                  max_files = 3
   160                  max_file_size = 10
   161              }
   162          }
   163      }
   164  }
   165  EOT
   166  }
   167  `
   168  
   169  func testResourceJob_initialCheck(s *terraform.State) error {
   170  	resourceState := s.Modules[0].Resources["nomad_job.test"]
   171  	if resourceState == nil {
   172  		return errors.New("resource not found in state")
   173  	}
   174  
   175  	instanceState := resourceState.Primary
   176  	if instanceState == nil {
   177  		return errors.New("resource has no primary instance")
   178  	}
   179  
   180  	jobID := instanceState.ID
   181  
   182  	client := testProvider.Meta().(*api.Client)
   183  	job, _, err := client.Jobs().Info(jobID, nil)
   184  	if err != nil {
   185  		return fmt.Errorf("error reading back job: %s", err)
   186  	}
   187  
   188  	if got, want := job.ID, jobID; got != want {
   189  		return fmt.Errorf("jobID is %q; want %q", got, want)
   190  	}
   191  
   192  	return nil
   193  }
   194  
   195  func testResourceJob_checkExists(s *terraform.State) error {
   196  	jobID := "foo"
   197  
   198  	client := testProvider.Meta().(*api.Client)
   199  	_, _, err := client.Jobs().Info(jobID, nil)
   200  	if err != nil {
   201  		return fmt.Errorf("error reading back job: %s", err)
   202  	}
   203  
   204  	return nil
   205  }
   206  
   207  func testResourceJob_checkDestroy(jobID string) r.TestCheckFunc {
   208  	return func(*terraform.State) error {
   209  		client := testProvider.Meta().(*api.Client)
   210  		job, _, err := client.Jobs().Info(jobID, nil)
   211  		// This should likely never happen, due to how nomad caches jobs
   212  		if err != nil && strings.Contains(err.Error(), "404") || job == nil {
   213  			return nil
   214  		}
   215  
   216  		if job.Status != "dead" {
   217  			return fmt.Errorf("Job %q has not been stopped. Status: %s", jobID, job.Status)
   218  		}
   219  
   220  		return nil
   221  	}
   222  }
   223  
   224  func testResourceJob_deregister(t *testing.T, jobID string) func() {
   225  	return func() {
   226  		client := testProvider.Meta().(*api.Client)
   227  		_, _, err := client.Jobs().Deregister(jobID, nil)
   228  		if err != nil {
   229  			t.Fatalf("error deregistering job: %s", err)
   230  		}
   231  	}
   232  }
   233  
   234  var testResourceJob_updateConfig = `
   235  resource "nomad_job" "test" {
   236      jobspec = <<EOT
   237  job "bar" {
   238      datacenters = ["dc1"]
   239      type = "service"
   240      group "foo" {
   241          task "foo" {
   242              driver = "raw_exec"
   243              config {
   244                  command = "/bin/sleep"
   245                  args = ["1"]
   246              }
   247  
   248              resources {
   249                  cpu = 20
   250                  memory = 10
   251              }
   252  
   253              logs {
   254                  max_files = 3
   255                  max_file_size = 10
   256              }
   257          }
   258      }
   259  }
   260  EOT
   261  }
   262  `
   263  
   264  func testResourceJob_updateCheck(s *terraform.State) error {
   265  	resourceState := s.Modules[0].Resources["nomad_job.test"]
   266  	if resourceState == nil {
   267  		return errors.New("resource not found in state")
   268  	}
   269  
   270  	instanceState := resourceState.Primary
   271  	if instanceState == nil {
   272  		return errors.New("resource has no primary instance")
   273  	}
   274  
   275  	jobID := instanceState.ID
   276  
   277  	client := testProvider.Meta().(*api.Client)
   278  	job, _, err := client.Jobs().Info(jobID, nil)
   279  	if err != nil {
   280  		return fmt.Errorf("error reading back job: %s", err)
   281  	}
   282  
   283  	if got, want := job.ID, jobID; got != want {
   284  		return fmt.Errorf("jobID is %q; want %q", got, want)
   285  	}
   286  
   287  	{
   288  		// Verify foo doesn't exist
   289  		job, _, err := client.Jobs().Info("foo", nil)
   290  		if err != nil {
   291  			// Job could have already been purged from nomad server
   292  			if !strings.Contains(err.Error(), "(job not found)") {
   293  				return fmt.Errorf("error reading %q job: %s", "foo", err)
   294  			}
   295  			return nil
   296  		}
   297  		if job.Status != "dead" {
   298  			return fmt.Errorf("%q job is not dead. Status: %q", "foo", job.Status)
   299  		}
   300  	}
   301  
   302  	return nil
   303  }
   304  
   305  var testResourceJob_parameterizedJob = `
   306  resource "nomad_job" "test" {
   307      jobspec = <<EOT
   308  job "bar" {
   309      datacenters = ["dc1"]
   310      type = "batch"
   311      parameterized {
   312        payload = "required"
   313      }
   314      group "foo" {
   315          task "foo" {
   316              driver = "raw_exec"
   317              config {
   318                  command = "/bin/sleep"
   319                  args = ["1"]
   320              }
   321              resources {
   322                  cpu = 20
   323                  memory = 10
   324              }
   325  
   326              logs {
   327                  max_files = 3
   328                  max_file_size = 10
   329              }
   330          }
   331      }
   332  }
   333  EOT
   334  }
   335  `