mirror of
https://github.com/ansible/awx.git
synced 2026-03-01 08:48:46 -03:30
Add support for Insights as an inventory source
This commit is contained in:
@@ -14,7 +14,7 @@ __all__ = [
|
|||||||
'STANDARD_INVENTORY_UPDATE_ENV',
|
'STANDARD_INVENTORY_UPDATE_ENV',
|
||||||
]
|
]
|
||||||
|
|
||||||
CLOUD_PROVIDERS = ('azure_rm', 'ec2', 'gce', 'vmware', 'openstack', 'rhv', 'satellite6', 'tower')
|
CLOUD_PROVIDERS = ('azure_rm', 'ec2', 'gce', 'vmware', 'openstack', 'rhv', 'satellite6', 'tower', 'insights')
|
||||||
PRIVILEGE_ESCALATION_METHODS = [
|
PRIVILEGE_ESCALATION_METHODS = [
|
||||||
('sudo', _('Sudo')),
|
('sudo', _('Sudo')),
|
||||||
('su', _('Su')),
|
('su', _('Su')),
|
||||||
|
|||||||
59
awx/main/migrations/0146_add_insights_inventory.py
Normal file
59
awx/main/migrations/0146_add_insights_inventory.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Generated by Django 2.2.16 on 2021-06-08 18:59
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('main', '0145_deregister_managed_ee_objs'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='host',
|
||||||
|
name='insights_system_id',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='inventorysource',
|
||||||
|
name='source',
|
||||||
|
field=models.CharField(
|
||||||
|
choices=[
|
||||||
|
('file', 'File, Directory or Script'),
|
||||||
|
('scm', 'Sourced from a Project'),
|
||||||
|
('ec2', 'Amazon EC2'),
|
||||||
|
('gce', 'Google Compute Engine'),
|
||||||
|
('azure_rm', 'Microsoft Azure Resource Manager'),
|
||||||
|
('vmware', 'VMware vCenter'),
|
||||||
|
('satellite6', 'Red Hat Satellite 6'),
|
||||||
|
('openstack', 'OpenStack'),
|
||||||
|
('rhv', 'Red Hat Virtualization'),
|
||||||
|
('tower', 'Ansible Tower'),
|
||||||
|
('insights', 'Red Hat Insights'),
|
||||||
|
],
|
||||||
|
default=None,
|
||||||
|
max_length=32,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='inventoryupdate',
|
||||||
|
name='source',
|
||||||
|
field=models.CharField(
|
||||||
|
choices=[
|
||||||
|
('file', 'File, Directory or Script'),
|
||||||
|
('scm', 'Sourced from a Project'),
|
||||||
|
('ec2', 'Amazon EC2'),
|
||||||
|
('gce', 'Google Compute Engine'),
|
||||||
|
('azure_rm', 'Microsoft Azure Resource Manager'),
|
||||||
|
('vmware', 'VMware vCenter'),
|
||||||
|
('satellite6', 'Red Hat Satellite 6'),
|
||||||
|
('openstack', 'OpenStack'),
|
||||||
|
('rhv', 'Red Hat Virtualization'),
|
||||||
|
('tower', 'Ansible Tower'),
|
||||||
|
('insights', 'Red Hat Insights'),
|
||||||
|
],
|
||||||
|
default=None,
|
||||||
|
max_length=32,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -954,6 +954,10 @@ ManagedCredentialType(
|
|||||||
"scm_username": "{{username}}",
|
"scm_username": "{{username}}",
|
||||||
"scm_password": "{{password}}",
|
"scm_password": "{{password}}",
|
||||||
},
|
},
|
||||||
|
'env': {
|
||||||
|
'INSIGHTS_USER': '{{username}}',
|
||||||
|
'INSIGHTS_PASSWORD': '{{password}}',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -828,6 +828,7 @@ class InventorySourceOptions(BaseModel):
|
|||||||
('openstack', _('OpenStack')),
|
('openstack', _('OpenStack')),
|
||||||
('rhv', _('Red Hat Virtualization')),
|
('rhv', _('Red Hat Virtualization')),
|
||||||
('tower', _('Ansible Tower')),
|
('tower', _('Ansible Tower')),
|
||||||
|
('insights', _('Red Hat Insights')),
|
||||||
]
|
]
|
||||||
|
|
||||||
# From the options of the Django management base command
|
# From the options of the Django management base command
|
||||||
@@ -1548,5 +1549,21 @@ class tower(PluginFileInjector):
|
|||||||
collection = 'awx'
|
collection = 'awx'
|
||||||
|
|
||||||
|
|
||||||
|
class insights(PluginFileInjector):
|
||||||
|
plugin_name = 'insights'
|
||||||
|
base_injector = 'template'
|
||||||
|
namespace = 'redhatinsights'
|
||||||
|
collection = 'insights'
|
||||||
|
downstream_namespace = 'redhat'
|
||||||
|
downstream_collection = 'insights'
|
||||||
|
use_fqcn = 'true'
|
||||||
|
|
||||||
|
def inventory_as_dict(self, inventory_update, private_data_dir):
|
||||||
|
ret = super(insights, self).inventory_as_dict(inventory_update, private_data_dir)
|
||||||
|
# this inventory plugin requires the fully qualified inventory plugin name
|
||||||
|
ret['plugin'] = f'{self.namespace}.{self.collection}.{self.plugin_name}'
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
for cls in PluginFileInjector.__subclasses__():
|
for cls in PluginFileInjector.__subclasses__():
|
||||||
InventorySourceOptions.injectors[cls.__name__] = cls
|
InventorySourceOptions.injectors[cls.__name__] = cls
|
||||||
|
|||||||
5
awx/main/tests/data/inventory/plugins/insights/env.json
Normal file
5
awx/main/tests/data/inventory/plugins/insights/env.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS": "never",
|
||||||
|
"INSIGHTS_USER": "fooo",
|
||||||
|
"INSIGHTS_PASSWORD": "fooo"
|
||||||
|
}
|
||||||
@@ -652,6 +652,31 @@ def test_satellite6_create_ok(post, organization, admin):
|
|||||||
assert decrypt_field(cred, 'password') == 'some_password'
|
assert decrypt_field(cred, 'password') == 'some_password'
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# RH Insights Credentials
|
||||||
|
#
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_insights_create_ok(post, organization, admin):
|
||||||
|
params = {
|
||||||
|
'credential_type': 1,
|
||||||
|
'name': 'Best credential ever',
|
||||||
|
'inputs': {
|
||||||
|
'username': 'some_username',
|
||||||
|
'password': 'some_password',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
sat6 = CredentialType.defaults['insights']()
|
||||||
|
sat6.save()
|
||||||
|
params['organization'] = organization.id
|
||||||
|
response = post(reverse('api:credential_list'), params, admin)
|
||||||
|
assert response.status_code == 201
|
||||||
|
|
||||||
|
assert Credential.objects.count() == 1
|
||||||
|
cred = Credential.objects.all()[:1].get()
|
||||||
|
assert cred.inputs['username'] == 'some_username'
|
||||||
|
assert decrypt_field(cred, 'password') == 'some_password'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# AWS Credentials
|
# AWS Credentials
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -209,6 +209,7 @@ class TestInventorySourceInjectors:
|
|||||||
('vmware', 'community.vmware.vmware_vm_inventory'),
|
('vmware', 'community.vmware.vmware_vm_inventory'),
|
||||||
('rhv', 'ovirt.ovirt.ovirt'),
|
('rhv', 'ovirt.ovirt.ovirt'),
|
||||||
('satellite6', 'theforeman.foreman.foreman'),
|
('satellite6', 'theforeman.foreman.foreman'),
|
||||||
|
('insights', 'redhatinsights.insights.insights'),
|
||||||
('tower', 'awx.awx.tower'),
|
('tower', 'awx.awx.tower'),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1746,6 +1746,34 @@ class TestInventoryUpdateCredentials(TestJobExecution):
|
|||||||
assert env["FOREMAN_PASSWORD"] == "secret"
|
assert env["FOREMAN_PASSWORD"] == "secret"
|
||||||
assert safe_env["FOREMAN_PASSWORD"] == tasks.HIDDEN_PASSWORD
|
assert safe_env["FOREMAN_PASSWORD"] == tasks.HIDDEN_PASSWORD
|
||||||
|
|
||||||
|
def test_insights_source(self, inventory_update, private_data_dir, mocker):
|
||||||
|
task = tasks.RunInventoryUpdate()
|
||||||
|
task.instance = inventory_update
|
||||||
|
insights = CredentialType.defaults['insights']()
|
||||||
|
inventory_update.source = 'insights'
|
||||||
|
|
||||||
|
def get_cred():
|
||||||
|
cred = Credential(
|
||||||
|
pk=1,
|
||||||
|
credential_type=insights,
|
||||||
|
inputs={
|
||||||
|
'username': 'bob',
|
||||||
|
'password': 'secret',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
cred.inputs['password'] = encrypt_field(cred, 'password')
|
||||||
|
return cred
|
||||||
|
|
||||||
|
inventory_update.get_cloud_credential = get_cred
|
||||||
|
inventory_update.get_extra_credentials = mocker.Mock(return_value=[])
|
||||||
|
|
||||||
|
env = task.build_env(inventory_update, private_data_dir, False)
|
||||||
|
safe_env = build_safe_env(env)
|
||||||
|
|
||||||
|
assert env["INSIGHTS_USER"] == "bob"
|
||||||
|
assert env["INSIGHTS_PASSWORD"] == "secret"
|
||||||
|
assert safe_env['INSIGHTS_PASSWORD'] == tasks.HIDDEN_PASSWORD
|
||||||
|
|
||||||
@pytest.mark.parametrize('verify', [True, False])
|
@pytest.mark.parametrize('verify', [True, False])
|
||||||
def test_tower_source(self, verify, inventory_update, private_data_dir, mocker):
|
def test_tower_source(self, verify, inventory_update, private_data_dir, mocker):
|
||||||
task = tasks.RunInventoryUpdate()
|
task = tasks.RunInventoryUpdate()
|
||||||
|
|||||||
@@ -693,6 +693,14 @@ SATELLITE6_EXCLUDE_EMPTY_GROUPS = True
|
|||||||
SATELLITE6_INSTANCE_ID_VAR = 'foreman_id'
|
SATELLITE6_INSTANCE_ID_VAR = 'foreman_id'
|
||||||
# SATELLITE6_GROUP_PREFIX and SATELLITE6_GROUP_PATTERNS defined in source vars
|
# SATELLITE6_GROUP_PREFIX and SATELLITE6_GROUP_PATTERNS defined in source vars
|
||||||
|
|
||||||
|
# ----------------
|
||||||
|
# -- Red Hat Insights --
|
||||||
|
# ----------------
|
||||||
|
# INSIGHTS_ENABLED_VAR =
|
||||||
|
# INSIGHTS_ENABLED_VALUE =
|
||||||
|
INSIGHTS_INSTANCE_ID_VAR = 'insights_id'
|
||||||
|
INSIGHTS_EXCLUDE_EMPTY_GROUPS = False
|
||||||
|
|
||||||
# ---------------------
|
# ---------------------
|
||||||
# ----- Custom -----
|
# ----- Custom -----
|
||||||
# ---------------------
|
# ---------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user