up method

Implementation

Future<ComposeEnvironmentInstance> up() async {
  final projectId = 'datahub_test_${uuid()}';
  final parsedCompose = loadYaml(compose) as Map;
  final services = parsedCompose['services'] as Map;
  final servicePorts = <(String, int)>[];

  for (final (serviceName, service) in services.tuples) {
    final ports = service['ports'] as List?;
    for (final port in ports ?? const []) {
      final parts = port.toString().split(':');
      final containerPort = switch (parts.length) {
        1 => int.parse(parts[0]),
        _ => int.parse(parts[1]),
      };

      servicePorts.add((serviceName, containerPort));
    }
  }

  final process = await io.Process.start('docker', [
    'compose',
    '-p',
    projectId,
    '-f',
    '-',
    'up',
    '-d',
    if (servicePorts.isNotEmpty) '--wait',
    ...servicePorts.$1,
  ]);
  process.stdin.write(compose);
  await process.stdin.close();

  if (await process.exitCode != 0) {
    throw StateError(
      'docker compose up failed:\n${await utf8.decodeStream(process.stderr)}',
    );
  }

  return ComposeEnvironmentInstance(
    composeEnvironment: this,
    projectId: projectId,
    servicePorts: [
      for (final servicePort in servicePorts)
        ServicePort(
          name: servicePort.$1,
          containerPort: servicePort.$2,
          hostPort: await findPort(projectId, servicePort.$1, servicePort.$2),
        ),
    ],
  );
}