homerunner

command
v0.0.0-...-8587fb3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 14, 2024 License: Apache-2.0 Imports: 15 Imported by: 0

README

Homerunner

An HTTP server which can spin up homeservers and execute blueprints on them. Powered by the same internals as Complement.

Environment variables (all are optional):

HOMERUNNER_LIFETIME_MINS=30                                       # how long networks can exist for before being destroyed
HOMERUNNER_PORT=54321                                             # port to listen on
HOMERUNNER_SPAWN_HS_TIMEOUT_SECS=5                                # how long to wait for the base image to spin up
HOMERUNNER_KEEP_BLUEPRINTS='clean_hs federation_one_to_one_room'  # space delimited blueprint names to keep images for
HOMERUNNER_SNAPSHOT_BLUEPRINT=/some/file.json                     # single shot execute this blueprint then commit the image, does not run the server
HOMERUNNER_HS_PORTBINDING_IP=127.0.0.1                            # IP to bind homeserver ports on, if not local-only

To build and run:

go build ./cmd/homerunner
./homerunner

There are three ways to use Homerunner which are shown below.

Deploy an image from Docker

If you have a pre-committed image already (e.g you have an anonymous account snapshot) then run Homerunner like this:

HOMERUNNER_KEEP_BLUEPRINTS='name-of-blueprint' ./homerunner

This is neccessary to stop Homerunner from cleaning up the image. Then perform a single POST request:

curl -XPOST -d '{"blueprint_name":"name-of-blueprint"}'
{
  "homeservers":{
    "hs1":{
      "BaseURL":"http://localhost:55278",
      "FedBaseURL":"https://localhost:55277",
      "ContainerID":"59c6cd9eeb624c5eab7d317fcef63a6e50f98aeb5a6f09cc4b74297bfecb9211",
      "AccessTokens":{
        "@anon-2:hs1":"9VewRcVTCaZ2qnbRN66Aji8l6i-dVlmlLDx44vRUQVI"
      },
      "ApplicationServices":{}
    }
  },
  "expires":"2021-03-09T18:02:37.818757Z"
}

To find the blueprint name, run docker inspect --format={{.ContainerConfig.Labels.complement_blueprint}} your-image:latest

Deploy an in-line blueprint

Requires: A base image from dockerfiles

If you have your own custom blueprint you want to run, perform a single POST request:

{
  "base_image_uri": "complement-dendrite",
  "blueprint": {
    "Name": "my_custom_blueprint",
    "Homeservers": [
      {
        "Name": "hs1",
        "Users": [
          {
            "Localpart": "anon-64",
            "DisplayName": "anon-64"
	  }
	],
	"Rooms": [ ... ]
      }
    ]
  }
}

The format of blueprint is the same as the Blueprint struct in https://github.com/matrix-org/complement/blob/master/internal/b/blueprints.go#L39

Deploy a blueprint from Complement

Requires: A base image from dockerfiles

This allows you to deploy any one of the static blueprints in https://github.com/matrix-org/complement/tree/master/internal/b

Perform a single POST request:

$ curl -XPOST -d '{"base_image_uri":"complement-dendrite", "blueprint_name":"federation_one_to_one_room"}' http://localhost:54321/create
{
	"homeservers": {
		"hs1": {
			"BaseURL": "http://localhost:32829",
			"FedBaseURL": "https://localhost:32828",
			"ContainerID": "980cb5310c37a7c7823dfe6968139b12774f39e2a5641e0aa011dcdf1a34f686",
			"AccessTokens": {
				"@alice:hs1": "z7EdGeM9BRJVwKQOs5SLJyAEflwWTejmJ5YcnJyJMVk"
			}
		},
		"hs2": {
			"BaseURL": "http://localhost:32827",
			"FedBaseURL": "https://localhost:32826",
			"ContainerID": "d926131d13bfaf5ee226fa90de742b529ffe9e965071883af15224f33d8d38f8",
			"AccessTokens": {
				"@bob:hs2": "vjuuiSMLce7kpItdIm0zHGAjaxYCt5ICfZEMX1Ba1MI"
			}
		}
	},
	"expires": "2020-12-22T16:22:28.99267Z"
}

Destroy the network:

curl -XPOST -d '{"blueprint_name":"federation_one_to_one_room"}' http://localhost:54321/destroy                                       
{}

Creating pre-committed images

If you have a blueprint (e.g from account-snapshot) which you wish to snapshot into a docker image, then run this command:

HOMERUNNER_SNAPSHOT_BLUEPRINT=/some/file.json ./homerunner

The data in /some/file must be the same as an in-line blueprint request. The output will be an image in docker image ls along the lines of:

REPOSITORY                                                             TAG                     IMAGE ID       CREATED         SIZE
localhost/complement                                                   snapshot_anon2hs1.hs1   1b18395c0d1e   37 hours ago    330MB

If you run docker inspect repo:tag on this you will see a section called Labels:

"Labels": {
  "access_token_@anon-2:hs1": "tcy4A0xsHH0_iKq4O7AlOdg4zdThDyw7R8lUFjoZO4s",
  "complement_blueprint": "snapshot_anon2hs1",
  "complement_context": "snapshot_anon2hs1.hs1",
  "complement_hs_name": "hs1"
}

The complement_blueprint label is the blueprint name you should use to deploy this image. You can now push this image to docker/gitlab.

Access tokens

Access tokens are returned when deploying the blueprint but sometimes you want to login as a normal user. The format for passwords for all users created by Complement is here.

Health

Homerunner will respond to GET /health with a 200 response. You can use this to check if homerunner is ready when running your tests.

Running using dind (docker-in-docker)

The provided Docker container contains just homerunner, and a separate docker daemon will be required to host the homeservers that are started.

This can be done by mounting the unix socket into the container, or running a docker:dind sidecar and exporting DOCKER_HOST correctly (eg tcp://localhost:2375/).

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL