func (app *App) BindUnit(unit *provision.Unit) error { instances, err := app.serviceInstances() if err != nil { return err } var i int var instance service.ServiceInstance for i, instance = range instances { err = instance.BindUnit(app, unit) if err != nil { log.Errorf("Error binding the unit %s with the service instance %s: %s", unit.ID, instance.Name, err) break } } if err != nil { for j := i - 1; j >= 0; j-- { instance = instances[j] rollbackErr := instance.UnbindUnit(app, unit) if rollbackErr != nil { log.Errorf("Error unbinding unit %s with the service instance %s during rollback: %s", unit.ID, instance.Name, rollbackErr) } } } return err }
func (s *S) TestBindUnit(c *gocheck.C) { called := false ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true w.Write([]byte(`{"DATABASE_USER":"******","DATABASE_PASSWORD":"******"}`)) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, gocheck.IsNil) defer s.conn.Services().Remove(bson.M{"_id": "mysql"}) instance := service.ServiceInstance{Name: "my-mysql", ServiceName: "mysql", Teams: []string{s.team.Name}} instance.Create() defer s.conn.ServiceInstances().Remove(bson.M{"name": "my-mysql"}) a, err := createTestApp(s.conn, "painkiller", "", []string{s.team.Name}) c.Assert(err, gocheck.IsNil) defer s.conn.Apps().Remove(bson.M{"name": a.Name}) app.Provisioner.Provision(&a) defer app.Provisioner.Destroy(&a) envs, err := instance.BindUnit(&a, a.GetUnits()[0]) c.Assert(err, gocheck.IsNil) c.Assert(called, gocheck.Equals, true) expectedEnvs := map[string]string{ "DATABASE_USER": "******", "DATABASE_PASSWORD": "******", } c.Assert(envs, gocheck.DeepEquals, expectedEnvs) }
func (s *BindSuite) TestBindUnit(c *check.C) { var called bool ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": "mysql"}) instance := service.ServiceInstance{Name: "my-mysql", ServiceName: "mysql", Teams: []string{s.team.Name}} instance.Create() defer s.conn.ServiceInstances().Remove(bson.M{"name": "my-mysql"}) a, err := createTestApp(s.conn, "painkiller", "", []string{s.team.Name}) c.Assert(err, check.IsNil) defer s.conn.Apps().Remove(bson.M{"name": a.Name}) app.Provisioner.Provision(&a) defer app.Provisioner.Destroy(&a) app.Provisioner.AddUnits(&a, 1, "web", nil) units, err := a.GetUnits() c.Assert(err, check.IsNil) err = instance.BindUnit(&a, units[0]) c.Assert(err, check.IsNil) c.Assert(called, check.Equals, true) }