AdoptOpenJDK/AdoptOpenJDKURLProvider.py (77 lines of code) (raw):
#!/usr/bin/python
#
# Copyright (c) Facebook, Inc. and its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""See docstring for AdoptOpenJDKURLProvider class"""
from __future__ import absolute_import, division, print_function, unicode_literals
import json
from autopkglib import ProcessorError
from autopkglib.URLGetter import URLGetter
try:
from urllib.parse import urljoin
except ImportError:
from urlparse import urljoin
__all__ = ["AdoptOpenJDKURLProvider"]
URL = "https://api.adoptopenjdk.net/v2/info/releases/"
class AdoptOpenJDKURLProvider(URLGetter):
"""Provides a version and dmg download for the AdoptOpenJDK."""
description = __doc__
input_variables = {
"jdk_version": {"required": True, "description": "Version of JDK to fetch."},
"jdk_type": {
"required": False,
"description": "Fetch 'jdk', or 'jre'. Defaults to 'jdk'.",
},
"jvm_type": {
"required": False,
"description": (
"Fetch a 'hotspot' or 'openj9' JVM target. Defaults to 'hotspot'."
),
},
"binary_type": {
"required": False,
"description": "Fetch a 'pkg' or 'tgz' download. Defaults to 'pkg'.",
},
"release": {
"required": False,
"description": "Fetch a specific release. Defaults to 'latest'.",
},
}
output_variables = {
"version": {"description": "Version of the product."},
"url": {"description": "Download URL."},
"checksum": {"description": "Checksum of the targeted product."},
}
def get_checksum(self, checksum_url, binary_type):
"""Get the expected checksum for the release."""
checksum_data = self.download(checksum_url, text=True)
return checksum_data.split()[0]
def main(self):
"""Find the download URL"""
jvm_type = self.env.get("jvm_type", "hotspot")
if jvm_type not in ["hotspot", "openj9"]:
raise ProcessorError("jvm_type can only be 'hotspot' or 'openj9'")
jdk_type = self.env.get("jdk_type", "jdk")
if jdk_type not in ["jdk", "jre"]:
raise ProcessorError("jdk_type can only be 'jdk' or 'jre'")
binary_type = self.env.get("binary_type", "pkg")
if binary_type not in ["pkg", "tgz"]:
raise ProcessorError("jdk_type can only be 'pkg' or 'tgz'")
release = self.env.get("release", "latest")
queries = "?os=mac&openjdk_impl={}&type={}&release={}".format(
jvm_type, jdk_type, release
)
# Fetch the API data
query_suffix = urljoin("openjdk{}".format(self.env["jdk_version"]), queries)
api_url = urljoin(URL, query_suffix)
self.output("Query URL: {}".format(api_url))
api_data = self.download(api_url, text=True)
api_results = json.loads(api_data)
# Determine what we're looking for - pkg or tgz
if binary_type == "pkg":
checksum_url = api_results["binaries"][0]["installer_checksum_link"]
url = api_results["binaries"][0]["installer_link"]
else:
checksum_url = api_results["binaries"][0]["checksum_link"]
url = api_results["binaries"][0]["binary_link"]
# Use semantic versioning for the version string, although historically this
# hasn't been anything particularly problematic
version = api_results["binaries"][0]["version_data"]["semver"]
self.env["version"] = version
self.output("Version: {}".format(version))
# Get the checksum from the internet
checksum = self.get_checksum(checksum_url, binary_type)
self.env["checksum"] = checksum
self.output("checksum: {}".format(checksum))
# Pick the URL
self.env["url"] = url
self.output("Found URL {}".format(self.env["url"]))
if __name__ == "__main__":
PROCESSOR = AdoptOpenJDKURLProvider()
PROCESSOR.execute_shell()