github.com/grahambrereton-form3/tilt@v0.10.18/internal/engine/testdata_test.go (about)

     1  package engine
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/windmilleng/tilt/internal/container"
     7  	"github.com/windmilleng/tilt/internal/k8s/testyaml"
     8  	"github.com/windmilleng/tilt/internal/testutils/manifestbuilder"
     9  	"github.com/windmilleng/tilt/pkg/model"
    10  )
    11  
    12  type Fixture = manifestbuilder.Fixture
    13  
    14  const SanchoYAML = testyaml.SanchoYAML
    15  
    16  const SanchoTwinYAML = testyaml.SanchoTwinYAML
    17  
    18  const SanchoBaseDockerfile = `
    19  FROM go:1.10
    20  `
    21  
    22  const SanchoDockerfile = `
    23  FROM go:1.10
    24  ADD . .
    25  RUN go install github.com/windmilleng/sancho
    26  ENTRYPOINT /go/bin/sancho
    27  `
    28  
    29  var SanchoRef = container.MustParseSelector(testyaml.SanchoImage)
    30  var SanchoBaseRef = container.MustParseSelector("sancho-base")
    31  var SanchoSidecarRef = container.MustParseSelector(testyaml.SanchoSidecarImage)
    32  
    33  func NewSanchoFastBuild(fixture Fixture) model.FastBuild {
    34  	return model.FastBuild{
    35  		BaseDockerfile: SanchoBaseDockerfile,
    36  		Syncs: []model.Sync{
    37  			model.Sync{
    38  				LocalPath:     fixture.Path(),
    39  				ContainerPath: "/go/src/github.com/windmilleng/sancho",
    40  			},
    41  		},
    42  		Runs: model.ToRuns([]model.Cmd{
    43  			model.Cmd{Argv: []string{"go", "install", "github.com/windmilleng/sancho"}},
    44  		}),
    45  		Entrypoint: model.Cmd{Argv: []string{"/go/bin/sancho"}},
    46  	}
    47  }
    48  
    49  func SyncStepsForApp(app string, fixture Fixture) []model.LiveUpdateSyncStep {
    50  	return []model.LiveUpdateSyncStep{model.LiveUpdateSyncStep{
    51  		Source: fixture.Path(),
    52  		Dest:   fmt.Sprintf("/go/src/github.com/windmilleng/%s", app),
    53  	}}
    54  }
    55  func SanchoSyncSteps(fixture Fixture) []model.LiveUpdateSyncStep {
    56  	return SyncStepsForApp("sancho", fixture)
    57  }
    58  
    59  func RunStepsForApp(app string) []model.LiveUpdateRunStep {
    60  	return []model.LiveUpdateRunStep{model.LiveUpdateRunStep{Command: model.Cmd{Argv: []string{"go", "install", fmt.Sprintf("github.com/windmilleng/%s", app)}}}}
    61  }
    62  
    63  var SanchoRunSteps = RunStepsForApp("sancho")
    64  
    65  func NewSanchoFastBuildImage(fixture Fixture) model.ImageTarget {
    66  	fbInfo := NewSanchoFastBuild(fixture)
    67  	return model.NewImageTarget(SanchoRef).WithBuildDetails(fbInfo)
    68  }
    69  
    70  func NewSanchoFastBuildManifest(f Fixture) model.Manifest {
    71  	return manifestbuilder.New(f, "sancho").
    72  		WithK8sYAML(SanchoYAML).
    73  		WithImageTarget(NewSanchoFastBuildImage(f)).
    74  		Build()
    75  }
    76  
    77  func NewSanchoLiveUpdateManifest(f Fixture) model.Manifest {
    78  	return manifestbuilder.New(f, "sancho").
    79  		WithK8sYAML(SanchoYAML).
    80  		WithImageTarget(NewSanchoLiveUpdateImageTarget(f)).
    81  		Build()
    82  }
    83  
    84  func NewSanchoFastBuildDCManifest(f Fixture) model.Manifest {
    85  	return manifestbuilder.New(f, "sancho").
    86  		WithDockerCompose().
    87  		WithImageTarget(NewSanchoFastBuildImage(f)).
    88  		Build()
    89  }
    90  
    91  func NewSanchoFastBuildManifestWithCache(fixture Fixture, paths []string) model.Manifest {
    92  	manifest := NewSanchoFastBuildManifest(fixture)
    93  	manifest = manifest.WithImageTarget(manifest.ImageTargetAt(0).WithCachePaths(paths))
    94  	return manifest
    95  }
    96  
    97  func NewSanchoManifestWithImageInEnvVar(f Fixture) model.Manifest {
    98  	it2 := model.NewImageTarget(container.MustParseSelector(SanchoRef.String() + "2")).WithBuildDetails(model.DockerBuild{
    99  		Dockerfile: SanchoDockerfile,
   100  		BuildPath:  f.Path(),
   101  	})
   102  	it2.MatchInEnvVars = true
   103  	return manifestbuilder.New(f, "sancho").
   104  		WithK8sYAML(testyaml.SanchoImageInEnvYAML).
   105  		WithImageTargets(NewSanchoDockerBuildImageTarget(f), it2).
   106  		Build()
   107  }
   108  
   109  func NewSanchoCustomBuildManifest(fixture Fixture) model.Manifest {
   110  	return NewSanchoCustomBuildManifestWithTag(fixture, "")
   111  }
   112  
   113  func NewSanchoCustomBuildImageTarget(fixture Fixture) model.ImageTarget {
   114  	return NewSanchoCustomBuildImageTargetWithTag(fixture, "")
   115  }
   116  
   117  func NewSanchoCustomBuildImageTargetWithTag(fixture Fixture, tag string) model.ImageTarget {
   118  	cb := model.CustomBuild{
   119  		Command: "true",
   120  		Deps:    []string{fixture.JoinPath("app")},
   121  		Tag:     tag,
   122  	}
   123  	return model.NewImageTarget(SanchoRef).WithBuildDetails(cb)
   124  }
   125  
   126  func NewSanchoCustomBuildManifestWithTag(fixture Fixture, tag string) model.Manifest {
   127  	return manifestbuilder.New(fixture, "sancho").
   128  		WithK8sYAML(SanchoYAML).
   129  		WithImageTarget(NewSanchoCustomBuildImageTargetWithTag(fixture, tag)).
   130  		Build()
   131  }
   132  
   133  func NewSanchoCustomBuildManifestWithFastBuild(fixture Fixture) model.Manifest {
   134  	fb := NewSanchoFastBuild(fixture)
   135  	cb := model.CustomBuild{
   136  		Command: "true",
   137  		Deps:    []string{fixture.JoinPath("app")},
   138  		Fast:    fb,
   139  	}
   140  
   141  	return manifestbuilder.New(fixture, "sancho").
   142  		WithK8sYAML(SanchoYAML).
   143  		WithImageTarget(model.NewImageTarget(SanchoRef).WithBuildDetails(cb)).
   144  		Build()
   145  }
   146  
   147  func NewSanchoCustomBuildManifestWithPushDisabled(fixture Fixture) model.Manifest {
   148  	cb := model.CustomBuild{
   149  		Command:     "true",
   150  		Deps:        []string{fixture.JoinPath("app")},
   151  		DisablePush: true,
   152  		Tag:         "tilt-build",
   153  	}
   154  
   155  	return manifestbuilder.New(fixture, "sancho").
   156  		WithK8sYAML(SanchoYAML).
   157  		WithImageTarget(model.NewImageTarget(SanchoRef).WithBuildDetails(cb)).
   158  		Build()
   159  }
   160  
   161  func NewSanchoDockerBuildImageTarget(f Fixture) model.ImageTarget {
   162  	return model.NewImageTarget(SanchoRef).WithBuildDetails(model.DockerBuild{
   163  		Dockerfile: SanchoDockerfile,
   164  		BuildPath:  f.Path(),
   165  	})
   166  }
   167  
   168  func NewSanchoSyncOnlyImageTarget(f Fixture, syncs []model.LiveUpdateSyncStep) model.ImageTarget {
   169  	lu := assembleLiveUpdate(syncs, nil, false, []string{}, f)
   170  	return imageTargetWithLiveUpdate(NewSanchoDockerBuildImageTarget(f), lu)
   171  }
   172  
   173  func NewSanchoLiveUpdateImageTarget(f Fixture) model.ImageTarget {
   174  	syncs := []model.LiveUpdateSyncStep{
   175  		{
   176  			Source: f.Path(),
   177  			Dest:   "/go/src/github.com/windmilleng/sancho",
   178  		},
   179  	}
   180  	runs := []model.LiveUpdateRunStep{
   181  		{
   182  			Command: model.Cmd{Argv: []string{"go", "install", "github.com/windmilleng/sancho"}},
   183  		},
   184  	}
   185  
   186  	lu := assembleLiveUpdate(syncs, runs, true, []string{}, f)
   187  	return imageTargetWithLiveUpdate(NewSanchoDockerBuildImageTarget(f), lu)
   188  }
   189  
   190  func NewSanchoSidecarDockerBuildImageTarget(f Fixture) model.ImageTarget {
   191  	iTarget := NewSanchoDockerBuildImageTarget(f)
   192  	iTarget.ConfigurationRef = SanchoSidecarRef
   193  	iTarget.DeploymentRef = SanchoSidecarRef.AsNamedOnly()
   194  	return iTarget
   195  }
   196  
   197  func NewSanchoSidecarFastBuildImageTarget(f Fixture) model.ImageTarget {
   198  	iTarget := NewSanchoFastBuildImage(f)
   199  	iTarget.ConfigurationRef = SanchoSidecarRef
   200  	iTarget.DeploymentRef = SanchoSidecarRef.AsNamedOnly()
   201  	return iTarget
   202  }
   203  
   204  func NewSanchoSidecarLiveUpdateImageTarget(f Fixture) model.ImageTarget {
   205  	iTarget := NewSanchoLiveUpdateImageTarget(f)
   206  	iTarget.ConfigurationRef = SanchoSidecarRef
   207  	iTarget.DeploymentRef = SanchoSidecarRef.AsNamedOnly()
   208  	return iTarget
   209  }
   210  
   211  func NewSanchoDockerBuildManifest(f Fixture) model.Manifest {
   212  	return NewSanchoDockerBuildManifestWithYaml(f, SanchoYAML)
   213  }
   214  
   215  func NewSanchoDockerBuildManifestWithYaml(f Fixture, yaml string) model.Manifest {
   216  	return manifestbuilder.New(f, "sancho").
   217  		WithK8sYAML(yaml).
   218  		WithImageTarget(NewSanchoDockerBuildImageTarget(f)).
   219  		Build()
   220  }
   221  
   222  func NewSanchoDockerBuildManifestWithCache(f Fixture, paths []string) model.Manifest {
   223  	manifest := NewSanchoDockerBuildManifest(f)
   224  	manifest = manifest.WithImageTarget(manifest.ImageTargetAt(0).WithCachePaths(paths))
   225  	return manifest
   226  }
   227  
   228  func NewSanchoDockerBuildManifestWithNestedFastBuild(fixture Fixture) model.Manifest {
   229  	manifest := NewSanchoDockerBuildManifest(fixture)
   230  	iTarg := manifest.ImageTargetAt(0)
   231  	fb := NewSanchoFastBuild(fixture)
   232  	sb := iTarg.DockerBuildInfo()
   233  	sb.FastBuild = fb
   234  	iTarg = iTarg.WithBuildDetails(sb)
   235  	manifest = manifest.WithImageTarget(iTarg)
   236  	return manifest
   237  }
   238  
   239  func NewSanchoDockerBuildMultiStageManifest(fixture Fixture) model.Manifest {
   240  	baseImage := model.NewImageTarget(SanchoBaseRef).WithBuildDetails(model.DockerBuild{
   241  		Dockerfile: `FROM golang:1.10`,
   242  		BuildPath:  fixture.JoinPath("sancho-base"),
   243  	})
   244  
   245  	srcImage := model.NewImageTarget(SanchoRef).WithBuildDetails(model.DockerBuild{
   246  		Dockerfile: `
   247  FROM sancho-base
   248  ADD . .
   249  RUN go install github.com/windmilleng/sancho
   250  ENTRYPOINT /go/bin/sancho
   251  `,
   252  		BuildPath: fixture.JoinPath("sancho"),
   253  	}).WithDependencyIDs([]model.TargetID{baseImage.ID()})
   254  
   255  	return manifestbuilder.New(fixture, "sancho").
   256  		WithK8sYAML(SanchoYAML).
   257  		WithImageTargets(baseImage, srcImage).
   258  		Build()
   259  }
   260  
   261  func NewSanchoDockerBuildMultiStageManifestWithLiveUpdate(fixture Fixture, lu model.LiveUpdate) model.Manifest {
   262  	baseImage := model.NewImageTarget(SanchoBaseRef).WithBuildDetails(model.DockerBuild{
   263  		Dockerfile: `FROM golang:1.10`,
   264  		BuildPath:  fixture.JoinPath("sancho-base"),
   265  	})
   266  
   267  	srcImage := model.NewImageTarget(SanchoRef).WithBuildDetails(model.DockerBuild{
   268  		Dockerfile: `
   269  FROM sancho-base
   270  ADD . .
   271  RUN go install github.com/windmilleng/sancho
   272  ENTRYPOINT /go/bin/sancho
   273  `,
   274  		BuildPath: fixture.JoinPath("sancho"),
   275  	}).WithDependencyIDs([]model.TargetID{baseImage.ID()})
   276  
   277  	return manifestbuilder.New(fixture, "sancho").
   278  		WithK8sYAML(SanchoYAML).
   279  		WithImageTargets(baseImage, srcImage).
   280  		WithLiveUpdateAtIndex(lu, 1).
   281  		Build()
   282  }
   283  
   284  func NewSanchoLiveUpdateMultiStageManifest(fixture Fixture) model.Manifest {
   285  	baseImage := model.NewImageTarget(SanchoBaseRef).WithBuildDetails(model.DockerBuild{
   286  		Dockerfile: `FROM golang:1.10`,
   287  		BuildPath:  fixture.Path(),
   288  	})
   289  
   290  	srcImage := NewSanchoLiveUpdateImageTarget(fixture)
   291  	dbInfo := srcImage.DockerBuildInfo()
   292  	dbInfo.Dockerfile = `FROM sancho-base`
   293  
   294  	srcImage = srcImage.
   295  		WithBuildDetails(dbInfo).
   296  		WithDependencyIDs([]model.TargetID{baseImage.ID()})
   297  
   298  	kTarget := model.K8sTarget{YAML: SanchoYAML}.
   299  		WithDependencyIDs([]model.TargetID{srcImage.ID()})
   300  
   301  	return model.Manifest{Name: "sancho"}.
   302  		WithImageTargets([]model.ImageTarget{baseImage, srcImage}).
   303  		WithDeployTarget(kTarget)
   304  }
   305  
   306  func NewManifestsWithCommonAncestor(fixture Fixture) (model.Manifest, model.Manifest) {
   307  	refCommon := container.MustParseSelector("gcr.io/common")
   308  	ref1 := container.MustParseSelector("gcr.io/image-1")
   309  	ref2 := container.MustParseSelector("gcr.io/image-2")
   310  
   311  	fixture.MkdirAll("common")
   312  	fixture.MkdirAll("image-1")
   313  	fixture.MkdirAll("image-2")
   314  
   315  	targetCommon := model.NewImageTarget(refCommon).WithBuildDetails(model.DockerBuild{
   316  		Dockerfile: `FROM golang:1.10`,
   317  		BuildPath:  fixture.JoinPath("common"),
   318  	})
   319  	target1 := model.NewImageTarget(ref1).WithBuildDetails(model.DockerBuild{
   320  		Dockerfile: `FROM ` + refCommon.String(),
   321  		BuildPath:  fixture.JoinPath("image-1"),
   322  	})
   323  	target2 := model.NewImageTarget(ref2).WithBuildDetails(model.DockerBuild{
   324  		Dockerfile: `FROM ` + refCommon.String(),
   325  		BuildPath:  fixture.JoinPath("image-2"),
   326  	})
   327  
   328  	m1 := manifestbuilder.New(fixture, "image-1").
   329  		WithK8sYAML(testyaml.Deployment("image-1", ref1.String())).
   330  		WithImageTargets(targetCommon, target1).
   331  		Build()
   332  	m2 := manifestbuilder.New(fixture, "image-2").
   333  		WithK8sYAML(testyaml.Deployment("image-2", ref2.String())).
   334  		WithImageTargets(targetCommon, target2).
   335  		Build()
   336  	return m1, m2
   337  }
   338  
   339  func assembleLiveUpdate(syncs []model.LiveUpdateSyncStep, runs []model.LiveUpdateRunStep, shouldRestart bool, fallBackOn []string, f Fixture) model.LiveUpdate {
   340  	var steps []model.LiveUpdateStep
   341  	if len(fallBackOn) > 0 {
   342  		steps = append(steps, model.LiveUpdateFallBackOnStep{Files: fallBackOn})
   343  	}
   344  	for _, sync := range syncs {
   345  		steps = append(steps, sync)
   346  	}
   347  	for _, run := range runs {
   348  		steps = append(steps, run)
   349  	}
   350  	if shouldRestart {
   351  		steps = append(steps, model.LiveUpdateRestartContainerStep{})
   352  	}
   353  	lu, err := model.NewLiveUpdate(steps, f.Path())
   354  	if err != nil {
   355  		f.T().Fatal(err)
   356  	}
   357  	return lu
   358  }
   359  
   360  func imageTargetWithLiveUpdate(i model.ImageTarget, lu model.LiveUpdate) model.ImageTarget {
   361  	db := i.DockerBuildInfo()
   362  	db.LiveUpdate = lu
   363  	return i.WithBuildDetails(db)
   364  }