From a5d9b1a386b0219c8b3ad95be5913fa70ec12b66 Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Tue, 20 Sep 2022 19:45:32 +0200 Subject: [PATCH] provision: Dynamically find components to provision --- cmd/provision.go | 28 ++++++++------------- internal/component/provision.go | 14 +++++++++++ internal/component/sql/provision.go | 10 ++++++-- internal/component/triplestore/provision.go | 7 +++++- internal/wisski/component.go | 9 +++++-- 5 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 internal/component/provision.go diff --git a/cmd/provision.go b/cmd/provision.go index ff54a71..4cfbdb6 100644 --- a/cmd/provision.go +++ b/cmd/provision.go @@ -61,7 +61,7 @@ func (p provision) Run(context wisski_distillery.Context) error { return errProvisionAlreadyExists.WithMessageF(slug) } - // Store in bookkeeping + // Store in the instances table! if err := logging.LogOperation(func() error { if err := instance.Save(); err != nil { return errProvisionGeneric.WithMessageF(slug, err) @@ -72,26 +72,20 @@ func (p provision) Run(context wisski_distillery.Context) error { return err } - // create the sql + // create all the resources! if err := logging.LogOperation(func() error { - if err := dis.SQL().Provision(instance.SqlDatabase, instance.SqlUsername, instance.SqlPassword); err != nil { - return errProvisionGeneric.WithMessageF(slug, err) + domain := instance.Domain() + for _, pc := range dis.Provisionable() { + logging.LogMessage(context.IOStream, "Provisioning %s resources", pc.Name()) + err := pc.Provision(instance.Instance, domain) + if err != nil { + return err + } } return nil - }, context.IOStream, "Provisioning SQL Database"); err != nil { - return err - } - - // create the triplestore - if err := logging.LogOperation(func() error { - if err := dis.Triplestore().Provision(instance.GraphDBRepository, instance.Domain(), instance.GraphDBUsername, instance.GraphDBPassword); err != nil { - return errProvisionGeneric.WithMessageF(slug, err) - } - - return nil - }, context.IOStream, "Provisioning Triplestore"); err != nil { - return err + }, context.IOStream, "Provisioning instance-specific resources"); err != nil { + return errProvisionGeneric.WithMessageF(slug, err) } // run the provision script diff --git a/internal/component/provision.go b/internal/component/provision.go new file mode 100644 index 0000000..dd42145 --- /dev/null +++ b/internal/component/provision.go @@ -0,0 +1,14 @@ +package component + +import ( + "github.com/FAU-CDI/wisski-distillery/internal/models" +) + +// Provisionable represents a component with a Provision method. +type Provisionable interface { + Component + + // Provision provisions resources specific to the provided instance. + // Domain holds the full (unique) domain name of the given instance. + Provision(instance models.Instance, domain string) error +} diff --git a/internal/component/sql/provision.go b/internal/component/sql/provision.go index 912d21b..b0dc4e4 100644 --- a/internal/component/sql/provision.go +++ b/internal/component/sql/provision.go @@ -3,17 +3,23 @@ package sql import ( "errors" + "github.com/FAU-CDI/wisski-distillery/internal/models" "github.com/FAU-CDI/wisski-distillery/pkg/sqle" ) var errProvisionInvalidDatabaseParams = errors.New("Provision: Invalid parameters") var errProvisionInvalidGrant = errors.New("Provision: Grant failed") -// Provision creates a new database with the given name. +// ProvisionInstance provisions sql-specific resource for the given instance +func (sql *SQL) Provision(instance models.Instance, domain string) error { + return sql.CreateDatabase(instance.SqlDatabase, instance.SqlUsername, instance.SqlPassword) +} + +// 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. // // Provision internally waits for the database to become available. -func (sql *SQL) Provision(name, user, password string) error { +func (sql *SQL) CreateDatabase(name, user, password string) error { // NOTE(twiesing): We shouldn't use string concat to build sql queries. // But the driver doesn't support using query params for this particular query. diff --git a/internal/component/triplestore/provision.go b/internal/component/triplestore/provision.go index 4be6266..3ec7496 100644 --- a/internal/component/triplestore/provision.go +++ b/internal/component/triplestore/provision.go @@ -6,6 +6,7 @@ import ( _ "embed" + "github.com/FAU-CDI/wisski-distillery/internal/models" "github.com/FAU-CDI/wisski-distillery/pkg/unpack" "github.com/tkw1536/goprogram/exit" ) @@ -18,7 +19,11 @@ var errTripleStoreFailedRepository = exit.Error{ //go:embed create-repo.ttl var createRepoTTL []byte -func (ts Triplestore) Provision(name, domain, user, password string) error { +func (ts *Triplestore) Provision(instance models.Instance, domain string) error { + return ts.CreateRepository(instance.GraphDBRepository, domain, instance.GraphDBUsername, instance.GraphDBPassword) +} + +func (ts *Triplestore) CreateRepository(name, domain, user, password string) error { if err := ts.Wait(); err != nil { return err } diff --git a/internal/wisski/component.go b/internal/wisski/component.go index ad87cf1..3a36653 100644 --- a/internal/wisski/component.go +++ b/internal/wisski/component.go @@ -67,7 +67,7 @@ func makeComponent[C component.Component](dis *Distillery, field *lazy.Lazy[C], }) } -func (dis *Distillery) ComponentsX() []component.Component { +func (dis *Distillery) Components() []component.Component { return []component.Component{ dis.Web(), dis.Control(), @@ -93,8 +93,13 @@ func (dis *Distillery) Updateable() []component.Updatable { return getComponents[component.Updatable](dis) } +// Provisionable returns all components which can be provisioned +func (dis *Distillery) Provisionable() []component.Provisionable { + return getComponents[component.Provisionable](dis) +} + func getComponents[C component.Component](dis *Distillery) (result []C) { - all := dis.ComponentsX() + all := dis.Components() result = make([]C, 0, len(all)) for _, c := range all {