component/provision: Make components purgable

This commit is contained in:
Tom Wiesing 2022-10-04 13:27:55 +02:00
parent 845e927117
commit 4358320433
No known key found for this signature in database
5 changed files with 46 additions and 31 deletions

View file

@ -75,38 +75,21 @@ func (p purge) Run(context wisski_distillery.Context) error {
context.EPrintln(err) context.EPrintln(err)
} }
// remove the triplestore // purge all the instance specific resources
ts := dis.Triplestore() if err := logging.LogOperation(func() error {
logging.LogOperation(func() error { domain := instance.Domain()
logging.LogMessage(context.IOStream, "Removing user %s", instance.GraphDBUsername) for _, pc := range dis.Provisionable() {
if err := ts.PurgeUser(instance.GraphDBUsername); err != nil { logging.LogMessage(context.IOStream, "Purging %s resources", pc.Name())
context.EPrintln(err) err := pc.Purge(instance.Instance, domain)
} if err != nil {
return err
logging.LogMessage(context.IOStream, "Removing repository %s", instance.GraphDBRepository) }
if err := ts.PurgeRepo(instance.GraphDBRepository); err != nil {
context.EPrintln(err)
} }
return nil return nil
}, context.IOStream, "Removing from Triplestore") }, context.IOStream, "Purging instance-specific resources"); err != nil {
return errProvisionGeneric.WithMessageF(slug, err)
// remove the sql }
logging.LogOperation(func() error {
sql := dis.SQL()
logging.LogMessage(context.IOStream, "Removing user %s", instance.SqlUsername)
if err := sql.PurgeUser(instance.SqlUsername); err != nil {
context.EPrintln(err)
}
logging.LogMessage(context.IOStream, "Removing database %s", instance.SqlDatabase)
if err := sql.PurgeDatabase(instance.SqlDatabase); err != nil {
context.EPrintln(err)
}
return nil
}, context.IOStream, "Removing from SQL")
// remove from bookkeeping // remove from bookkeeping
logging.LogMessage(context.IOStream, "Removing instance from bookkeeping") logging.LogMessage(context.IOStream, "Removing instance from bookkeeping")

View file

@ -4,11 +4,15 @@ import (
"github.com/FAU-CDI/wisski-distillery/internal/models" "github.com/FAU-CDI/wisski-distillery/internal/models"
) )
// Provisionable represents a component with a Provision method. // Provisionable represents a component with a Provision and a Purge method.
type Provisionable interface { type Provisionable interface {
Component Component
// Provision provisions resources specific to the provided instance. // Provision provisions resources specific to the provided instance.
// Domain holds the full (unique) domain name of the given instance. // Domain holds the full (unique) domain name of the given instance.
Provision(instance models.Instance, domain string) error Provision(instance models.Instance, domain string) error
// Purge purges resources specific to the provided instance.
// Domain holds the full (unique) domain name of the given instance.
Purge(instance models.Instance, domain string) error
} }

View file

@ -4,17 +4,26 @@ import (
"errors" "errors"
"github.com/FAU-CDI/wisski-distillery/internal/models" "github.com/FAU-CDI/wisski-distillery/internal/models"
"github.com/FAU-CDI/wisski-distillery/pkg/errorx"
"github.com/FAU-CDI/wisski-distillery/pkg/sqle" "github.com/FAU-CDI/wisski-distillery/pkg/sqle"
) )
var errProvisionInvalidDatabaseParams = errors.New("Provision: Invalid parameters") var errProvisionInvalidDatabaseParams = errors.New("Provision: Invalid parameters")
var errProvisionInvalidGrant = errors.New("Provision: Grant failed") var errProvisionInvalidGrant = errors.New("Provision: Grant failed")
// ProvisionInstance provisions sql-specific resource for the given instance // Provision provisions sql-specific resource for the given instance
func (sql *SQL) Provision(instance models.Instance, domain string) error { func (sql *SQL) Provision(instance models.Instance, domain string) error {
return sql.CreateDatabase(instance.SqlDatabase, instance.SqlUsername, instance.SqlPassword) return sql.CreateDatabase(instance.SqlDatabase, instance.SqlUsername, instance.SqlPassword)
} }
// Purge purges sql-specific resources for the given instance
func (sql *SQL) Purge(instance models.Instance, domain string) error {
return errorx.First(
sql.PurgeDatabase(instance.SqlDatabase),
sql.PurgeUser(instance.SqlUsername),
)
}
// CreateDatabase creates a new database with the given name. // CreateDatabase creates a new database with the given name.
// It then generates a new user, with the name 'user' and the password 'password', that is then granted access to this database. // It then generates a new user, with the name 'user' and the password 'password', that is then granted access to this database.
// //

View file

@ -7,6 +7,7 @@ import (
_ "embed" _ "embed"
"github.com/FAU-CDI/wisski-distillery/internal/models" "github.com/FAU-CDI/wisski-distillery/internal/models"
"github.com/FAU-CDI/wisski-distillery/pkg/errorx"
"github.com/FAU-CDI/wisski-distillery/pkg/unpack" "github.com/FAU-CDI/wisski-distillery/pkg/unpack"
"github.com/tkw1536/goprogram/exit" "github.com/tkw1536/goprogram/exit"
) )
@ -23,6 +24,13 @@ func (ts *Triplestore) Provision(instance models.Instance, domain string) error
return ts.CreateRepository(instance.GraphDBRepository, domain, instance.GraphDBUsername, instance.GraphDBPassword) return ts.CreateRepository(instance.GraphDBRepository, domain, instance.GraphDBUsername, instance.GraphDBPassword)
} }
func (ts *Triplestore) Purge(instance models.Instance, domain string) error {
return errorx.First(
ts.PurgeRepo(instance.GraphDBRepository),
ts.PurgeUser(instance.GraphDBUsername),
)
}
func (ts *Triplestore) CreateRepository(name, domain, user, password string) error { func (ts *Triplestore) CreateRepository(name, domain, user, password string) error {
if err := ts.Wait(); err != nil { if err := ts.Wait(); err != nil {
return err return err

11
pkg/errorx/errorx.go Normal file
View file

@ -0,0 +1,11 @@
package errorx
// First returns the first non-nil error, or nil otherwise.
func First(errors ...error) error {
for _, err := range errors {
if err != nil {
return err
}
}
return nil
}