Skip to content

Commit f5ae314

Browse files
chore: enable using GitLab EE in functional tests
Enable using GitLab Enterprise Edition (EE) in the functional tests. This will allow us to add functional tests for EE only features in the functional tests.
1 parent 3d000d3 commit f5ae314

File tree

7 files changed

+112
-7
lines changed

7 files changed

+112
-7
lines changed

tests/functional/conftest.py

+27-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import gitlab.base
1212

1313
SLEEP_INTERVAL = 0.5
14-
TIMEOUT = 60 # seconds before timeout will occur
14+
TIMEOUT = 3 * 60 # seconds before timeout will occur
1515

1616

1717
@pytest.fixture(scope="session")
@@ -21,6 +21,15 @@ def fixture_dir(test_dir):
2121

2222
def reset_gitlab(gl):
2323
# previously tools/reset_gitlab.py
24+
if is_gitlab_ee(gl):
25+
logging.info("GitLab EE detected")
26+
# NOTE(jlvillal): By default in GitLab EE it will wait 7 days before
27+
# deleting a group. Change it to 0 days.
28+
settings = gl.settings.get()
29+
if settings.deletion_adjourned_period != 0:
30+
settings.deletion_adjourned_period = 0
31+
settings.save()
32+
2433
for project in gl.projects.list():
2534
logging.info(f"Marking for deletion project: {project.path_with_namespace!r}")
2635
for deploy_token in project.deploytokens.list():
@@ -61,13 +70,15 @@ def wait_for_list_size(
6170
test if timeout is exceeded"""
6271
logging.info(f"Checking {description!r} has no more than {max_length} items")
6372
for count in range(max_iterations):
64-
items = rest_manager.list()
73+
items = list(rest_manager.list())
6574
if len(items) <= max_length:
6675
break
6776
logging.info(
68-
f"Iteration: {count} Waiting for {description!r} items to be deleted: "
69-
f"{[x.name for x in items]}"
77+
f"Iteration: {count} of {max_iterations}: Waiting for {description!r} "
78+
f"items to be deleted: {[x.name for x in items]}"
7079
)
80+
for item in items:
81+
logging.info(f"JLV: {item.pprint()}")
7182
time.sleep(SLEEP_INTERVAL)
7283

7384
elapsed_time = time.perf_counter() - start_time
@@ -226,6 +237,18 @@ def gl(gitlab_config):
226237
return instance
227238

228239

240+
def is_gitlab_ee(gl: gitlab.Gitlab) -> bool:
241+
"""Determine if we are running with GitLab EE as opposed to GitLab CE"""
242+
try:
243+
license = gl.get_license()
244+
except gitlab.exceptions.GitlabLicenseError:
245+
license = None
246+
# If we have a license then we assume we are running on GitLab EE
247+
if license:
248+
return True
249+
return False
250+
251+
229252
@pytest.fixture(scope="session")
230253
def gitlab_runner(gl):
231254
container = "gitlab-runner-test"

tests/functional/fixtures/.env

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
GITLAB_IMAGE=gitlab/gitlab-ce
2-
GITLAB_TAG=14.9.2-ce.0
1+
GITLAB_IMAGE=gitlab/gitlab-ee
2+
GITLAB_TAG=14.9.2-ee.0
3+
4+
GITLAB_CI_IMAGE=localhost/gitlab-ci
5+
GITLAB_CI_TAG=latest

tests/functional/fixtures/Dockerfile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
ARG GITLAB_IMAGE=get_this_from_env
2+
ARG GITLAB_TAG=get_this_from_env
3+
FROM ${GITLAB_IMAGE}:${GITLAB_TAG}
4+
5+
COPY create_license.rb /
6+
RUN ruby /create_license.rb
7+
8+
CMD ["/assets/wrapper"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/bin/bash
2+
3+
set -u
4+
set -e
5+
6+
TOP_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
7+
8+
cd "${TOP_DIR}" || exit 1
9+
10+
source .env
11+
12+
docker build \
13+
-t "${GITLAB_CI_IMAGE}:${GITLAB_CI_TAG}" \
14+
--build-arg GITLAB_IMAGE="${GITLAB_IMAGE}" \
15+
--build-arg GITLAB_TAG="${GITLAB_TAG}" \
16+
--no-cache \
17+
"${TOP_DIR}"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# NOTE: As of 2022-06-01 the GitLab Enterprise Edition License has the following
2+
# section:
3+
# Notwithstanding the foregoing, you may copy and modify the Software for development
4+
# and testing purposes, without requiring a subscription.
5+
#
6+
# https://gitlab.com/gitlab-org/gitlab/-/blob/29503bc97b96af8d4876dc23fc8996e3dab7d211/ee/LICENSE
7+
#
8+
# This code is strictly intended for use in the testing framework of python-gitlab
9+
10+
# Code inspired by MIT licensed code at: https://github.com/CONIGUERO/gitlab-license.git
11+
12+
require 'openssl'
13+
require 'gitlab/license'
14+
15+
# Generate a 2048 bit key pair.
16+
license_encryption_key = OpenSSL::PKey::RSA.generate(2048)
17+
18+
# Save the private key
19+
File.open("/.license_encryption_key", "w") { |f| f.write(license_encryption_key.to_pem) }
20+
# Save the public key
21+
public_key = license_encryption_key.public_key
22+
File.open("/.license_encryption_key.pub", "w") { |f| f.write(public_key.to_pem) }
23+
File.open("/opt/gitlab/embedded/service/gitlab-rails/.license_encryption_key.pub", "w") { |f| f.write(public_key.to_pem) }
24+
25+
Gitlab::License.encryption_key = license_encryption_key
26+
27+
# Build a new license.
28+
license = Gitlab::License.new
29+
30+
license.licensee = {
31+
"Name" => "python-gitlab-ci",
32+
"Company" => "python-gitlab-ci",
33+
"Email" => "python-gitlab-ci@example.com",
34+
}
35+
36+
# The date the license starts.
37+
license.starts_at = Date.today
38+
# Want to make sure we get at least 1 day of usage. Do two days after because if CI
39+
# started at 23:59 we could be expired in one minute if we only did one next_day.
40+
license.expires_at = Date.today.next_day.next_day
41+
42+
# Use 'ultimate' plan so that we can test all features in the CI
43+
license.restrictions = {
44+
:plan => "ultimate",
45+
:id => rand(1000..99999999)
46+
}
47+
48+
# Export the license, which encrypts and encodes it.
49+
data = license.export
50+
51+
File.open("/python-gitlab-ci.gitlab-license", 'w') { |file| file.write(data) }

tests/functional/fixtures/docker-compose.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ networks:
66

77
services:
88
gitlab:
9-
image: '${GITLAB_IMAGE}:${GITLAB_TAG}'
9+
image: '${GITLAB_CI_IMAGE}:${GITLAB_CI_TAG}'
1010
container_name: 'gitlab-test'
1111
hostname: 'gitlab.test'
1212
privileged: true # Just in case https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/1350
@@ -31,6 +31,7 @@ services:
3131
gitlab_exporter['enable'] = false
3232
grafana['enable'] = false
3333
letsencrypt['enable'] = false
34+
gitlab_rails['initial_license_file'] = "/python-gitlab-ci.gitlab-license"
3435
ports:
3536
- '8080:80'
3637
- '2222:22'

tox.ini

+2
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,13 @@ exclude_lines =
104104
[testenv:cli_func_v4]
105105
deps = -r{toxinidir}/requirements-docker.txt
106106
commands =
107+
{toxinidir}/tests/functional/fixtures/build-dockerfile.sh
107108
pytest --script-launch-mode=subprocess --cov --cov-report xml tests/functional/cli {posargs}
108109

109110
[testenv:py_func_v4]
110111
deps = -r{toxinidir}/requirements-docker.txt
111112
commands =
113+
{toxinidir}/tests/functional/fixtures/build-dockerfile.sh
112114
pytest --cov --cov-report xml tests/functional/api {posargs}
113115

114116
[testenv:smoke]

0 commit comments

Comments
 (0)