import {Logger} from '@openstapps/logger'; import {expect} from 'chai'; import {ContainerInfo} from 'dockerode'; import {slow, suite, test, timeout} from 'mocha-typescript'; import * as sinon from 'sinon'; import {containerMatchesRegex, generateUpstreamMap, getGatewayOfStAppsBackend} from '../src/main'; const logger = new Logger(); process.on('unhandledRejection', (err) => { logger.error('UNHANDLED REJECTION', err.stack); process.exit(1); }); @suite(timeout(1000), slow(500)) // @ts-ignore class ContainerInfoParsing { static anyContainerWithExposedPorts: ContainerInfo; static backendContainerWithExposedPorts: ContainerInfo; static before(done: () => void) { // tslint:disable:object-literal-sort-keys this.backendContainerWithExposedPorts = { Id: 'e3d3f4d18aceac2780bdb95523845d066ed25c04fc65168a5ddbd37a85671bb7', Names: [ '/deployment_backend_1', ], Image: 'gitlab-registry.tubit.tu-berlin.de/stapps/backend/b-tu-typescript-refactor-for-new-tslint-config', ImageID: 'sha256:ef9f0c8c4b6f99dd208948c7aae1d042590aa18e05ebeae4f586e4b4beebeac9', Command: 'node ./bin/www', Created: 1524669882, Ports: [ { IP: '127.0.0.1', PrivatePort: 3000, PublicPort: 3000, Type: 'tcp', }, ], Labels: { 'com.docker.compose.config-hash': '91c6e0cebad15951824162c93392b6880b69599692f07798ae8de659c1616a03', 'com.docker.compose.container-number': '1', 'com.docker.compose.oneoff': 'False', 'com.docker.compose.project': 'deployment', 'com.docker.compose.service': 'backend', 'com.docker.compose.version': '1.21.0', 'stapps.version': '1.0.0', }, State: 'running', Status: 'Up 3 minutes', HostConfig: { NetworkMode: 'deployment_default', }, NetworkSettings: { Networks: { deployment_default: { IPAMConfig: null, Links: null, Aliases: null, NetworkID: '947ea5247cc7429e1fdebd5404fa4d15f7c05e6765f2b93ddb3bdb6aaffd1193', EndpointID: 'da17549a086ff2c9f622e80de833e6f334afda52c8f07080428640c1716dcd14', Gateway: '172.18.0.1', IPAddress: '172.18.0.3', IPPrefixLen: 16, IPv6Gateway: '', GlobalIPv6Address: '', GlobalIPv6PrefixLen: 0, MacAddress: '03:41:ac:11:00:23', }, }, }, }; // tslint:disable:object-literal-sort-keys this.anyContainerWithExposedPorts = { Id: 'e3d3f4d18aceac2780bdb95523845d066ed25c04fc65168a5ddbd37a85671bb7', Names: [ '/container_name_1', ], Image: 'ubuntu:4', ImageID: 'sha256:ef9f0c8c4b6f99dd208948c7aae1d042590aa18e05ebeae4f586e4b4beebeac9', Command: 'sh', Created: 1524669882, Ports: [ { IP: '0.0.0.0', PrivatePort: 80, PublicPort: 80, Type: 'tcp', }, ], Labels: {}, State: 'running', Status: 'Up 3 minutes', HostConfig: { NetworkMode: 'default', }, NetworkSettings: { Networks: { bridge: { IPAMConfig: null, Links: null, Aliases: null, NetworkID: '947ea5247cc7429e1fdebd5404fa4d15f7c05e6765f2b93ddb3bdb6aaffd1193', EndpointID: 'da17549a086ff2c9f622e80de833e6f334afda52c8f07080428640c1716dcd14', Gateway: '172.18.0.1', IPAddress: '172.18.0.3', IPPrefixLen: 16, IPv6Gateway: '', GlobalIPv6Address: '', GlobalIPv6PrefixLen: 0, MacAddress: '03:41:ac:11:00:23', }, }, }, }; done(); } // tslint:disable:no-unused-expression @test checkIfContainerDoesNotMatchAnyContainer(done: () => void) { expect(containerMatchesRegex( 'anyName', new RegExp('d+'), ContainerInfoParsing.anyContainerWithExposedPorts), ).to.be.false; done(); } @test checkIfContainerDoesNotMatchIfVersionIsIncorrect(done: () => void) { expect(containerMatchesRegex( 'backend', new RegExp('1\\.4\\.\\d+'), ContainerInfoParsing.backendContainerWithExposedPorts), ).to.be.false; done(); } @test checkIfContainerMatches(done: () => void) { expect(containerMatchesRegex( 'backend', new RegExp('1\\.0\\.\\d+'), ContainerInfoParsing.backendContainerWithExposedPorts), ).to.be.true; done(); } @test getGatewayOfAnyContainerWithExposedPorts(done: () => void) { expect(getGatewayOfStAppsBackend(ContainerInfoParsing.anyContainerWithExposedPorts)).to.be.equal('0.0.0.0:80'); done(); } @test getGatewayOfBackendContainer(done: () => void) { expect(getGatewayOfStAppsBackend(ContainerInfoParsing.backendContainerWithExposedPorts)) .to .be .equal('127.0.0.1:3000'); done(); } @test upstreamMapCallsLoggerErrorWhenNoMatchingContainerIsFound(done: () => void) { const stub = sinon.stub(console, 'error'); expect(generateUpstreamMap( ['0\\.8\\.\\d+'], ['1\\.1\\.\\d+'], [ContainerInfoParsing.backendContainerWithExposedPorts], )).to.be.equal('map $http_x_stapps_version $proxyurl {\n' + ' default unsupported;\n' + ' "~0\\.8\\.\\d+" unavailable;\n' + ' "~1\\.1\\.\\d+" outdated;\n' + '}\n'); stub.restore(); expect(stub.args[0][0]).contains('[ERROR] No backend for version').and.contains('found'); done(); } @test upstreamMapWithOneActiveVersionAndNoOutdatedOnes(done: () => void) { expect( generateUpstreamMap( ['1\\.0\\.\\d+'], ['0\\.8\\.\\d+'], [ContainerInfoParsing.backendContainerWithExposedPorts], ), ).to.be.equal( 'map $http_x_stapps_version $proxyurl {\n' + ' default unsupported;\n' + ' "~1\\.0\\.\\d+" 1__0___d_;\n' + ' "~0\\.8\\.\\d+" outdated;\n' + '}\n' + 'upstream 1__0___d_ {\n' + ' server 127.0.0.1:3000;\n' + '}\n', ); done(); } }