func (s *S) TestUnbindUnit(c *gocheck.C) { called := false ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true w.WriteHeader(http.StatusNoContent) })) 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}, Apps: []string{"painkiller"}, } 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) err = instance.UnbindUnit(a.GetUnits()[0]) c.Assert(err, gocheck.IsNil) c.Assert(called, gocheck.Equals, true) }
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 }