github.com/kubernetes-incubator/kube-aws@v0.16.4/pkg/api/userdata_test.go (about)

     1  package api
     2  
     3  import (
     4  	"github.com/stretchr/testify/assert"
     5  
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"testing"
    10  )
    11  
    12  const (
    13  	s3Body = `#cloud-config
    14  ---
    15  coreos: {}
    16  `
    17  )
    18  
    19  func mkTmpl(t, b string) string {
    20  	return fmt.Sprintf(`{{define "%s"}}%s{{end}}`, t, b)
    21  }
    22  
    23  var (
    24  	mkInstance       = func(b string) string { return mkTmpl(USERDATA_INSTANCE, b) }
    25  	mkInstanceScript = func(b string) string { return mkTmpl(USERDATA_INSTANCE_SCRIPT, b) }
    26  	mkS3             = func(b string) string { return mkTmpl(USERDATA_S3, b) }
    27  	tS3              = mkS3(s3Body)
    28  	tInstance        = mkInstance("INSTANCE BODY")
    29  	tInstanceScript  = mkInstanceScript("INSTANCE SCRIPT BODY")
    30  	instanceOnlyOpt  = []UserDataOption{UserDataPartsOpt(PartDesc{USERDATA_INSTANCE, validateNone})}
    31  )
    32  
    33  type Expectation func(assert *assert.Assertions, ud UserData, err error)
    34  
    35  func TestUserDataNew(t *testing.T) {
    36  	tests := []struct {
    37  		name     string
    38  		template string
    39  		opts     []UserDataOption
    40  		exp      Expectation
    41  	}{
    42  		{"simple", tS3 + tInstance + tInstanceScript, nil,
    43  			func(a *assert.Assertions, ud UserData, err error) {
    44  				a.NoError(err)
    45  				a.NotEmpty(ud)
    46  
    47  				a.Len(ud.Parts, 3)
    48  				if a.Contains(ud.Parts, USERDATA_S3) {
    49  					udata, _ := ud.Parts[USERDATA_S3]
    50  					content, err := udata.Template()
    51  					a.NoError(err)
    52  					a.Equal(content, s3Body)
    53  				}
    54  
    55  				if a.Contains(ud.Parts, USERDATA_INSTANCE) {
    56  					udata, _ := ud.Parts[USERDATA_INSTANCE]
    57  					content, err := udata.Template()
    58  					a.NoError(err)
    59  					a.Equal(content, "INSTANCE BODY")
    60  				}
    61  
    62  				if a.Contains(ud.Parts, USERDATA_INSTANCE_SCRIPT) {
    63  					udata, _ := ud.Parts[USERDATA_INSTANCE_SCRIPT]
    64  					content, err := udata.Template()
    65  					a.NoError(err)
    66  					a.Equal(content, "INSTANCE SCRIPT BODY")
    67  				}
    68  			},
    69  		},
    70  		{"missing S3", tInstance, nil,
    71  			func(a *assert.Assertions, ud UserData, err error) {
    72  				if a.Error(err) {
    73  					a.Contains(err.Error(), "Can't find requested template")
    74  				}
    75  			},
    76  		},
    77  		{"extra", mkInstance("{{extra.Body}}"), instanceOnlyOpt,
    78  			func(a *assert.Assertions, ud UserData, err error) {
    79  				a.NoError(err, "Userdata creation failed")
    80  
    81  				p, ok := ud.Parts[USERDATA_INSTANCE]
    82  				if a.True(ok) {
    83  					content, err := p.Template(map[string]interface{}{"Body": "EXTRA BODY"})
    84  					a.NoError(err, "Can't find 'extra' function")
    85  					a.Equal("EXTRA BODY", content)
    86  				}
    87  			},
    88  		},
    89  		{"self", mkInstance("{{if self.Parts}}GOOD{{else}}BAD{{end}}"), instanceOnlyOpt,
    90  			func(a *assert.Assertions, ud UserData, err error) {
    91  				if !a.NoError(err, "Userdata creation failed") {
    92  					return
    93  				}
    94  
    95  				p, ok := ud.Parts[USERDATA_INSTANCE]
    96  				if a.True(ok, "Can't find Instance template") {
    97  					content, err := p.Template()
    98  					a.NoError(err, "Can't find 'self' function")
    99  					a.Equal("GOOD", content, "self function doesn't return our own UserData")
   100  				}
   101  			},
   102  		},
   103  	}
   104  
   105  	for _, test := range tests {
   106  		tmpfile, _ := ioutil.TempFile("", "ud")
   107  		tmpfile.WriteString(test.template)
   108  		tmpfile.Close()
   109  		defer os.Remove(tmpfile.Name())
   110  		t.Run(test.name, func(t *testing.T) {
   111  			ud, err := NewUserDataFromTemplateFile(tmpfile.Name(), nil, test.opts...)
   112  			test.exp(assert.New(t), ud, err)
   113  		})
   114  	}
   115  }