Files
ubicloud/routes/cli.rb
Jeremy Evans 90c3fa1258 Add infrastructure for a CLI named ubi, using a thin-CLI approach
Maintaining a traditional CLI program for a web service can be
difficult, since any new CLI features are not available to users
unless the user updates their CLI program.  That defeats some of
the advantages of using a web service to being with, where new
features are immediately available for users to use when they
are deployed.

To avoid this issue, this uses an approach I'm dubbing thin-CLI,
where the CLI program is as a thin as possible.  With thin-CLI,
the CLI submits the argv to the web service, and the web service
parses the argv and takes appropriate action.  This allows the
CLI to support most new features as soon as they are deployed,
without the user having to update the CLI program.

Here's a breakdown of the parts:

* bin/ubi: The CLI program that users will run.  This will
  eventually be written in a cross-compiliable language, but
  for now it is prototyped in Ruby.  This submits the argv
  to the server (thin-CLI approach), and depending on the
  response, prints to stdout (success) or stderr (error).
  It has support for executing ssh or psql, but to limit
  potential issues with a adverse server, only a single
  command line argument is provided by the server.  The
  allowed commands are fixed by the client (currently only
  ssh and psql are allowed commands).  At this prototype
  stage, configuration of bin/ubid is done via environment
  variables.  You must provide the UBI_TOKEN environment
  variable, and some other UBI_* environment variables can
  be set.  bin/ubi will read .env.rb if it exists, so you
  can put the token into there.  bin/ubi currently defaults
  to http://api.localhost:9292/cli as the address (puma
  running in development locally).

* routes/cli.rb: Clover route file, only allowed for api
  requests, which passes the argv to UbiCli.

* lib/ubi_cli.rb: Adds UbiCli, which is used as the scope
  class when executing the command blocks for CLI commands.
  Passes the argv to UbiRodish to do the parsing, providing
  the instance of UbiCli as the context object. This class
  has instance methods that issue internal requests to
  Clover's API.  It currently takes the JSON responses from
  Clover's API, and turns them into plain-text responses,
  which will be provided to the client (bin/ubi), which will
  just take the response output and print to stdout/stderr.
  This currently contains code not currently used, but will
  be used by future commits.

* lib/ubi_rodish.rb: Rodish processor.  In this initial
  commit, only provides --help and --verbose options, and
  no subcommands.

This has one small change to the create_vm spec method,
allowing you to pass an existing project_id keyword, to use
that project instead of creating a new project.
2025-02-05 11:01:58 -08:00

554 B