docker-compose.ts 1.34 KB
Newer Older
1 2 3 4
import * as compose from 'docker-compose'
import * as shell from 'shelljs'
import * as path from 'path'

5 6 7 8 9 10
type ServiceNames =
  | 'batch_submitter'
  | 'dtl'
  | 'l2geth'
  | 'relayer'
  | 'verifier'
11 12

const OPS_DIRECTORY = path.join(process.cwd(), '../ops')
13 14 15 16 17 18
const DEFAULT_SERVICES: ServiceNames[] = [
  'batch_submitter',
  'dtl',
  'l2geth',
  'relayer',
]
19 20

export class DockerComposeNetwork {
21
  constructor(private readonly services: ServiceNames[] = DEFAULT_SERVICES) {}
22

23 24 25 26 27
  async up(options?: compose.IDockerComposeOptions) {
    const out = await compose.upMany(this.services, {
      cwd: OPS_DIRECTORY,
      ...options,
    })
28

29
    const { err, exitCode } = out
30

31 32 33 34 35 36
    if (!err || exitCode) {
      console.error(err)
      throw new Error(
        'Unexpected error when starting docker-compose network, dumping output'
      )
    }
37

38 39 40 41 42 43 44
    if (err.includes('Creating')) {
      console.info(
        '🐳 Tests required starting containers. Waiting for sequencer to ready.'
      )
      shell.exec(`${OPS_DIRECTORY}/scripts/wait-for-sequencer.sh`, {
        cwd: OPS_DIRECTORY,
      })
45
    }
46 47 48 49 50 51 52 53 54 55 56 57 58 59

    return out
  }

  async logs() {
    return compose.logs(this.services, { cwd: OPS_DIRECTORY })
  }

  async stop(service: ServiceNames) {
    return compose.stopOne(service, { cwd: OPS_DIRECTORY })
  }

  async rm() {
    return compose.rm({ cwd: OPS_DIRECTORY })
60
  }
61
}