func TestEmpire_Set(t *testing.T) { e := empiretest.NewEmpire(t) s := new(mockScheduler) e.Scheduler = s e.ProcfileExtractor = empiretest.ExtractProcfile(procfile.ExtendedProcfile{ "web": procfile.Process{ Command: []string{"./bin/web"}, }, }) user := &empire.User{Name: "ejholmes"} // Create an app app, err := e.Create(context.Background(), empire.CreateOpts{ User: user, Name: "acme-inc", }) assert.NoError(t, err) // Add some environment variables to it. prod := "production" _, err = e.Set(context.Background(), empire.SetOpts{ User: user, App: app, Vars: empire.Vars{ "RAILS_ENV": &prod, }, }) assert.NoError(t, err) // Deploy a new image to the app. img := image.Image{Repository: "remind101/acme-inc"} s.On("Submit", &scheduler.App{ ID: app.ID, Name: "acme-inc", Release: "v1", Env: map[string]string{ "EMPIRE_APPID": app.ID, "EMPIRE_APPNAME": "acme-inc", "EMPIRE_RELEASE": "v1", "RAILS_ENV": "production", }, Labels: map[string]string{ "empire.app.name": "acme-inc", "empire.app.id": app.ID, "empire.app.release": "v1", }, Processes: []*scheduler.Process{ { Type: "web", Image: img, Command: []string{"./bin/web"}, Exposure: &scheduler.Exposure{ Type: &scheduler.HTTPExposure{}, }, Instances: 1, MemoryLimit: 536870912, CPUShares: 256, Nproc: 256, Env: map[string]string{ "EMPIRE_PROCESS": "web", "EMPIRE_PROCESS_SCALE": "1", "SOURCE": "acme-inc.web.v1", }, Labels: map[string]string{ "empire.app.process": "web", }, }, }, }).Once().Return(nil) _, err = e.Deploy(context.Background(), empire.DeployOpts{ App: app, User: user, Output: empire.NewDeploymentStream(ioutil.Discard), Image: img, }) assert.NoError(t, err) // Remove the environment variable s.On("Submit", &scheduler.App{ ID: app.ID, Name: "acme-inc", Release: "v2", Env: map[string]string{ "EMPIRE_APPID": app.ID, "EMPIRE_APPNAME": "acme-inc", "EMPIRE_RELEASE": "v2", }, Labels: map[string]string{ "empire.app.name": "acme-inc", "empire.app.id": app.ID, "empire.app.release": "v2", }, Processes: []*scheduler.Process{ { Type: "web", Image: img, Command: []string{"./bin/web"}, Exposure: &scheduler.Exposure{ Type: &scheduler.HTTPExposure{}, }, Instances: 1, MemoryLimit: 536870912, CPUShares: 256, Nproc: 256, Env: map[string]string{ "EMPIRE_PROCESS": "web", "EMPIRE_PROCESS_SCALE": "1", "SOURCE": "acme-inc.web.v2", }, Labels: map[string]string{ "empire.app.process": "web", }, }, }, }).Once().Return(nil) _, err = e.Set(context.Background(), empire.SetOpts{ User: user, App: app, Vars: empire.Vars{ "RAILS_ENV": nil, }, }) assert.NoError(t, err) s.AssertExpectations(t) }
func TestEmpire_Deploy_Concurrent(t *testing.T) { e := empiretest.NewEmpire(t) s := new(mockScheduler) e.Scheduler = scheduler.NewFakeScheduler() e.ProcfileExtractor = empiretest.ExtractProcfile(procfile.ExtendedProcfile{ "web": procfile.Process{ Command: []string{"./bin/web"}, }, }) user := &empire.User{Name: "ejholmes"} // Create the first release for this app. r, err := e.Deploy(context.Background(), empire.DeployOpts{ User: user, Output: empire.NewDeploymentStream(ioutil.Discard), Image: image.Image{Repository: "remind101/acme-inc"}, }) assert.NoError(t, err) assert.Equal(t, 1, r.Version) // We'll use the procfile extractor to synchronize two concurrent // deployments. v2Started, v3Started := make(chan struct{}), make(chan struct{}) e.ProcfileExtractor = empire.ProcfileExtractorFunc(func(ctx context.Context, img image.Image, w io.Writer) ([]byte, error) { switch img.Tag { case "v2": close(v2Started) <-v3Started case "v3": close(v3Started) } return procfile.Marshal(procfile.ExtendedProcfile{ "web": procfile.Process{ Command: []string{"./bin/web"}, }, }) }) v2Done := make(chan struct{}) go func() { r, err := e.Deploy(context.Background(), empire.DeployOpts{ User: user, Output: empire.NewDeploymentStream(ioutil.Discard), Image: image.Image{Repository: "remind101/acme-inc", Tag: "v2"}, }) assert.NoError(t, err) assert.Equal(t, 2, r.Version) close(v2Done) }() <-v2Started r, err = e.Deploy(context.Background(), empire.DeployOpts{ User: user, Output: empire.NewDeploymentStream(ioutil.Discard), Image: image.Image{Repository: "remind101/acme-inc", Tag: "v3"}, }) assert.NoError(t, err) assert.Equal(t, 3, r.Version) <-v2Done s.AssertExpectations(t) }