mirror of
https://github.com/ansible-collections/kubernetes.core.git
synced 2026-05-06 13:02:37 +00:00
Support resource definition using manifest URL (#478)
Support resource definition using manifest URL SUMMARY Closes #451 ISSUE TYPE Feature Pull Request COMPONENT NAME k8s k8s_scale k8s_service Reviewed-by: Mike Graves <mgraves@redhat.com> Reviewed-by: Abhijeet Kasurde <None> Reviewed-by: Bikouo Aubin <None>
This commit is contained in:
@@ -26,6 +26,7 @@ import traceback
|
||||
import sys
|
||||
import hashlib
|
||||
from datetime import datetime
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
from ansible_collections.kubernetes.core.plugins.module_utils.version import (
|
||||
LooseVersion,
|
||||
@@ -47,6 +48,7 @@ from ansible.module_utils.six import iteritems, string_types
|
||||
from ansible.module_utils._text import to_native, to_bytes, to_text
|
||||
from ansible.module_utils.common.dict_transformations import dict_merge
|
||||
from ansible.module_utils.parsing.convert_bool import boolean
|
||||
from ansible.module_utils.urls import Request
|
||||
|
||||
K8S_IMP_ERR = None
|
||||
try:
|
||||
@@ -342,6 +344,28 @@ def get_api_client(module=None, **kwargs):
|
||||
get_api_client._pool = {}
|
||||
|
||||
|
||||
def fetch_file_from_url(module, url):
|
||||
# Download file
|
||||
bufsize = 65536
|
||||
file_name, file_ext = os.path.splitext(str(url.rsplit("/", 1)[1]))
|
||||
temp_file = NamedTemporaryFile(
|
||||
dir=module.tmpdir, prefix=file_name, suffix=file_ext, delete=False
|
||||
)
|
||||
module.add_cleanup_file(temp_file.name)
|
||||
try:
|
||||
rsp = Request().open("GET", url)
|
||||
if not rsp:
|
||||
module.fail_json(msg="Failure downloading %s" % url)
|
||||
data = rsp.read(bufsize)
|
||||
while data:
|
||||
temp_file.write(data)
|
||||
data = rsp.read(bufsize)
|
||||
temp_file.close()
|
||||
except Exception as e:
|
||||
module.fail_json(msg="Failure downloading %s, %s" % (url, to_native(e)))
|
||||
return temp_file.name
|
||||
|
||||
|
||||
class K8sAnsibleMixin(object):
|
||||
def __init__(self, module, pyyaml_required=True, *args, **kwargs):
|
||||
module.deprecate(
|
||||
@@ -529,8 +553,15 @@ class K8sAnsibleMixin(object):
|
||||
if alias in self.params:
|
||||
self.params.pop(alias)
|
||||
|
||||
def load_resource_definitions(self, src):
|
||||
def load_resource_definitions(self, src, module=None):
|
||||
"""Load the requested src path"""
|
||||
if module and (
|
||||
src.startswith("https://")
|
||||
or src.startswith("http://")
|
||||
or src.startswith("ftp://")
|
||||
):
|
||||
src = fetch_file_from_url(module, src)
|
||||
|
||||
result = None
|
||||
path = os.path.normpath(src)
|
||||
if not os.path.exists(path):
|
||||
@@ -745,7 +776,7 @@ class K8sAnsibleMixin(object):
|
||||
|
||||
src = module.params.get("src")
|
||||
if src:
|
||||
self.resource_definitions = self.load_resource_definitions(src)
|
||||
self.resource_definitions = self.load_resource_definitions(src, module)
|
||||
try:
|
||||
self.resource_definitions = [
|
||||
item for item in self.resource_definitions if item
|
||||
@@ -853,9 +884,9 @@ class K8sAnsibleMixin(object):
|
||||
definition["apiVersion"] = resource.group_version
|
||||
metadata = definition.get("metadata", {})
|
||||
if not metadata.get("name") and not metadata.get("generateName"):
|
||||
if self.name:
|
||||
if hasattr(self, "name") and self.name:
|
||||
metadata["name"] = self.name
|
||||
elif self.generate_name:
|
||||
elif hasattr(self, "generate_name") and self.generate_name:
|
||||
metadata["generateName"] = self.generate_name
|
||||
if resource.namespaced and self.namespace and not metadata.get("namespace"):
|
||||
metadata["namespace"] = self.namespace
|
||||
|
||||
@@ -5,6 +5,7 @@ import os
|
||||
from typing import cast, Dict, Iterable, List, Optional, Union
|
||||
|
||||
from ansible.module_utils.six import string_types
|
||||
from ansible.module_utils.urls import Request
|
||||
|
||||
try:
|
||||
import yaml
|
||||
@@ -53,7 +54,11 @@ def create_definitions(params: Dict) -> List[ResourceDefinition]:
|
||||
definitions = from_yaml(d)
|
||||
elif params.get("src"):
|
||||
d = cast(str, params.get("src"))
|
||||
definitions = from_file(d)
|
||||
if hasattr(d, "startswith") and d.startswith(("https://", "http://", "ftp://")):
|
||||
data = Request().open("GET", d).read().decode("utf8")
|
||||
definitions = from_yaml(data)
|
||||
else:
|
||||
definitions = from_file(d)
|
||||
else:
|
||||
# We'll create an empty definition and let merge_params set values
|
||||
# from the module parameters.
|
||||
|
||||
@@ -305,7 +305,6 @@ class K8sService:
|
||||
def create(self, resource: Resource, definition: Dict) -> Dict:
|
||||
namespace = definition["metadata"].get("namespace")
|
||||
name = definition["metadata"].get("name")
|
||||
results = {"changed": False, "result": {}}
|
||||
|
||||
if self.module.check_mode and not self.client.dry_run:
|
||||
k8s_obj = _encode_stringdata(definition)
|
||||
@@ -327,7 +326,7 @@ class K8sService:
|
||||
name
|
||||
)
|
||||
)
|
||||
return results
|
||||
return dict()
|
||||
except Exception as e:
|
||||
reason = e.body if hasattr(e, "body") else e
|
||||
msg = "Failed to create object: {0}".format(reason)
|
||||
|
||||
Reference in New Issue
Block a user