func (s *ProvisionSuite) TestGrantServiceAccessToTeam(c *check.C) { t := &auth.Team{Name: "blaaaa"} s.conn.Teams().Insert(t) defer s.conn.Teams().Remove(bson.M{"name": t.Name}) se := service.Service{Name: "my_service", OwnerTeams: []string{s.team.Name}} err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/%s/team/%s", se.Name, t.Name) request, err := http.NewRequest("PUT", url, nil) c.Assert(err, check.IsNil) reqAuth := "bearer " + s.token.GetValue() request.Header.Set("Authorization", reqAuth) recorder := httptest.NewRecorder() m := RunServer(true) m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusOK) err = se.Get() c.Assert(err, check.IsNil) c.Assert(*t, HasAccessTo, se) action := rectest.Action{ Action: "grant-service-access", User: s.user.Email, Extra: []interface{}{"service=" + se.Name, "team=" + t.Name}, } c.Assert(action, rectest.IsRecorded) }
func (s *S) TestUnbindRemovesAppFromServiceInstance(c *gocheck.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 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}) err = instance.UnbindApp(&a) c.Assert(err, gocheck.IsNil) s.conn.ServiceInstances().Find(bson.M{"name": instance.Name}).One(&instance) c.Assert(instance.Apps, gocheck.DeepEquals, []string{}) }
func (s *ProvisionSuite) TestUpdateHandlerShouldUpdateTheServiceWithDataFromManifest(c *gocheck.C) { service := service.Service{ Name: "mysqlapi", Endpoint: map[string]string{"production": "sqlapi.com"}, OwnerTeams: []string{s.team.Name}, Password: "******", } err := service.Create() c.Assert(err, gocheck.IsNil) defer s.conn.Services().Remove(bson.M{"_id": service.Name}) p, err := filepath.Abs("testdata/manifest.yml") manifest, err := ioutil.ReadFile(p) c.Assert(err, gocheck.IsNil) request, err := http.NewRequest("PUT", "/services", bytes.NewBuffer(manifest)) c.Assert(err, gocheck.IsNil) recorder := httptest.NewRecorder() err = serviceUpdate(recorder, request, s.token) c.Assert(err, gocheck.IsNil) c.Assert(recorder.Code, gocheck.Equals, http.StatusNoContent) err = s.conn.Services().Find(bson.M{"_id": service.Name}).One(&service) c.Assert(err, gocheck.IsNil) c.Assert(service.Endpoint["production"], gocheck.Equals, "mysqlapi.com") c.Assert(service.Password, gocheck.Equals, "yyyy") endpoints := map[string]string{"production": "mysqlapi.com", "test": "localhost:8000"} action := testing.Action{ Action: "update-service", User: s.user.Email, Extra: []interface{}{service.Name, endpoints}, } c.Assert(action, testing.IsRecorded) }
func (s *ConsumptionSuite) TestCreateInstanceHandlerReturnsErrorWhenUserCannotUseService(c *gocheck.C) { service := service.Service{Name: "mysql", IsRestricted: true} service.Create() recorder, request := makeRequestToCreateInstanceHandler(c) err := createServiceInstance(recorder, request, s.token) c.Assert(err, gocheck.ErrorMatches, "^This user does not have access to this service$") }
func (s *ConsumptionSuite) TestCreateInstanceHandlerSavesServiceInstanceInDb(c *gocheck.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"DATABASE_HOST":"localhost"}`)) })) defer ts.Close() se := service.Service{ Name: "mysql", Teams: []string{s.team.Name}, Endpoint: map[string]string{"production": ts.URL}, } se.Create() defer s.conn.Services().Remove(bson.M{"_id": se.Name}) recorder, request := makeRequestToCreateInstanceHandler(c) err := createServiceInstance(recorder, request, s.token) c.Assert(err, gocheck.IsNil) var si service.ServiceInstance err = s.conn.ServiceInstances().Find(bson.M{"name": "brainSQL", "service_name": "mysql"}).One(&si) c.Assert(err, gocheck.IsNil) s.conn.ServiceInstances().Update(bson.M{"name": si.Name}, si) c.Assert(si.Name, gocheck.Equals, "brainSQL") c.Assert(si.ServiceName, gocheck.Equals, "mysql") action := testing.Action{ Action: "create-service-instance", User: s.user.Email, Extra: []interface{}{`{"name":"brainSQL","service_name":"mysql"}`}, } c.Assert(action, testing.IsRecorded) }
func (s *ConsumptionSuite) TestCreateInstanceHandlerSavesAllTeamsThatTheGivenUserIsMemberAndHasAccessToTheServiceInTheInstance(c *gocheck.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"DATABASE_HOST":"localhost"}`)) })) defer ts.Close() t := auth.Team{Name: "judaspriest", Users: []string{s.user.Email}} err := s.conn.Teams().Insert(t) defer s.conn.Teams().Remove(bson.M{"name": t.Name}) srv := service.Service{Name: "mysql", Teams: []string{s.team.Name}, IsRestricted: true, Endpoint: map[string]string{"production": ts.URL}} err = srv.Create() c.Assert(err, gocheck.IsNil) params := map[string]string{ "name": "brainSQL", "service_name": "mysql", "owner": s.team.Name, } recorder, request := makeRequestToCreateInstanceHandler(params, c) err = createServiceInstance(recorder, request, s.token) c.Assert(err, gocheck.IsNil) var si service.ServiceInstance err = s.conn.ServiceInstances().Find(bson.M{"name": "brainSQL"}).One(&si) c.Assert(err, gocheck.IsNil) s.conn.ServiceInstances().Update(bson.M{"name": si.Name}, si) c.Assert(si.Teams, gocheck.DeepEquals, []string{s.team.Name}) }
func (s *S) TestDestroyShouldUnbindAppFromInstance(c *gocheck.C) { h := testHandler{} tsg := testing.StartGandalfTestServer(&h) defer tsg.Close() ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) })) defer ts.Close() srvc := service.Service{Name: "my", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, gocheck.IsNil) defer s.conn.Services().Remove(bson.M{"_id": srvc.Name}) instance := service.ServiceInstance{Name: "MyInstance", Apps: []string{"whichapp"}, ServiceName: srvc.Name} err = instance.Create() c.Assert(err, gocheck.IsNil) defer s.conn.ServiceInstances().Remove(bson.M{"_id": instance.Name}) a := App{ Name: "whichapp", Platform: "python", Teams: []string{}, } err = CreateApp(&a, s.user) c.Assert(err, gocheck.IsNil) app, err := GetByName(a.Name) c.Assert(err, gocheck.IsNil) err = Delete(app) c.Assert(err, gocheck.IsNil) n, err := s.conn.ServiceInstances().Find(bson.M{"apps": bson.M{"$in": []string{a.Name}}}).Count() c.Assert(err, gocheck.IsNil) c.Assert(n, gocheck.Equals, 0) }
func (s *ConsumptionSuite) TestServicesInstancesHandler(c *gocheck.C) { srv := service.Service{Name: "redis", Teams: []string{s.team.Name}} err := srv.Create() c.Assert(err, gocheck.IsNil) instance := service.ServiceInstance{ Name: "redis-globo", ServiceName: "redis", Apps: []string{"globo"}, Teams: []string{s.team.Name}, } err = instance.Create() c.Assert(err, gocheck.IsNil) request, err := http.NewRequest("GET", "/services/instances", nil) c.Assert(err, gocheck.IsNil) recorder := httptest.NewRecorder() err = serviceInstances(recorder, request, s.token) c.Assert(err, gocheck.IsNil) body, err := ioutil.ReadAll(recorder.Body) c.Assert(err, gocheck.IsNil) var instances []service.ServiceModel err = json.Unmarshal(body, &instances) c.Assert(err, gocheck.IsNil) expected := []service.ServiceModel{ {Service: "redis", Instances: []string{"redis-globo"}}, } c.Assert(instances, gocheck.DeepEquals, expected) action := testing.Action{Action: "list-service-instances", User: s.user.Email} c.Assert(action, testing.IsRecorded) }
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 *S) TestHandleBindServiceMessage(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{"_id": "my-mysql"}) a := App{ Name: "nemesis", Units: []Unit{ { Name: "i-00800", State: "started", Machine: 19, }, }, } err = s.conn.Apps().Insert(a) c.Assert(err, gocheck.IsNil) defer s.conn.Apps().Remove(bson.M{"name": a.Name}) err = instance.AddApp(a.Name) c.Assert(err, gocheck.IsNil) err = s.conn.ServiceInstances().Update(bson.M{"name": instance.Name}, instance) c.Assert(err, gocheck.IsNil) message := queue.Message{Action: BindService, Args: []string{a.Name, a.Units[0].Name}} handle(&message) c.Assert(called, gocheck.Equals, true) }
func (s *ConsumptionSuite) TestGetServiceOrErrorShoudNotReturnErrorWhenServiceIsNotRestricted(c *gocheck.C) { srv := service.Service{Name: "foo"} err := srv.Create() c.Assert(err, gocheck.IsNil) _, err = getServiceOrError("foo", s.user) c.Assert(err, gocheck.IsNil) }
func (s *ProvisionSuite) TestGrantServiceAccessToTeam(c *check.C) { t := &auth.Team{Name: "blaaaa"} s.conn.Teams().Insert(t) defer s.conn.Teams().Remove(bson.M{"name": t.Name}) se := service.Service{Name: "my_service", OwnerTeams: []string{s.team.Name}} err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) u := fmt.Sprintf("/services/%s/team/%s", se.Name, t.Name) recorder, request := s.makeRequest("PUT", u, "", c) s.m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusOK) err = se.Get() c.Assert(err, check.IsNil) c.Assert(*t, HasAccessTo, se) c.Assert(eventtest.EventDesc{ Target: serviceTarget("my_service"), Owner: s.token.GetUserName(), Kind: "service.update.grant-access", StartCustomData: []map[string]interface{}{ {"name": ":service", "value": "my_service"}, {"name": ":team", "value": t.Name}, }, }, eventtest.HasEvent) }
func (s *ConsumptionSuite) TestServiceInstanceStatusHandler(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) w.Write([]byte(`Service instance "my_nosql" is up`)) })) defer ts.Close() srv := service.Service{Name: "mongodb", OwnerTeams: []string{s.team.Name}, Endpoint: map[string]string{"production": ts.URL}} err := srv.Create() c.Assert(err, check.IsNil) defer srv.Delete() si := service.ServiceInstance{Name: "my_nosql", ServiceName: srv.Name, Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) defer service.DeleteInstance(&si) recorder, request := makeRequestToStatusHandler("mongodb", "my_nosql", c) err = serviceInstanceStatus(recorder, request, s.token) c.Assert(err, check.IsNil) b, err := ioutil.ReadAll(recorder.Body) c.Assert(string(b), check.Equals, "Service instance \"my_nosql\" is up") action := rectest.Action{ Action: "service-instance-status", User: s.user.Email, Extra: []interface{}{srv.Name, "my_nosql"}, } c.Assert(action, rectest.IsRecorded) }
func (s *ConsumptionSuite) TestRemoveServiceInstanceHandler(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) defer ts.Close() se := service.Service{Name: "foo", Endpoint: map[string]string{"production": ts.URL}} err := se.Create() defer s.conn.Services().Remove(bson.M{"_id": se.Name}) c.Assert(err, check.IsNil) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) recorder, request := makeRequestToRemoveInstanceHandler("foo", "foo-instance", c) err = removeServiceInstance(recorder, request, s.token) c.Assert(err, check.IsNil) b, err := ioutil.ReadAll(recorder.Body) c.Assert(err, check.IsNil) var msg io.SimpleJsonMessage json.Unmarshal(b, &msg) c.Assert(msg.Message, check.Equals, `service instance successfuly removed`) n, err := s.conn.ServiceInstances().Find(bson.M{"name": "foo-instance", "service_name": "foo"}).Count() c.Assert(err, check.IsNil) c.Assert(n, check.Equals, 0) action := rectest.Action{ Action: "remove-service-instance", User: s.user.Email, Extra: []interface{}{"foo", "foo-instance"}, } c.Assert(action, rectest.IsRecorded) }
func (s *ProvisionSuite) TestAddDoc(c *check.C) { se := service.Service{Name: "some_service", OwnerTeams: []string{s.team.Name}} se.Create() defer s.conn.Services().Remove(bson.M{"_id": se.Name}) v := url.Values{} v.Set("doc", "doc") recorder, request := s.makeRequest("PUT", "/services/some_service/doc", v.Encode(), c) request.Header.Set("Content-Type", "application/x-www-form-urlencoded") s.m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusOK) query := bson.M{"_id": "some_service"} var serv service.Service err := s.conn.Services().Find(query).One(&serv) c.Assert(err, check.IsNil) c.Assert(serv.Doc, check.Equals, "doc") c.Assert(eventtest.EventDesc{ Target: serviceTarget("some_service"), Owner: s.token.GetUserName(), Kind: "service.update.doc", StartCustomData: []map[string]interface{}{ {"name": ":name", "value": "some_service"}, {"name": "doc", "value": "doc"}, }, }, eventtest.HasEvent) }
func (s *ConsumptionSuite) TestServiceInstanceProxyError(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadGateway) w.Write([]byte("some error")) })) defer ts.Close() se := service.Service{Name: "foo", Endpoint: map[string]string{"production": ts.URL}} err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) defer service.DeleteInstance(&si) url := fmt.Sprintf("/services/%s/proxy/%s?callback=/mypath", si.ServiceName, si.Name) request, err := http.NewRequest("GET", url, nil) c.Assert(err, check.IsNil) reqAuth := "bearer " + s.token.GetValue() request.Header.Set("Authorization", reqAuth) m := RunServer(true) recorder := httptest.NewRecorder() m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusBadGateway) c.Assert(recorder.Body.Bytes(), check.DeepEquals, []byte("some error")) }
func (s *ConsumptionSuite) TestGrantRevokeServiceToTeam(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("{'AA': 2}")) })) defer ts.Close() se := service.Service{Name: "go", Endpoint: map[string]string{"production": ts.URL}} err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) si := service.ServiceInstance{Name: "si-test", ServiceName: "go", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) defer service.DeleteInstance(&si) team := auth.Team{Name: "test"} s.conn.Teams().Insert(team) defer s.conn.Teams().Remove(bson.M{"name": team.Name}) url := fmt.Sprintf("/services/%s/instances/permission/%s/%s?:instance=%s&:team=%s&:service=%s", si.ServiceName, si.Name, team.Name, si.Name, team.Name, si.ServiceName) request, err := http.NewRequest("PUT", url, nil) c.Assert(err, check.IsNil) recorder := httptest.NewRecorder() err = serviceInstanceGrantTeam(recorder, request, s.token) c.Assert(err, check.IsNil) sinst, err := service.GetServiceInstance(si.ServiceName, si.Name) c.Assert(err, check.IsNil) c.Assert(sinst.Teams, check.DeepEquals, []string{s.team.Name, team.Name}) request, err = http.NewRequest("DELETE", url, nil) c.Assert(err, check.IsNil) err = serviceInstanceRevokeTeam(recorder, request, s.token) c.Assert(err, check.IsNil) sinst, err = service.GetServiceInstance(si.ServiceName, si.Name) c.Assert(err, check.IsNil) c.Assert(sinst.Teams, check.DeepEquals, []string{s.team.Name}) }
func (s *ConsumptionSuite) TestServicePlansHandler(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { content := `[{"name": "ignite", "description": "some value"}, {"name": "small", "description": "not space left for you"}]` w.Write([]byte(content)) })) defer ts.Close() srvc := service.Service{Name: "mysql", Endpoint: map[string]string{"production": ts.URL}} err := srvc.Create() c.Assert(err, check.IsNil) defer srvc.Delete() request, err := http.NewRequest("GET", "/services/mysql/plans?:name=mysql", nil) c.Assert(err, check.IsNil) recorder := httptest.NewRecorder() err = servicePlans(recorder, request, s.token) c.Assert(err, check.IsNil) body, err := ioutil.ReadAll(recorder.Body) c.Assert(err, check.IsNil) var plans []service.Plan err = json.Unmarshal(body, &plans) c.Assert(err, check.IsNil) expected := []service.Plan{ {Name: "ignite", Description: "some value"}, {Name: "small", Description: "not space left for you"}, } c.Assert(plans, check.DeepEquals, expected) action := rectest.Action{ Action: "service-plans", User: s.user.Email, Extra: []interface{}{"mysql"}, } c.Assert(action, rectest.IsRecorded) }
func (s *ConsumptionSuite) TestServiceInstanceProxy(c *check.C) { var proxyedRequest *http.Request ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { proxyedRequest = r w.Header().Set("X-Response-Custom", "custom response header") w.WriteHeader(http.StatusCreated) w.Write([]byte("a message")) })) defer ts.Close() se := service.Service{Name: "foo", Endpoint: map[string]string{"production": ts.URL}} err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) defer service.DeleteInstance(&si) url := fmt.Sprintf("/services/%s/proxy/%s?callback=/mypath", si.ServiceName, si.Name) request, err := http.NewRequest("GET", url, nil) reqAuth := "bearer " + s.token.GetValue() request.Header.Set("Authorization", reqAuth) request.Header.Set("X-Custom", "my request header") m := RunServer(true) recorder := httptest.NewRecorder() m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusCreated) c.Assert(recorder.Header().Get("X-Response-Custom"), check.Equals, "custom response header") c.Assert(recorder.Body.String(), check.Equals, "a message") c.Assert(proxyedRequest, check.NotNil) c.Assert(proxyedRequest.Header.Get("X-Custom"), check.Equals, "my request header") c.Assert(proxyedRequest.Header.Get("Authorization"), check.Not(check.Equals), reqAuth) c.Assert(proxyedRequest.URL.String(), check.Equals, "/mypath") }
func (s *ConsumptionSuite) TestGetServiceOrErrorShouldReturnErrorWhenUserHaveNoAccessToService(c *gocheck.C) { srv := service.Service{Name: "foo", IsRestricted: true} err := srv.Create() c.Assert(err, gocheck.IsNil) _, err = getServiceOrError("foo", s.user) c.Assert(err, gocheck.ErrorMatches, "^This user does not have access to this service$") }
func (s *ProvisionSuite) TestServiceUpdate(c *check.C) { service := service.Service{ Name: "mysqlapi", Endpoint: map[string]string{"production": "sqlapi.com"}, OwnerTeams: []string{s.team.Name}, Password: "******", } err := service.Create() c.Assert(err, check.IsNil) v := url.Values{} v.Set("username", "mysqltest") v.Set("password", "yyyy") v.Set("endpoint", "mysqlapi.com") defer s.conn.Services().Remove(bson.M{"_id": service.Name}) recorder, request := s.makeRequest("PUT", "/services/mysqlapi", v.Encode(), c) request.Header.Set("Content-Type", "application/x-www-form-urlencoded") s.m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusOK) err = s.conn.Services().Find(bson.M{"_id": service.Name}).One(&service) c.Assert(err, check.IsNil) c.Assert(service.Endpoint["production"], check.Equals, "mysqlapi.com") c.Assert(service.Password, check.Equals, "yyyy") c.Assert(service.Username, check.Equals, "mysqltest") action := rectest.Action{ Action: "update-service", User: s.user.Email, Extra: []interface{}{service.Name, "mysqlapi.com"}, } c.Assert(action, rectest.IsRecorded) }
func (s *ProvisionSuite) TestServiceUpdate(c *check.C) { service := service.Service{ Name: "mysqlapi", Endpoint: map[string]string{"production": "sqlapi.com"}, OwnerTeams: []string{s.team.Name}, Password: "******", } err := service.Create() c.Assert(err, check.IsNil) v := url.Values{} v.Set("username", "mysqltest") v.Set("password", "yyyy") v.Set("endpoint", "mysqlapi.com") defer s.conn.Services().Remove(bson.M{"_id": service.Name}) recorder, request := s.makeRequest("PUT", "/services/mysqlapi", v.Encode(), c) request.Header.Set("Content-Type", "application/x-www-form-urlencoded") s.m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusOK) err = s.conn.Services().Find(bson.M{"_id": service.Name}).One(&service) c.Assert(err, check.IsNil) c.Assert(service.Endpoint["production"], check.Equals, "mysqlapi.com") c.Assert(service.Password, check.Equals, "yyyy") c.Assert(service.Username, check.Equals, "mysqltest") c.Assert(eventtest.EventDesc{ Target: serviceTarget("mysqlapi"), Owner: s.token.GetUserName(), Kind: "service.update", StartCustomData: []map[string]interface{}{ {"name": "username", "value": "mysqltest"}, {"name": "endpoint", "value": "mysqlapi.com"}, }, }, eventtest.HasEvent) }
func (s *ConsumptionSuite) TestCreateInstanceWithPlan(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"DATABASE_HOST":"localhost"}`)) })) defer ts.Close() se := service.Service{ Name: "mysql", Teams: []string{s.team.Name}, Endpoint: map[string]string{"production": ts.URL}, } se.Create() defer s.conn.Services().Remove(bson.M{"_id": se.Name}) params := map[string]string{ "name": "brainSQL", "service_name": "mysql", "plan": "small", "owner": s.team.Name, } recorder, request := makeRequestToCreateInstanceHandler(params, c) request.Header.Set("Content-Type", "application/json") err := createServiceInstance(recorder, request, s.token) c.Assert(err, check.IsNil) var si service.ServiceInstance err = s.conn.ServiceInstances().Find(bson.M{ "name": "brainSQL", "service_name": "mysql", "plan_name": "small", }).One(&si) c.Assert(err, check.IsNil) s.conn.ServiceInstances().Update(bson.M{"name": si.Name}, si) c.Assert(si.Name, check.Equals, "brainSQL") c.Assert(si.ServiceName, check.Equals, "mysql") c.Assert(si.Teams, check.DeepEquals, []string{s.team.Name}) }
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) }
func (s *ProvisionSuite) TestServiceProxyError(c *check.C) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadGateway) w.Write([]byte("some error")) })) defer ts.Close() se := service.Service{ Name: "foo", Endpoint: map[string]string{"production": ts.URL}, OwnerTeams: []string{s.team.Name}, } err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) url := fmt.Sprintf("/services/proxy/service/%s?callback=/mypath", se.Name) request, err := http.NewRequest("GET", url, nil) c.Assert(err, check.IsNil) reqAuth := "bearer " + s.token.GetValue() request.Header.Set("Authorization", reqAuth) m := RunServer(true) recorder := &closeNotifierResponseRecorder{httptest.NewRecorder()} m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusBadGateway) c.Assert(recorder.Body.String(), check.Equals, "some error") }
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 (s *ProvisionSuite) TestServiceProxyPost(c *check.C) { var ( proxyedRequest *http.Request proxyedBody []byte ) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error proxyedBody, err = ioutil.ReadAll(r.Body) c.Assert(err, check.IsNil) proxyedRequest = r w.Header().Set("X-Response-Custom", "custom response header") w.WriteHeader(http.StatusCreated) w.Write([]byte("a message")) })) defer ts.Close() se := service.Service{ Name: "foo", Endpoint: map[string]string{"production": ts.URL}, OwnerTeams: []string{s.team.Name}, } err := se.Create() c.Assert(err, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": se.Name}) si := service.ServiceInstance{Name: "foo-instance", ServiceName: "foo", Teams: []string{s.team.Name}} err = si.Create() c.Assert(err, check.IsNil) defer service.DeleteInstance(&si, "") url := fmt.Sprintf("/services/proxy/service/%s?callback=/mypath", se.Name) body := strings.NewReader("my=awesome&body=1") request, err := http.NewRequest("POST", url, body) c.Assert(err, check.IsNil) reqAuth := "bearer " + s.token.GetValue() request.Header.Set("Authorization", reqAuth) request.Header.Set("X-Custom", "my request header") request.Header.Set("Content-Type", "application/x-www-form-urlencoded") recorder := &closeNotifierResponseRecorder{httptest.NewRecorder()} s.m.ServeHTTP(recorder, request) c.Assert(recorder.Code, check.Equals, http.StatusCreated) c.Assert(recorder.Header().Get("X-Response-Custom"), check.Equals, "custom response header") c.Assert(recorder.Body.String(), check.Equals, "a message") c.Assert(proxyedRequest, check.NotNil) c.Assert(proxyedRequest.Method, check.Equals, "POST") c.Assert(proxyedRequest.Header.Get("X-Custom"), check.Equals, "my request header") c.Assert(proxyedRequest.Header.Get("Authorization"), check.Not(check.Equals), reqAuth) c.Assert(proxyedRequest.URL.String(), check.Equals, "/mypath") c.Assert(string(proxyedBody), check.Equals, "my=awesome&body=1") c.Assert(eventtest.EventDesc{ Target: serviceTarget("foo"), Owner: s.token.GetUserName(), Kind: "service.update.proxy", StartCustomData: []map[string]interface{}{ {"name": ":service", "value": "foo"}, {"name": "callback", "value": "/mypath"}, {"name": "method", "value": "POST"}, {"name": "my", "value": "awesome"}, {"name": "body", "value": "1"}, }, }, eventtest.HasEvent) }
func getService(name string) (service.Service, error) { s := service.Service{Name: name} err := s.Get() if err != nil { return s, &errors.HTTP{Code: http.StatusNotFound, Message: "Service not found"} } return s, err }
func (s *ConsumptionSuite) TestGetServiceOrError(c *gocheck.C) { srv := service.Service{Name: "foo", Teams: []string{s.team.Name}, IsRestricted: true} err := srv.Create() c.Assert(err, gocheck.IsNil) rSrv, err := getServiceOrError("foo", s.user) c.Assert(err, gocheck.IsNil) c.Assert(rSrv.Name, gocheck.Equals, srv.Name) }
func (s *BindSuite) TestBindCallTheServiceAPIAndSetsEnvironmentVariableReturnedFromTheCall(c *check.C) { fakeProvisioner := app.Provisioner.(*provisiontest.FakeProvisioner) fakeProvisioner.PrepareOutput([]byte("exported")) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 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, check.IsNil) defer s.conn.Services().Remove(bson.M{"_id": "mysql"}) instance := service.ServiceInstance{ Name: "my-mysql", ServiceName: "mysql", Teams: []string{s.team.Name}, } err = instance.Create() c.Assert(err, check.IsNil) 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) err = instance.BindApp(&a, nil) c.Assert(err, check.IsNil) newApp, err := app.GetByName(a.Name) c.Assert(err, check.IsNil) expectedEnv := map[string]bind.EnvVar{ "DATABASE_USER": { Name: "DATABASE_USER", Value: "root", Public: false, InstanceName: instance.Name, }, "DATABASE_PASSWORD": { Name: "DATABASE_PASSWORD", Value: "s3cr3t", Public: false, InstanceName: instance.Name, }, } expectedTsuruServices := map[string][]bind.ServiceInstance{ "mysql": { bind.ServiceInstance{ Name: instance.Name, Envs: map[string]string{"DATABASE_USER": "******", "DATABASE_PASSWORD": "******"}, }, }, } servicesEnv := newApp.Env[app.TsuruServicesEnvVar] var tsuruServices map[string][]bind.ServiceInstance json.Unmarshal([]byte(servicesEnv.Value), &tsuruServices) c.Assert(tsuruServices, check.DeepEquals, expectedTsuruServices) delete(newApp.Env, app.TsuruServicesEnvVar) c.Assert(newApp.Env, check.DeepEquals, expectedEnv) }