local utils = import '.gitlab-ci/utils.libsonnet';
local vars = import '.gitlab-ci/vars.libsonnet';
local mergeJob = utils.ci.mergeJob;
local images = vars.images;
local baseJob = (import '.gitlab-ci/base_jobs.libsonnet')(vars);

local stages_list = [
  // gitlab-ci stages
  'docker_base',
  'docker_build',
  'unit_tests',
  'integration',
  'docker_release',
  'teardown',
];

local stages = utils.set(stages_list);

// List CI jobs
local jobs = {
  // Helpers
  local onlyMaster = {
    only: ['master', 'tags'],
  },
  local onlyBranch = {
    only: ['branches'],
  },

  'container-base-build': baseJob.dockerBuild + onlyMaster {
    // ! Only master/tags
    // Update the base container
    stage: stages.docker_base,
    script: [
      'docker build --cache-from quay.io/quay/quay-base:latest' +
      ' -t %s -f quay-base.dockerfile .' % images.base.name,
      'docker push %s' % images.base.name,
    ],
  },

  'container-build': baseJob.dockerBuild {
    // Build and push the quay container.
    // Docker Tag is the branch/tag name
    stage: stages.docker_build,
    script: [
      'docker build -t %s -f Dockerfile .' % images.quayci.name,
      'docker push %s' % images.quayci.name],
  },

  'container-release': baseJob.dockerBuild + onlyMaster {
    // ! Only master/tags
    // push the container to the 'prod' repository
    local repo_with_sha = images.release.name,
    stage: stages.docker_release,
    script: [
      'docker pull %s' % images.quayci.name,
      'docker tag %s %s' % [images.quayci.name, repo_with_sha],
      'docker push %s' % [repo_with_sha],  # @TODO(ant31) add signing
    ],
  },

  // Unit-tests
  local unittest_stage = baseJob.QuayTest {
    stage: stages.unit_tests },
  'unit-tests': unittest_stage {
    script: [
      'py.test --timeout=7200 --verbose --show-count ./ --color=no -x'] },

  'registry-tests': unittest_stage {
    script: [
      'py.test --timeout=7200 --verbose --show-count ./test/registry_tests.py --color=no -x'] },

  // UI tests
  'karma-tests': unittest_stage {
    script: [
     'curl -Ss https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -',
     'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list',
     'apt-get update -yqqq',
     'apt-get install -y google-chrome-stable',
     'yarn test'
     ] },

  // Unit-tests with real databases
  local db_stage = { stage: stages.unit_tests },
  local dbname = 'quay',
  postgres: db_stage + baseJob.dbTest('postgresql',
                                      image='postgres:9.6',
                                      env={ POSTGRES_PASSWORD: dbname, POSTGRES_USER: dbname }),

  mysql: db_stage + baseJob.dbTest('mysql+pymysql',
                                   image='mysql:latest',
                                   env={ [key]: dbname for key in ['MYSQL_ROOT_PASSWORD', 'MYSQL_DATABASE',
                                                                   'MYSQL_USER', 'MYSQL_PASSWORD'] }),

};

{
  stages: stages_list,
  variables: vars.global,
} + jobs