111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package instances
|
|
|
|
import (
|
|
"errors"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/pkg/stringparser"
|
|
"github.com/alessio/shellescape"
|
|
"github.com/tkw1536/goprogram/stream"
|
|
)
|
|
|
|
var errInvalidSlug = errors.New("not a valid slug")
|
|
|
|
// Create fills the struct for a new WissKI instance.
|
|
// It validates that slug is a valid name for an instance.
|
|
//
|
|
// It does not perform any checks if the instance already exists, or does the creation in the database.
|
|
func (instances *Instances) Create(slug string) (wisski WissKI, err error) {
|
|
wisski.instances = instances
|
|
|
|
// make sure that the slug is valid!
|
|
slug, err = stringparser.ParseSlug(instances.Environment, slug)
|
|
if err != nil {
|
|
return wisski, errInvalidSlug
|
|
}
|
|
|
|
wisski.Instance.Slug = slug
|
|
wisski.Instance.FilesystemBase = filepath.Join(instances.Path(), wisski.Domain())
|
|
|
|
wisski.Instance.OwnerEmail = ""
|
|
wisski.Instance.AutoBlindUpdateEnabled = true
|
|
|
|
// sql
|
|
|
|
wisski.Instance.SqlDatabase = instances.Config.MysqlDatabasePrefix + slug
|
|
wisski.Instance.SqlUsername = instances.Config.MysqlUserPrefix + slug
|
|
|
|
wisski.Instance.SqlPassword, err = instances.Config.NewPassword()
|
|
if err != nil {
|
|
return WissKI{}, err
|
|
}
|
|
|
|
// triplestore
|
|
|
|
wisski.Instance.GraphDBRepository = instances.Config.GraphDBRepoPrefix + slug
|
|
wisski.Instance.GraphDBUsername = instances.Config.GraphDBUserPrefix + slug
|
|
|
|
wisski.Instance.GraphDBPassword, err = instances.Config.NewPassword()
|
|
if err != nil {
|
|
return WissKI{}, err
|
|
}
|
|
|
|
// drupal
|
|
|
|
wisski.DrupalUsername = "admin" // TODO: Change this!
|
|
|
|
wisski.DrupalPassword, err = instances.Config.NewPassword()
|
|
if err != nil {
|
|
return wisski, err
|
|
}
|
|
|
|
// store the instance in the object and return it!
|
|
return wisski, nil
|
|
}
|
|
|
|
// Provision provisions an instance, assuming that the required databases already exist.
|
|
func (wisski *WissKI) Provision(io stream.IOStream) error {
|
|
|
|
// build the container
|
|
if err := wisski.Build(io, false); err != nil {
|
|
return err
|
|
}
|
|
|
|
provisionParams := []string{
|
|
wisski.Domain(),
|
|
|
|
wisski.SqlDatabase,
|
|
wisski.SqlUsername,
|
|
wisski.SqlPassword,
|
|
|
|
wisski.GraphDBRepository,
|
|
wisski.GraphDBUsername,
|
|
wisski.GraphDBPassword,
|
|
|
|
wisski.DrupalUsername,
|
|
wisski.DrupalPassword,
|
|
|
|
"", // TODO: DrupalVersion
|
|
"", // TODO: WissKIVersion
|
|
}
|
|
|
|
// escape the parameter
|
|
for i, param := range provisionParams {
|
|
provisionParams[i] = shellescape.Quote(param)
|
|
}
|
|
|
|
// figure out the provision script
|
|
// TODO: Move the provision script into the control plane!
|
|
provisionScript := "sudo PATH=$PATH -u www-data /bin/bash /provision_container.sh " + strings.Join(provisionParams, " ")
|
|
|
|
code, err := wisski.Barrel().Run(io, true, "barrel", "/bin/bash", "-c", provisionScript)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if code != 0 {
|
|
return errors.New("unable to run provision script")
|
|
}
|
|
|
|
return nil
|
|
}
|