mirror of
https://github.com/ansible/awx.git
synced 2026-05-23 08:37:48 -02:30
Remove any references to internal licensing utilities
This commit is contained in:
3
Makefile
3
Makefile
@@ -971,9 +971,6 @@ docker-compose-test: docker-auth
|
|||||||
docker-compose-build: tower-devel-build tower-isolated-build
|
docker-compose-build: tower-devel-build tower-isolated-build
|
||||||
|
|
||||||
tower-devel-build:
|
tower-devel-build:
|
||||||
rm -rf tools/docker-compose/tower-license
|
|
||||||
git clone git@github.com:ansible/tower-license.git tools/docker-compose/tower-license
|
|
||||||
cd tools/docker-compose/tower-license && $(PYTHON) setup.py sdist
|
|
||||||
docker build -t ansible/tower_devel -f tools/docker-compose/Dockerfile .
|
docker build -t ansible/tower_devel -f tools/docker-compose/Dockerfile .
|
||||||
docker tag ansible/tower_devel gcr.io/ansible-tower-engineering/tower_devel:$(COMPOSE_TAG)
|
docker tag ansible/tower_devel gcr.io/ansible-tower-engineering/tower_devel:$(COMPOSE_TAG)
|
||||||
#docker push gcr.io/ansible-tower-engineering/tower_devel:$(COMPOSE_TAG)
|
#docker push gcr.io/ansible-tower-engineering/tower_devel:$(COMPOSE_TAG)
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ from awx.main.utils import get_ansible_version
|
|||||||
from awx.sso.backends import LDAPSettings
|
from awx.sso.backends import LDAPSettings
|
||||||
from awx.main.tests.URI import URI # noqa
|
from awx.main.tests.URI import URI # noqa
|
||||||
|
|
||||||
from tower_license import TowerLicense
|
|
||||||
|
|
||||||
TEST_PLAYBOOK = '''- hosts: mygroup
|
TEST_PLAYBOOK = '''- hosts: mygroup
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
tasks:
|
tasks:
|
||||||
@@ -179,34 +177,6 @@ class BaseTestMixin(MockCommonlySlowTestMixin):
|
|||||||
rnd_str = '____' + str(random.randint(1, 9999999))
|
rnd_str = '____' + str(random.randint(1, 9999999))
|
||||||
return __name__ + '-generated-' + string + rnd_str
|
return __name__ + '-generated-' + string + rnd_str
|
||||||
|
|
||||||
def create_test_license_file(self, instance_count=10000, license_date=int(time.time() + 3600), features={}):
|
|
||||||
settings.LICENSE = TowerLicense(
|
|
||||||
company_name='AWX',
|
|
||||||
contact_name='AWX Admin',
|
|
||||||
contact_email='awx@example.com',
|
|
||||||
license_date=license_date,
|
|
||||||
instance_count=instance_count,
|
|
||||||
license_type='enterprise',
|
|
||||||
features=features,
|
|
||||||
).generate()
|
|
||||||
|
|
||||||
def create_basic_license_file(self, instance_count=100, license_date=int(time.time() + 3600)):
|
|
||||||
settings.LICENSE = TowerLicense(
|
|
||||||
company_name='AWX',
|
|
||||||
contact_name='AWX Admin',
|
|
||||||
contact_email='awx@example.com',
|
|
||||||
license_date=license_date,
|
|
||||||
instance_count=instance_count,
|
|
||||||
license_type='basic',
|
|
||||||
).generate()
|
|
||||||
|
|
||||||
def create_expired_license_file(self, instance_count=1000, grace_period=False):
|
|
||||||
license_date = time.time() - 1
|
|
||||||
if not grace_period:
|
|
||||||
license_date -= 2592000
|
|
||||||
self.create_test_license_file(instance_count, license_date)
|
|
||||||
os.environ['SKIP_LICENSE_FIXUP_FOR_TEST'] = '1'
|
|
||||||
|
|
||||||
def assertElapsedLessThan(self, seconds):
|
def assertElapsedLessThan(self, seconds):
|
||||||
elapsed = time.time() - self._start_time
|
elapsed = time.time() - self._start_time
|
||||||
self.assertTrue(elapsed < seconds, 'elapsed time of %0.3fs is greater than %0.3fs' % (elapsed, seconds))
|
self.assertTrue(elapsed < seconds, 'elapsed time of %0.3fs is greater than %0.3fs' % (elapsed, seconds))
|
||||||
|
|||||||
@@ -97,16 +97,3 @@ def get_ssh_version(mocker):
|
|||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def job_template_with_survey_passwords_unit(job_template_with_survey_passwords_factory):
|
def job_template_with_survey_passwords_unit(job_template_with_survey_passwords_factory):
|
||||||
return job_template_with_survey_passwords_factory(persisted=False)
|
return job_template_with_survey_passwords_factory(persisted=False)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def enterprise_license():
|
|
||||||
from tower_license import TowerLicense
|
|
||||||
return TowerLicense(
|
|
||||||
company_name='AWX',
|
|
||||||
contact_name='AWX Admin',
|
|
||||||
contact_email='awx@example.com',
|
|
||||||
license_date=int(time.time() + 3600),
|
|
||||||
instance_count=10000,
|
|
||||||
license_type='enterprise',
|
|
||||||
).generate()
|
|
||||||
|
|||||||
@@ -27,26 +27,6 @@ def mock_no_license_file(mocker):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_license_cannot_be_removed_via_system_settings(mock_no_license_file, get, put, patch, delete, admin, enterprise_license):
|
|
||||||
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'system'})
|
|
||||||
response = get(url, user=admin, expect=200)
|
|
||||||
assert not response.data['LICENSE']
|
|
||||||
Setting.objects.create(key='TOWER_URL_BASE', value='https://towerhost')
|
|
||||||
Setting.objects.create(key='LICENSE', value=enterprise_license)
|
|
||||||
response = get(url, user=admin, expect=200)
|
|
||||||
assert response.data['LICENSE']
|
|
||||||
put(url, user=admin, data=response.data, expect=200)
|
|
||||||
response = get(url, user=admin, expect=200)
|
|
||||||
assert response.data['LICENSE']
|
|
||||||
patch(url, user=admin, data={}, expect=200)
|
|
||||||
response = get(url, user=admin, expect=200)
|
|
||||||
assert response.data['LICENSE']
|
|
||||||
delete(url, user=admin, expect=204)
|
|
||||||
response = get(url, user=admin, expect=200)
|
|
||||||
assert response.data['LICENSE']
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_url_base_defaults_to_request(options, admin):
|
def test_url_base_defaults_to_request(options, admin):
|
||||||
# If TOWER_URL_BASE is not set, default to the Tower request hostname
|
# If TOWER_URL_BASE is not set, default to the Tower request hostname
|
||||||
@@ -76,10 +56,8 @@ def test_jobs_settings(get, put, patch, delete, admin):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_ldap_settings(get, put, patch, delete, admin, enterprise_license):
|
def test_ldap_settings(get, put, patch, delete, admin):
|
||||||
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ldap'})
|
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ldap'})
|
||||||
get(url, user=admin, expect=404)
|
|
||||||
Setting.objects.create(key='LICENSE', value=enterprise_license)
|
|
||||||
get(url, user=admin, expect=200)
|
get(url, user=admin, expect=200)
|
||||||
# The PUT below will fail at the moment because AUTH_LDAP_GROUP_TYPE
|
# The PUT below will fail at the moment because AUTH_LDAP_GROUP_TYPE
|
||||||
# defaults to None but cannot be set to None.
|
# defaults to None but cannot be set to None.
|
||||||
@@ -102,11 +80,8 @@ def test_ldap_settings(get, put, patch, delete, admin, enterprise_license):
|
|||||||
'AUTH_LDAP_DENY_GROUP',
|
'AUTH_LDAP_DENY_GROUP',
|
||||||
])
|
])
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_empty_ldap_dn(get, put, patch, delete, admin, enterprise_license,
|
def test_empty_ldap_dn(get, put, patch, delete, admin, setting):
|
||||||
setting):
|
|
||||||
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ldap'})
|
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ldap'})
|
||||||
Setting.objects.create(key='LICENSE', value=enterprise_license)
|
|
||||||
|
|
||||||
patch(url, user=admin, data={setting: ''}, expect=200)
|
patch(url, user=admin, data={setting: ''}, expect=200)
|
||||||
resp = get(url, user=admin, expect=200)
|
resp = get(url, user=admin, expect=200)
|
||||||
assert resp.data[setting] is None
|
assert resp.data[setting] is None
|
||||||
@@ -117,10 +92,8 @@ def test_empty_ldap_dn(get, put, patch, delete, admin, enterprise_license,
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_radius_settings(get, put, patch, delete, admin, enterprise_license, settings):
|
def test_radius_settings(get, put, patch, delete, admin, settings):
|
||||||
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'radius'})
|
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'radius'})
|
||||||
get(url, user=admin, expect=404)
|
|
||||||
Setting.objects.create(key='LICENSE', value=enterprise_license)
|
|
||||||
response = get(url, user=admin, expect=200)
|
response = get(url, user=admin, expect=200)
|
||||||
put(url, user=admin, data=response.data, expect=200)
|
put(url, user=admin, data=response.data, expect=200)
|
||||||
# Set secret via the API.
|
# Set secret via the API.
|
||||||
@@ -151,12 +124,11 @@ def test_radius_settings(get, put, patch, delete, admin, enterprise_license, set
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_ui_settings(get, put, patch, delete, admin, enterprise_license):
|
def test_ui_settings(get, put, patch, delete, admin):
|
||||||
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ui'})
|
url = reverse('api:setting_singleton_detail', kwargs={'category_slug': 'ui'})
|
||||||
response = get(url, user=admin, expect=200)
|
response = get(url, user=admin, expect=200)
|
||||||
assert 'CUSTOM_LOGO' not in response.data
|
assert 'CUSTOM_LOGO' not in response.data
|
||||||
assert 'CUSTOM_LOGIN_INFO' not in response.data
|
assert 'CUSTOM_LOGIN_INFO' not in response.data
|
||||||
Setting.objects.create(key='LICENSE', value=enterprise_license)
|
|
||||||
response = get(url, user=admin, expect=200)
|
response = get(url, user=admin, expect=200)
|
||||||
assert not response.data['CUSTOM_LOGO']
|
assert not response.data['CUSTOM_LOGO']
|
||||||
assert not response.data['CUSTOM_LOGIN_INFO']
|
assert not response.data['CUSTOM_LOGIN_INFO']
|
||||||
|
|||||||
@@ -1,56 +1,7 @@
|
|||||||
# Copyright (c) 2015 Ansible, Inc.
|
# Copyright (c) 2015 Ansible, Inc.
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
|
|
||||||
import time
|
from awx.main.utils.common import StubLicense
|
||||||
import pytest
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from awx.main.models import Host
|
|
||||||
from awx.main.utils import get_licenser, StubLicense
|
|
||||||
from tower_license import TowerLicense
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_license_writer(inventory, admin):
|
|
||||||
license_actual = TowerLicense(
|
|
||||||
company_name='acmecorp',
|
|
||||||
contact_name='Michael DeHaan',
|
|
||||||
contact_email='michael@ansibleworks.com',
|
|
||||||
license_date=25000, # seconds since epoch
|
|
||||||
instance_count=500)
|
|
||||||
|
|
||||||
data = license_actual.generate()
|
|
||||||
|
|
||||||
Host.objects.bulk_create(
|
|
||||||
[
|
|
||||||
Host(
|
|
||||||
name='host.%d' % n,
|
|
||||||
inventory=inventory,
|
|
||||||
created_by=admin,
|
|
||||||
modified=datetime.now(),
|
|
||||||
created=datetime.now())
|
|
||||||
for n in range(12)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
assert data['instance_count'] == 500
|
|
||||||
assert data['contact_name'] == 'Michael DeHaan'
|
|
||||||
assert data['contact_email'] == 'michael@ansibleworks.com'
|
|
||||||
assert data['license_date'] == 25000
|
|
||||||
assert data['license_key'] == "11bae31f31c6a6cdcb483a278cdbe98bd8ac5761acd7163a50090b0f098b3a13"
|
|
||||||
|
|
||||||
vdata = license_actual.validate()
|
|
||||||
|
|
||||||
assert vdata['available_instances'] == 500
|
|
||||||
assert vdata['current_instances'] == 12
|
|
||||||
assert vdata['free_instances'] == 488
|
|
||||||
assert vdata['date_warning'] is True
|
|
||||||
assert vdata['date_expired'] is True
|
|
||||||
assert vdata['license_date'] == 25000
|
|
||||||
assert vdata['time_remaining'] < 0
|
|
||||||
assert vdata['valid_key'] is True
|
|
||||||
assert vdata['compliant'] is False
|
|
||||||
assert vdata['subscription_name']
|
|
||||||
|
|
||||||
|
|
||||||
def test_stub_license():
|
def test_stub_license():
|
||||||
@@ -60,56 +11,3 @@ def test_stub_license():
|
|||||||
assert license_actual['compliant']
|
assert license_actual['compliant']
|
||||||
assert license_actual['license_type'] == 'open'
|
assert license_actual['license_type'] == 'open'
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_expired_licenses():
|
|
||||||
license_actual = TowerLicense(
|
|
||||||
company_name='Tower',
|
|
||||||
contact_name='Tower Admin',
|
|
||||||
contact_email='tower@ansible.com',
|
|
||||||
license_date=int(time.time() - 3600),
|
|
||||||
instance_count=100,
|
|
||||||
trial=True)
|
|
||||||
license_actual.generate()
|
|
||||||
vdata = license_actual.validate()
|
|
||||||
|
|
||||||
assert vdata['compliant'] is False
|
|
||||||
assert vdata['grace_period_remaining'] < 0
|
|
||||||
|
|
||||||
license_actual = TowerLicense(
|
|
||||||
company_name='Tower',
|
|
||||||
contact_name='Tower Admin',
|
|
||||||
contact_email='tower@ansible.com',
|
|
||||||
license_date=int(time.time() - 2592001),
|
|
||||||
instance_count=100,
|
|
||||||
trial=False)
|
|
||||||
license_actual.generate()
|
|
||||||
vdata = license_actual.validate()
|
|
||||||
|
|
||||||
assert vdata['compliant'] is False
|
|
||||||
assert vdata['grace_period_remaining'] < 0
|
|
||||||
|
|
||||||
license_actual = TowerLicense(
|
|
||||||
company_name='Tower',
|
|
||||||
contact_name='Tower Admin',
|
|
||||||
contact_email='tower@ansible.com',
|
|
||||||
license_date=int(time.time() - 3600),
|
|
||||||
instance_count=100,
|
|
||||||
trial=False)
|
|
||||||
license_actual.generate()
|
|
||||||
vdata = license_actual.validate()
|
|
||||||
|
|
||||||
assert vdata['compliant'] is False
|
|
||||||
assert vdata['grace_period_remaining'] > 0
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_cloudforms_license(mocker):
|
|
||||||
with mocker.patch('tower_license.TowerLicense._check_cloudforms_subscription', return_value=True):
|
|
||||||
license_actual = TowerLicense()
|
|
||||||
vdata = license_actual.validate()
|
|
||||||
assert vdata['compliant'] is True
|
|
||||||
assert vdata['subscription_name'] == "Red Hat CloudForms License"
|
|
||||||
assert vdata['available_instances'] == 9999999
|
|
||||||
assert vdata['license_type'] == 'enterprise'
|
|
||||||
assert vdata['features']['ha'] is True
|
|
||||||
|
|||||||
@@ -257,40 +257,6 @@ class TestWorkflowAccessMethods:
|
|||||||
assert access.can_add({'organization': 1})
|
assert access.can_add({'organization': 1})
|
||||||
|
|
||||||
|
|
||||||
class TestCheckLicense:
|
|
||||||
@pytest.fixture
|
|
||||||
def validate_enhancements_mocker(self, mocker):
|
|
||||||
os.environ['SKIP_LICENSE_FIXUP_FOR_TEST'] = '1'
|
|
||||||
|
|
||||||
def fn(available_instances=1, free_instances=0, host_exists=False):
|
|
||||||
|
|
||||||
class MockFilter:
|
|
||||||
def exists(self):
|
|
||||||
return host_exists
|
|
||||||
|
|
||||||
mocker.patch('tower_license.TowerLicense.validate', return_value={'free_instances': free_instances, 'available_instances': available_instances, 'date_warning': True})
|
|
||||||
|
|
||||||
mock_filter = MockFilter()
|
|
||||||
mocker.patch('awx.main.models.Host.objects.filter', return_value=mock_filter)
|
|
||||||
|
|
||||||
return fn
|
|
||||||
|
|
||||||
def test_check_license_add_host_duplicate(self, validate_enhancements_mocker, user_unit):
|
|
||||||
validate_enhancements_mocker(available_instances=1, free_instances=0, host_exists=True)
|
|
||||||
|
|
||||||
BaseAccess(None).check_license(add_host_name='blah', check_expiration=False)
|
|
||||||
|
|
||||||
def test_check_license_add_host_new_exceed_licence(self, validate_enhancements_mocker, user_unit, mocker):
|
|
||||||
validate_enhancements_mocker(available_instances=1, free_instances=0, host_exists=False)
|
|
||||||
exception = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
BaseAccess(None).check_license(add_host_name='blah', check_expiration=False)
|
|
||||||
except PermissionDenied as e:
|
|
||||||
exception = e
|
|
||||||
|
|
||||||
assert "License count of 1 instances has been reached." == str(exception)
|
|
||||||
|
|
||||||
|
|
||||||
def test_user_capabilities_method():
|
def test_user_capabilities_method():
|
||||||
"""Unit test to verify that the user_capabilities method will defer
|
"""Unit test to verify that the user_capabilities method will defer
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ from awx.main.models import (
|
|||||||
from awx.main import tasks
|
from awx.main import tasks
|
||||||
from awx.main.utils import encrypt_field
|
from awx.main.utils import encrypt_field
|
||||||
|
|
||||||
from tower_license import TowerLicense
|
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
@@ -79,27 +78,6 @@ def test_send_notifications_list(mocker):
|
|||||||
assert mock_job.notifications.add.called_with(*mock_notifications)
|
assert mock_job.notifications.add.called_with(*mock_notifications)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("current_instances,call_count", [(91, 2), (89,1)])
|
|
||||||
def test_run_admin_checks_usage(mocker, current_instances, call_count):
|
|
||||||
patches = list()
|
|
||||||
patches.append(mocker.patch('awx.main.tasks.User'))
|
|
||||||
|
|
||||||
mock_te = mocker.Mock(spec=TowerLicense)
|
|
||||||
mock_te.validate.return_value = {'instance_count': 100, 'current_instances': current_instances, 'date_warning': True}
|
|
||||||
patches.append(mocker.patch('tower_license.TowerLicense', return_value=mock_te))
|
|
||||||
|
|
||||||
mock_sm = mocker.Mock()
|
|
||||||
patches.append(mocker.patch('awx.main.tasks.send_mail', wraps=mock_sm))
|
|
||||||
|
|
||||||
with apply_patches(patches):
|
|
||||||
tasks.run_administrative_checks()
|
|
||||||
assert mock_sm.called
|
|
||||||
if call_count == 2:
|
|
||||||
assert '90%' in mock_sm.call_args_list[0][0][0]
|
|
||||||
else:
|
|
||||||
assert 'expire' in mock_sm.call_args_list[0][0][0]
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("key,value", [
|
@pytest.mark.parametrize("key,value", [
|
||||||
('REST_API_TOKEN', 'SECRET'),
|
('REST_API_TOKEN', 'SECRET'),
|
||||||
('SECRET_KEY', 'SECRET'),
|
('SECRET_KEY', 'SECRET'),
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ FROM centos:7
|
|||||||
|
|
||||||
ADD Makefile /tmp/Makefile
|
ADD Makefile /tmp/Makefile
|
||||||
RUN mkdir /tmp/requirements
|
RUN mkdir /tmp/requirements
|
||||||
COPY tools/docker-compose/tower-license/dist/tower-license-0.1.tar.gz /tmp/tower-license.tar.gz
|
|
||||||
ADD requirements/requirements.txt \
|
ADD requirements/requirements.txt \
|
||||||
requirements/requirements_git.txt \
|
requirements/requirements_git.txt \
|
||||||
requirements/requirements_ansible.txt \
|
requirements/requirements_ansible.txt \
|
||||||
@@ -34,7 +33,6 @@ RUN openssl req -nodes -newkey rsa:2048 -keyout /etc/nginx/nginx.key -out /etc/n
|
|||||||
RUN openssl x509 -req -days 365 -in /etc/nginx/nginx.csr -signkey /etc/nginx/nginx.key -out /etc/nginx/nginx.crt
|
RUN openssl x509 -req -days 365 -in /etc/nginx/nginx.csr -signkey /etc/nginx/nginx.key -out /etc/nginx/nginx.crt
|
||||||
WORKDIR /tmp
|
WORKDIR /tmp
|
||||||
RUN SWIG_FEATURES="-cpperraswarn -includeall -D__`uname -m`__ -I/usr/include/openssl" VENV_BASE="/venv" make requirements_dev
|
RUN SWIG_FEATURES="-cpperraswarn -includeall -D__`uname -m`__ -I/usr/include/openssl" VENV_BASE="/venv" make requirements_dev
|
||||||
RUN /venv/tower/bin/pip install /tmp/tower-license.tar.gz
|
|
||||||
RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8
|
RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG en_US.UTF-8
|
||||||
ENV LANGUAGE en_US:en
|
ENV LANGUAGE en_US:en
|
||||||
|
|||||||
Reference in New Issue
Block a user