diff --git a/cmd/provision.go b/cmd/provision.go index 7e15e7f..4684e35 100644 --- a/cmd/provision.go +++ b/cmd/provision.go @@ -12,6 +12,7 @@ import ( var Provision wisski_distillery.Command = pv{} type pv struct { + PHPVersion string `short:"p" long:"php" description:"specific php version to use for instance. Should be one of '8.0', '8.1'."` Positionals struct { Slug string `positional-arg-name:"slug" required:"1-1" description:"slug of instance to create"` } `positional-args:"true"` @@ -36,7 +37,8 @@ var errProvisionGeneric = exit.Error{ func (p pv) Run(context wisski_distillery.Context) error { instance, err := context.Environment.Provision().Provision(context.Stderr, context.Context, provision.ProvisionFlags{ - Slug: p.Positionals.Slug, + Slug: p.Positionals.Slug, + PHPVersion: p.PHPVersion, }) if err != nil { return errProvisionGeneric.WithMessageF(p.Positionals.Slug).Wrap(err) diff --git a/cmd/reserve.go b/cmd/reserve.go index b82198a..08cd30c 100644 --- a/cmd/reserve.go +++ b/cmd/reserve.go @@ -53,7 +53,7 @@ func (r reserve) Run(context wisski_distillery.Context) (err error) { } // make it in-memory - instance, err := dis.Instances().Create(slug) + instance, err := dis.Instances().Create(slug, "") if err != nil { return errProvisionGeneric.WithMessageF(slug, err) } diff --git a/internal/dis/component/instances/create.go b/internal/dis/component/instances/create.go index b1bfab6..9e18848 100644 --- a/internal/dis/component/instances/create.go +++ b/internal/dis/component/instances/create.go @@ -14,11 +14,34 @@ var ( errRestrictedSlug = errors.New("restricted slug") ) +const ( + PHP8 = "8.0" + PHP8_IMAGE = "docker.io/library/php:8.0-apache-bullseye" + PHP8_1 = "8.1" + PHP8_1_IMAGE = "docker.io/library/php:8.1-apache-bullseye" +) + +var errUnknownPHPVersion = errors.New("unknown php version") + +// GetBaseImage returns the php base image to use +func GetBaseImage(php string) (string, error) { + switch php { + case "": + return PHP8_IMAGE, nil + case PHP8: + return PHP8_IMAGE, nil + case PHP8_1: + return PHP8_1_IMAGE, nil + default: + return "", errUnknownPHPVersion + } +} + // 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.WissKI, err error) { +func (instances *Instances) Create(slug string, phpversion string) (wissKI *wisski.WissKI, err error) { // make sure that the slug is valid! slug, err = instances.IsValidSlug(slug) @@ -64,6 +87,12 @@ func (instances *Instances) Create(slug string) (wissKI *wisski.WissKI, err erro return nil, err } + // docker image + wissKI.Liquid.Instance.DockerBaseImage, err = GetBaseImage(phpversion) + if err != nil { + return nil, err + } + // store the instance in the object and return it! return wissKI, nil } diff --git a/internal/dis/component/instances/purger/purger.go b/internal/dis/component/instances/purger/purger.go index 8755f0c..c61e179 100644 --- a/internal/dis/component/instances/purger/purger.go +++ b/internal/dis/component/instances/purger/purger.go @@ -37,7 +37,7 @@ func (purger *Purger) Purge(ctx context.Context, out io.Writer, slug string) err instance, err := purger.Dependencies.Instances.WissKI(ctx, slug) if err == instances.ErrWissKINotFound { fmt.Fprintln(out, "Not found in bookkeeping table, assuming defaults") - instance, err = purger.Dependencies.Instances.Create(slug) + instance, err = purger.Dependencies.Instances.Create(slug, "") } if err != nil { return errPurgeNoDetails.WithMessageF(err) diff --git a/internal/dis/component/provision/provision.go b/internal/dis/component/provision/provision.go index 4786715..c664e85 100644 --- a/internal/dis/component/provision/provision.go +++ b/internal/dis/component/provision/provision.go @@ -22,11 +22,27 @@ type Provision struct { // ProvisionFlags are flags for a new instance type ProvisionFlags struct { + // Slug is the slug of the wisski instance Slug string + + // PHP Version to use + PHPVersion string } var ErrInstanceAlreadyExists = errors.New("instance with provided slug already exists") +func (pv *Provision) ValidateFlags(flags ProvisionFlags) error { + // check the slug + if _, err := pv.Dependencies.Instances.IsValidSlug(flags.Slug); err != nil { + return err + } + // check for known php versions + if _, err := instances.GetBaseImage(flags.PHPVersion); err != nil { + return err + } + return nil +} + // Provision provisions a new docker compose instance. func (pv *Provision) Provision(progress io.Writer, ctx context.Context, flags ProvisionFlags) (*wisski.WissKI, error) { // check that it doesn't already exist @@ -36,7 +52,7 @@ func (pv *Provision) Provision(progress io.Writer, ctx context.Context, flags Pr } // make it in-memory - instance, err := pv.Dependencies.Instances.Create(flags.Slug) + instance, err := pv.Dependencies.Instances.Create(flags.Slug, flags.PHPVersion) if err != nil { return nil, err } diff --git a/internal/dis/component/server/admin/html/instance.html b/internal/dis/component/server/admin/html/instance.html index 5d83a5c..d707792 100644 --- a/internal/dis/component/server/admin/html/instance.html +++ b/internal/dis/component/server/admin/html/instance.html @@ -29,6 +29,18 @@ {{ .Info.URL }} +
{{ .Instance.DockerBaseImage }}
+ {{ else }}
+ (none)
+ {{ end }}
+