Skip to content

Commit

Permalink
app: add service validation when app pool changes
Browse files Browse the repository at this point in the history
  • Loading branch information
ggarnier committed Aug 31, 2018
1 parent 6586e4c commit 48257b3
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 9 deletions.
35 changes: 28 additions & 7 deletions app/app.go
Expand Up @@ -1166,6 +1166,20 @@ func (app *App) validatePool() error {
if err != nil {
return err
}
instances, err := service.GetServiceInstancesBoundToApp(app.Name)
if err != nil {
return err
}
if len(instances) > 0 {
serviceNames := make([]string, len(instances))
for i, instance := range instances {
serviceNames[i] = instance.ServiceName
}
err = app.ValidateService(serviceNames...)
if err != nil {
return err
}
}
return pool.ValidateRouters(app.GetRouters())
}

Expand All @@ -1188,22 +1202,29 @@ func (app *App) validateTeamOwner(p *pool.Pool) error {
return &tsuruErrors.ValidationError{Message: msg}
}

func (app *App) ValidateService(service string) error {
func (app *App) ValidateService(services ...string) error {
pool, err := pool.GetPoolByName(app.Pool)
if err != nil {
return err
}
services, err := pool.GetServices()
poolServices, err := pool.GetServices()
if err != nil {
return err
}
for _, v := range services {
if v == service {
return nil
for _, svc := range services {
valid := false
for _, v := range poolServices {
if v == svc {
valid = true
break
}
}
if !valid {
msg := fmt.Sprintf("service %q is not available for pool %q. Available services are: %q", svc, pool.Name, strings.Join(poolServices, ", "))
return &tsuruErrors.ValidationError{Message: msg}
}
}
msg := fmt.Sprintf("service %q is not available for pool %q. Available services are: %q", service, pool.Name, strings.Join(services, ", "))
return &tsuruErrors.ValidationError{Message: msg}
return nil
}

// InstanceEnvs returns a map of environment variables that belongs to the
Expand Down
49 changes: 47 additions & 2 deletions app/app_test.go
Expand Up @@ -828,11 +828,12 @@ func (s *S) TestRemoveUnits(c *check.C) {
}
instance := service.ServiceInstance{
Name: "my-inst",
ServiceName: "mysql",
ServiceName: srvc.Name,
Teams: []string{s.team.Name},
Apps: []string{app.Name},
}
s.conn.ServiceInstances().Insert(instance)
err = s.conn.ServiceInstances().Insert(instance)
c.Assert(err, check.IsNil)
err = CreateApp(&app, s.user)
c.Assert(err, check.IsNil)
err = app.AddUnits(2, "web", nil)
Expand Down Expand Up @@ -5125,6 +5126,50 @@ func (s *S) TestUpdateAppUpdatableProvisioner(c *check.C) {
c.Assert(updatedApp.(*App).Description, check.Equals, "updated description")
}

func (s *S) TestUpdateAppPoolWithInvalidConstraint(c *check.C) {
p1 := provisiontest.NewFakeProvisioner()
p1.Name = "fake1"
provision.Register("fake1", func() (provision.Provisioner, error) {
return p1, nil
})
app := App{Name: "test", TeamOwner: s.team.Name, Pool: s.Pool}
err := CreateApp(&app, s.user)
c.Assert(err, check.IsNil)

server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
}))
defer server.Close()
svc := service.Service{
Name: "mysql",
Endpoint: map[string]string{"production": server.URL},
Password: "abcde",
OwnerTeams: []string{s.team.Name},
}
err = service.Create(svc)
c.Assert(err, check.IsNil)
si1 := service.ServiceInstance{
Name: "mydb",
ServiceName: svc.Name,
Apps: []string{app.Name},
}
err = s.conn.ServiceInstances().Insert(si1)
c.Assert(err, check.IsNil)

optsPool2 := pool.AddPoolOptions{Name: "pool2", Provisioner: p1.Name, Public: true}
err = pool.AddPool(optsPool2)
c.Assert(err, check.IsNil)
pool.SetPoolConstraint(&pool.PoolConstraint{
PoolExpr: optsPool2.Name,
Field: pool.ConstraintTypeService,
Values: []string{
svc.Name,
},
Blacklist: true,
})
err = app.Update(App{Pool: optsPool2.Name}, nil)
c.Assert(err, check.NotNil)
}

func (s *S) TestGetUUID(c *check.C) {
app := App{Name: "test", TeamOwner: s.team.Name, Pool: s.Pool}
err := CreateApp(&app, s.user)
Expand Down

0 comments on commit 48257b3

Please sign in to comment.