mirror of
https://github.com/ansible/awx.git
synced 2026-05-24 09:07:45 -02:30
Merge pull request #3749 from AlanCoding/simple_openstack
Use common method for openstack OS_CLIENT_CONFIG_FILE injection Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import json
|
import json
|
||||||
|
import yaml
|
||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
import tempfile
|
import tempfile
|
||||||
@@ -62,3 +63,32 @@ def vmware(cred, env, private_data_dir):
|
|||||||
env['VMWARE_PASSWORD'] = cred.get_input('password', default='')
|
env['VMWARE_PASSWORD'] = cred.get_input('password', default='')
|
||||||
env['VMWARE_HOST'] = cred.get_input('host', default='')
|
env['VMWARE_HOST'] = cred.get_input('host', default='')
|
||||||
env['VMWARE_VALIDATE_CERTS'] = str(settings.VMWARE_VALIDATE_CERTS)
|
env['VMWARE_VALIDATE_CERTS'] = str(settings.VMWARE_VALIDATE_CERTS)
|
||||||
|
|
||||||
|
|
||||||
|
def _openstack_data(cred):
|
||||||
|
openstack_auth = dict(auth_url=cred.get_input('host', default=''),
|
||||||
|
username=cred.get_input('username', default=''),
|
||||||
|
password=cred.get_input('password', default=''),
|
||||||
|
project_name=cred.get_input('project', default=''))
|
||||||
|
if cred.has_input('domain'):
|
||||||
|
openstack_auth['domain_name'] = cred.get_input('domain', default='')
|
||||||
|
verify_state = cred.get_input('verify_ssl', default=True)
|
||||||
|
openstack_data = {
|
||||||
|
'clouds': {
|
||||||
|
'devstack': {
|
||||||
|
'auth': openstack_auth,
|
||||||
|
'verify': verify_state,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return openstack_data
|
||||||
|
|
||||||
|
|
||||||
|
def openstack(cred, env, private_data_dir):
|
||||||
|
handle, path = tempfile.mkstemp(dir=private_data_dir)
|
||||||
|
f = os.fdopen(handle, 'w')
|
||||||
|
openstack_data = _openstack_data(cred)
|
||||||
|
yaml.safe_dump(openstack_data, f, default_flow_style=False, allow_unicode=True)
|
||||||
|
f.close()
|
||||||
|
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
|
||||||
|
env['OS_CLIENT_CONFIG_FILE'] = path
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ from awx.main.models.notifications import (
|
|||||||
NotificationTemplate,
|
NotificationTemplate,
|
||||||
JobNotificationMixin,
|
JobNotificationMixin,
|
||||||
)
|
)
|
||||||
|
from awx.main.models.credential.injectors import _openstack_data
|
||||||
from awx.main.utils import _inventory_updates, region_sorting, get_licenser
|
from awx.main.utils import _inventory_updates, region_sorting, get_licenser
|
||||||
|
|
||||||
|
|
||||||
@@ -2463,25 +2464,10 @@ class openstack(PluginFileInjector):
|
|||||||
def script_name(self):
|
def script_name(self):
|
||||||
return 'openstack_inventory.py' # exception
|
return 'openstack_inventory.py' # exception
|
||||||
|
|
||||||
def _get_clouds_dict(self, inventory_update, credential, private_data_dir, mk_cache=True):
|
def _get_clouds_dict(self, inventory_update, cred, private_data_dir, mk_cache=True):
|
||||||
openstack_auth = dict(auth_url=credential.get_input('host', default=''),
|
openstack_data = _openstack_data(cred)
|
||||||
username=credential.get_input('username', default=''),
|
|
||||||
password=credential.get_input('password', default=''),
|
|
||||||
project_name=credential.get_input('project', default=''))
|
|
||||||
if credential.has_input('domain'):
|
|
||||||
openstack_auth['domain_name'] = credential.get_input('domain', default='')
|
|
||||||
|
|
||||||
private_state = inventory_update.source_vars_dict.get('private', True)
|
openstack_data['clouds']['devstack']['private'] = inventory_update.source_vars_dict.get('private', True)
|
||||||
verify_state = credential.get_input('verify_ssl', default=True)
|
|
||||||
openstack_data = {
|
|
||||||
'clouds': {
|
|
||||||
'devstack': {
|
|
||||||
'private': private_state,
|
|
||||||
'verify': verify_state,
|
|
||||||
'auth': openstack_auth,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
if mk_cache:
|
if mk_cache:
|
||||||
# Retrieve cache path from inventory update vars if available,
|
# Retrieve cache path from inventory update vars if available,
|
||||||
# otherwise create a temporary cache path only for this update.
|
# otherwise create a temporary cache path only for this update.
|
||||||
@@ -2508,26 +2494,25 @@ class openstack(PluginFileInjector):
|
|||||||
openstack_data['ansible'] = ansible_variables
|
openstack_data['ansible'] = ansible_variables
|
||||||
return openstack_data
|
return openstack_data
|
||||||
|
|
||||||
def build_script_private_data(self, inventory_update, private_data_dir):
|
def build_script_private_data(self, inventory_update, private_data_dir, mk_cache=True):
|
||||||
credential = inventory_update.get_cloud_credential()
|
credential = inventory_update.get_cloud_credential()
|
||||||
private_data = {'credentials': {}}
|
private_data = {'credentials': {}}
|
||||||
|
|
||||||
openstack_data = self._get_clouds_dict(inventory_update, credential, private_data_dir)
|
openstack_data = self._get_clouds_dict(inventory_update, credential, private_data_dir, mk_cache=mk_cache)
|
||||||
private_data['credentials'][credential] = yaml.safe_dump(
|
private_data['credentials'][credential] = yaml.safe_dump(
|
||||||
openstack_data, default_flow_style=False, allow_unicode=True
|
openstack_data, default_flow_style=False, allow_unicode=True
|
||||||
)
|
)
|
||||||
return private_data
|
return private_data
|
||||||
|
|
||||||
|
def build_plugin_private_data(self, inventory_update, private_data_dir):
|
||||||
|
# Credentials can be passed in the same way as the script did
|
||||||
|
# but do not create the tmp cache file
|
||||||
|
return self.build_script_private_data(inventory_update, private_data_dir, mk_cache=False)
|
||||||
|
|
||||||
|
def get_plugin_env(self, inventory_update, private_data_dir, private_data_files):
|
||||||
|
return self.get_script_env(inventory_update, private_data_dir, private_data_files)
|
||||||
|
|
||||||
def inventory_as_dict(self, inventory_update, private_data_dir):
|
def inventory_as_dict(self, inventory_update, private_data_dir):
|
||||||
credential = inventory_update.get_cloud_credential()
|
|
||||||
|
|
||||||
openstack_data = self._get_clouds_dict(inventory_update, credential, private_data_dir, mk_cache=False)
|
|
||||||
handle, path = tempfile.mkstemp(dir=private_data_dir)
|
|
||||||
f = os.fdopen(handle, 'w')
|
|
||||||
yaml.dump(openstack_data, f, default_flow_style=False)
|
|
||||||
f.close()
|
|
||||||
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
|
|
||||||
|
|
||||||
def use_host_name_for_name(a_bool_maybe):
|
def use_host_name_for_name(a_bool_maybe):
|
||||||
if not isinstance(a_bool_maybe, bool):
|
if not isinstance(a_bool_maybe, bool):
|
||||||
# Could be specified by user via "host" or "uuid"
|
# Could be specified by user via "host" or "uuid"
|
||||||
@@ -2542,7 +2527,6 @@ class openstack(PluginFileInjector):
|
|||||||
fail_on_errors=True,
|
fail_on_errors=True,
|
||||||
expand_hostvars=True,
|
expand_hostvars=True,
|
||||||
inventory_hostname=use_host_name_for_name(False),
|
inventory_hostname=use_host_name_for_name(False),
|
||||||
clouds_yaml_path=[path] # why a list? it just is
|
|
||||||
)
|
)
|
||||||
# Note: mucking with defaults will break import integrity
|
# Note: mucking with defaults will break import integrity
|
||||||
# For the plugin, we need to use the same defaults as the old script
|
# For the plugin, we need to use the same defaults as the old script
|
||||||
|
|||||||
@@ -1340,24 +1340,6 @@ class RunJob(BaseTask):
|
|||||||
if credential.has_input('ssh_public_key_data'):
|
if credential.has_input('ssh_public_key_data'):
|
||||||
private_data.setdefault('certificates', {})[credential] = credential.get_input('ssh_public_key_data', default='')
|
private_data.setdefault('certificates', {})[credential] = credential.get_input('ssh_public_key_data', default='')
|
||||||
|
|
||||||
if credential.kind == 'openstack':
|
|
||||||
openstack_auth = dict(auth_url=credential.get_input('host', default=''),
|
|
||||||
username=credential.get_input('username', default=''),
|
|
||||||
password=credential.get_input('password', default=''),
|
|
||||||
project_name=credential.get_input('project', default=''))
|
|
||||||
if credential.has_input('domain'):
|
|
||||||
openstack_auth['domain_name'] = credential.get_input('domain', default='')
|
|
||||||
verify_state = credential.get_input('verify_ssl', default=True)
|
|
||||||
openstack_data = {
|
|
||||||
'clouds': {
|
|
||||||
'devstack': {
|
|
||||||
'auth': openstack_auth,
|
|
||||||
'verify': verify_state,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
private_data['credentials'][credential] = yaml.safe_dump(openstack_data, default_flow_style=False, allow_unicode=True)
|
|
||||||
|
|
||||||
return private_data
|
return private_data
|
||||||
|
|
||||||
def build_passwords(self, job, runtime_passwords):
|
def build_passwords(self, job, runtime_passwords):
|
||||||
@@ -1450,9 +1432,6 @@ class RunJob(BaseTask):
|
|||||||
|
|
||||||
# Set environment variables for cloud credentials.
|
# Set environment variables for cloud credentials.
|
||||||
cred_files = private_data_files.get('credentials', {})
|
cred_files = private_data_files.get('credentials', {})
|
||||||
for cloud_cred in job.cloud_credentials:
|
|
||||||
if cloud_cred and cloud_cred.kind == 'openstack':
|
|
||||||
env['OS_CLIENT_CONFIG_FILE'] = cred_files.get(cloud_cred, '')
|
|
||||||
|
|
||||||
for network_cred in job.network_credentials:
|
for network_cred in job.network_credentials:
|
||||||
env['ANSIBLE_NET_USERNAME'] = network_cred.get_input('username', default='')
|
env['ANSIBLE_NET_USERNAME'] = network_cred.get_input('username', default='')
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
{
|
{
|
||||||
"ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS": "never"
|
"ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS": "never",
|
||||||
|
"OS_CLIENT_CONFIG_FILE": "{{ file_reference }}"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
clouds_yaml_path:
|
|
||||||
- {{ file_reference }}
|
|
||||||
expand_hostvars: true
|
expand_hostvars: true
|
||||||
fail_on_errors: true
|
fail_on_errors: true
|
||||||
inventory_hostname: uuid
|
inventory_hostname: uuid
|
||||||
|
|||||||
Reference in New Issue
Block a user