Enhance maven_artifact with a keep_name option (#22339)
It allows retaining the version number in the downloaded artifact's name when the version to be downloaded is dynamically determined ('latest'). So far, the behavior was to overwrite the version string in the artifact name with 'latest' which leaves no trace of what version the downloaded artifact has. E.g., you cannot use this information for further processing like transferring it to an RPM that is built from the artifact. This fulfills feature request ansible/ansible#22337
This commit is contained in:
parent
3b20585ada
commit
8fc113219c
1 changed files with 30 additions and 4 deletions
|
@ -97,6 +97,14 @@ options:
|
|||
default: 'yes'
|
||||
choices: ['yes', 'no']
|
||||
version_added: "1.9.3"
|
||||
keep_name:
|
||||
description:
|
||||
- If C(yes), the downloaded artifact's name is preserved, i.e the version number remains part of it.
|
||||
- This option only has effect when C(dest) is a directory and C(version) is set to C(latest).
|
||||
required: false
|
||||
default: no
|
||||
choices: ['yes', 'no']
|
||||
version_added: "2.4"
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
|
@ -129,6 +137,14 @@ EXAMPLES = '''
|
|||
extension: war
|
||||
repository_url: 'https://repo.company.com/maven'
|
||||
dest: /var/lib/tomcat7/webapps/web-app.war
|
||||
|
||||
# Keep a downloaded artifact's name, i.e. retain the version
|
||||
- maven_artifact:
|
||||
version: latest
|
||||
artifact_id: spring-core
|
||||
group_id: org.springframework
|
||||
dest: /tmp/
|
||||
keep_name: yes
|
||||
'''
|
||||
|
||||
import hashlib
|
||||
|
@ -223,17 +239,21 @@ class MavenDownloader:
|
|||
base = base.rstrip("/")
|
||||
self.base = base
|
||||
self.user_agent = "Maven Artifact Downloader/1.0"
|
||||
self.latest_version_found = None
|
||||
|
||||
def _find_latest_version_available(self, artifact):
|
||||
def find_latest_version_available(self, artifact):
|
||||
if self.latest_version_found:
|
||||
return self.latest_version_found
|
||||
path = "/%s/maven-metadata.xml" % (artifact.path(False))
|
||||
xml = self._request(self.base + path, "Failed to download maven-metadata.xml", lambda r: etree.parse(r))
|
||||
v = xml.xpath("/metadata/versioning/versions/version[last()]/text()")
|
||||
if v:
|
||||
self.latest_version_found = v[0]
|
||||
return v[0]
|
||||
|
||||
def find_uri_for_artifact(self, artifact):
|
||||
if artifact.version == "latest":
|
||||
artifact.version = self._find_latest_version_available(artifact)
|
||||
artifact.version = self.find_latest_version_available(artifact)
|
||||
|
||||
if artifact.is_snapshot():
|
||||
path = "/%s/maven-metadata.xml" % (artifact.path())
|
||||
|
@ -287,7 +307,7 @@ class MavenDownloader:
|
|||
def download(self, artifact, filename=None):
|
||||
filename = artifact.get_filename(filename)
|
||||
if not artifact.version or artifact.version == "latest":
|
||||
artifact = Artifact(artifact.group_id, artifact.artifact_id, self._find_latest_version_available(artifact),
|
||||
artifact = Artifact(artifact.group_id, artifact.artifact_id, self.find_latest_version_available(artifact),
|
||||
artifact.classifier, artifact.extension)
|
||||
|
||||
url = self.find_uri_for_artifact(artifact)
|
||||
|
@ -349,6 +369,7 @@ class MavenDownloader:
|
|||
|
||||
|
||||
def main():
|
||||
|
||||
module = AnsibleModule(
|
||||
argument_spec = dict(
|
||||
group_id = dict(default=None),
|
||||
|
@ -363,6 +384,7 @@ def main():
|
|||
timeout = dict(default=10, type='int'),
|
||||
dest = dict(type="path", default=None),
|
||||
validate_certs = dict(required=False, default=True, type='bool'),
|
||||
keep_name = dict(required=False, default=False, type='bool'),
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -385,6 +407,7 @@ def main():
|
|||
extension = module.params["extension"]
|
||||
state = module.params["state"]
|
||||
dest = module.params["dest"]
|
||||
keep_name = module.params["keep_name"]
|
||||
|
||||
#downloader = MavenDownloader(module, repository_url, repository_username, repository_password)
|
||||
downloader = MavenDownloader(module, repository_url)
|
||||
|
@ -396,7 +419,10 @@ def main():
|
|||
|
||||
prev_state = "absent"
|
||||
if os.path.isdir(dest):
|
||||
dest = posixpath.join(dest, artifact_id + "-" + version + "." + extension)
|
||||
version_part = version
|
||||
if keep_name and version == 'latest':
|
||||
version_part = downloader.find_latest_version_available(artifact)
|
||||
dest = posixpath.join(dest, "%s-%s.%s" % (artifact_id, version_part, extension))
|
||||
if os.path.lexists(dest) and downloader.verify_md5(dest, downloader.find_uri_for_artifact(artifact) + '.md5'):
|
||||
prev_state = "present"
|
||||
else:
|
||||
|
|
Loading…
Reference in a new issue