mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
jenkins_plugin: fix sanity checks (#5565)
* jenkins_plugin: fix sanity checks * update BOTMETA * add changelog fragment * fix copyright * Update plugins/module_utils/jenkins.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/module_utils/jenkins.py Co-authored-by: Felix Fontein <felix@fontein.de> Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
0624951e17
commit
8ad43fd774
9 changed files with 71 additions and 59 deletions
3
.github/BOTMETA.yml
vendored
3
.github/BOTMETA.yml
vendored
|
@ -284,6 +284,9 @@ files:
|
||||||
$module_utils/ipa.py:
|
$module_utils/ipa.py:
|
||||||
labels: ipa
|
labels: ipa
|
||||||
maintainers: $team_ipa
|
maintainers: $team_ipa
|
||||||
|
$module_utils/jenkins.py:
|
||||||
|
labels: jenkins
|
||||||
|
maintainers: russoz
|
||||||
$module_utils/manageiq.py:
|
$module_utils/manageiq.py:
|
||||||
labels: manageiq
|
labels: manageiq
|
||||||
maintainers: $team_manageiq
|
maintainers: $team_manageiq
|
||||||
|
|
2
changelogs/fragments/5565-jenkins-plugin-sanity.yml
Normal file
2
changelogs/fragments/5565-jenkins-plugin-sanity.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- jenkins_plugin - refactor code to module util to fix sanity check (https://github.com/ansible-collections/community.general/pull/5565).
|
35
plugins/module_utils/jenkins.py
Normal file
35
plugins/module_utils/jenkins.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright (c) 2022, Alexei Znamensky <russoz@gmail.com>
|
||||||
|
#
|
||||||
|
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
from __future__ import absolute_import, division, print_function
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
def download_updates_file(updates_expiration):
|
||||||
|
updates_filename = 'jenkins-plugin-cache.json'
|
||||||
|
updates_dir = os.path.expanduser('~/.ansible/tmp')
|
||||||
|
updates_file = os.path.join(updates_dir, updates_filename)
|
||||||
|
download_updates = True
|
||||||
|
|
||||||
|
# Make sure the destination directory exists
|
||||||
|
if not os.path.isdir(updates_dir):
|
||||||
|
os.makedirs(updates_dir, 0o700)
|
||||||
|
|
||||||
|
# Check if we need to download new updates file
|
||||||
|
if os.path.isfile(updates_file):
|
||||||
|
# Get timestamp when the file was changed last time
|
||||||
|
ts_file = os.stat(updates_file).st_mtime
|
||||||
|
ts_now = time.time()
|
||||||
|
|
||||||
|
if ts_now - ts_file < updates_expiration:
|
||||||
|
download_updates = False
|
||||||
|
|
||||||
|
return updates_file, download_updates
|
|
@ -290,12 +290,6 @@ state:
|
||||||
sample: "present"
|
sample: "present"
|
||||||
'''
|
'''
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule, to_bytes
|
|
||||||
from ansible.module_utils.six.moves import http_cookiejar as cookiejar
|
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlencode
|
|
||||||
from ansible.module_utils.urls import fetch_url, url_argument_spec
|
|
||||||
from ansible.module_utils.six import text_type, binary_type
|
|
||||||
from ansible.module_utils.common.text.converters import to_native
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
|
@ -303,6 +297,15 @@ import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule, to_bytes
|
||||||
|
from ansible.module_utils.six.moves import http_cookiejar as cookiejar
|
||||||
|
from ansible.module_utils.six.moves.urllib.parse import urlencode
|
||||||
|
from ansible.module_utils.urls import fetch_url, url_argument_spec
|
||||||
|
from ansible.module_utils.six import text_type, binary_type
|
||||||
|
from ansible.module_utils.common.text.converters import to_native
|
||||||
|
|
||||||
|
from ansible_collections.community.general.plugins.module_utils.jenkins import download_updates_file
|
||||||
|
|
||||||
|
|
||||||
class FailedInstallingWithPluginManager(Exception):
|
class FailedInstallingWithPluginManager(Exception):
|
||||||
pass
|
pass
|
||||||
|
@ -605,21 +608,12 @@ class JenkinsPlugin(object):
|
||||||
return urls
|
return urls
|
||||||
|
|
||||||
def _download_updates(self):
|
def _download_updates(self):
|
||||||
updates_filename = 'jenkins-plugin-cache.json'
|
try:
|
||||||
updates_dir = os.path.expanduser('~/.ansible/tmp')
|
updates_file, download_updates = download_updates_file(self.params['updates_expiration'])
|
||||||
updates_file = "%s/%s" % (updates_dir, updates_filename)
|
except OSError as e:
|
||||||
download_updates = True
|
self.module.fail_json(
|
||||||
|
msg="Cannot create temporal directory.",
|
||||||
# Check if we need to download new updates file
|
details=to_native(e))
|
||||||
if os.path.isfile(updates_file):
|
|
||||||
# Get timestamp when the file was changed last time
|
|
||||||
ts_file = os.stat(updates_file).st_mtime
|
|
||||||
ts_now = time.time()
|
|
||||||
|
|
||||||
if ts_now - ts_file < self.params['updates_expiration']:
|
|
||||||
download_updates = False
|
|
||||||
|
|
||||||
updates_file_orig = updates_file
|
|
||||||
|
|
||||||
# Download the updates file if needed
|
# Download the updates file if needed
|
||||||
if download_updates:
|
if download_updates:
|
||||||
|
@ -632,56 +626,39 @@ class JenkinsPlugin(object):
|
||||||
msg_exception="Updates download failed.")
|
msg_exception="Updates download failed.")
|
||||||
|
|
||||||
# Write the updates file
|
# Write the updates file
|
||||||
update_fd, updates_file = tempfile.mkstemp()
|
tmp_update_fd, tmp_updates_file = tempfile.mkstemp()
|
||||||
os.write(update_fd, r.read())
|
os.write(tmp_update_fd, r.read())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.close(update_fd)
|
os.close(tmp_update_fd)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
self.module.fail_json(
|
self.module.fail_json(
|
||||||
msg="Cannot close the tmp updates file %s." % updates_file,
|
msg="Cannot close the tmp updates file %s." % tmp_updates_file,
|
||||||
details=to_native(e))
|
details=to_native(e))
|
||||||
|
|
||||||
# Open the updates file
|
# Open the updates file
|
||||||
try:
|
try:
|
||||||
f = io.open(updates_file, encoding='utf-8')
|
f = io.open(tmp_updates_file, encoding='utf-8')
|
||||||
|
|
||||||
|
# Read only the second line
|
||||||
|
dummy = f.readline()
|
||||||
|
data = json.loads(f.readline())
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
self.module.fail_json(
|
self.module.fail_json(
|
||||||
msg="Cannot open temporal updates file.",
|
msg="Cannot open temporal updates file.",
|
||||||
details=to_native(e))
|
details=to_native(e))
|
||||||
|
except Exception as e:
|
||||||
i = 0
|
self.module.fail_json(
|
||||||
for line in f:
|
msg="Cannot load JSON data from the tmp updates file.",
|
||||||
# Read only the second line
|
details=to_native(e))
|
||||||
if i == 1:
|
|
||||||
try:
|
|
||||||
data = json.loads(line)
|
|
||||||
except Exception as e:
|
|
||||||
self.module.fail_json(
|
|
||||||
msg="Cannot load JSON data from the tmp updates file.",
|
|
||||||
details=to_native(e))
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# Move the updates file to the right place if we could read it
|
# Move the updates file to the right place if we could read it
|
||||||
if download_updates:
|
if download_updates:
|
||||||
# Make sure the destination directory exists
|
self.module.atomic_move(tmp_updates_file, updates_file)
|
||||||
if not os.path.isdir(updates_dir):
|
|
||||||
try:
|
|
||||||
os.makedirs(updates_dir, int('0700', 8))
|
|
||||||
except OSError as e:
|
|
||||||
self.module.fail_json(
|
|
||||||
msg="Cannot create temporal directory.",
|
|
||||||
details=to_native(e))
|
|
||||||
|
|
||||||
self.module.atomic_move(updates_file, updates_file_orig)
|
|
||||||
|
|
||||||
# Check if we have the plugin data available
|
# Check if we have the plugin data available
|
||||||
if 'plugins' not in data or self.params['name'] not in data['plugins']:
|
if not data.get('plugins', {}).get(self.params['name']):
|
||||||
self.module.fail_json(
|
self.module.fail_json(msg="Cannot find plugin data in the updates file.")
|
||||||
msg="Cannot find plugin data in the updates file.")
|
|
||||||
|
|
||||||
return data['plugins'][self.params['name']]
|
return data['plugins'][self.params['name']]
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ plugins/modules/consul.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
||||||
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/jenkins_plugin.py use-argspec-type-path
|
|
||||||
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
||||||
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
||||||
|
|
|
@ -4,7 +4,6 @@ plugins/modules/consul.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
||||||
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/jenkins_plugin.py use-argspec-type-path
|
|
||||||
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
||||||
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
||||||
|
|
|
@ -4,7 +4,6 @@ plugins/modules/consul.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
||||||
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/jenkins_plugin.py use-argspec-type-path
|
|
||||||
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
||||||
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
||||||
|
|
|
@ -5,7 +5,6 @@ plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choic
|
||||||
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
||||||
plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt'
|
plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt'
|
||||||
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/jenkins_plugin.py use-argspec-type-path
|
|
||||||
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
||||||
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
||||||
|
|
|
@ -5,7 +5,6 @@ plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choic
|
||||||
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
plugins/modules/gconftool2.py validate-modules:parameter-state-invalid-choice # state=get - removed in 8.0.0
|
||||||
plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt'
|
plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt'
|
||||||
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
plugins/modules/iptables_state.py validate-modules:undocumented-parameter
|
||||||
plugins/modules/jenkins_plugin.py use-argspec-type-path
|
|
||||||
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
|
||||||
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
plugins/modules/manageiq_policies.py validate-modules:parameter-state-invalid-choice
|
||||||
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
plugins/modules/manageiq_provider.py validate-modules:doc-choices-do-not-match-spec # missing docs on suboptions
|
||||||
|
|
Loading…
Reference in a new issue