mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
189 lines
5.4 KiB
Python
189 lines
5.4 KiB
Python
|
#!/usr/bin/python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
# Copyright: (c) 2019, Ansible Project
|
||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||
|
|
||
|
from __future__ import absolute_import, division, print_function
|
||
|
|
||
|
__metaclass__ = type
|
||
|
|
||
|
|
||
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
||
|
'status': ['preview'],
|
||
|
'supported_by': 'community'}
|
||
|
|
||
|
DOCUMENTATION = '''
|
||
|
|
||
|
module: kubevirt_cdi_upload
|
||
|
|
||
|
short_description: Upload local VM images to CDI Upload Proxy.
|
||
|
|
||
|
|
||
|
author: KubeVirt Team (@kubevirt)
|
||
|
|
||
|
|
||
|
description:
|
||
|
- Use Openshift Python SDK to create UploadTokenRequest objects.
|
||
|
- Transfer contents of local files to the CDI Upload Proxy.
|
||
|
|
||
|
options:
|
||
|
pvc_name:
|
||
|
description:
|
||
|
- Use to specify the name of the target PersistentVolumeClaim.
|
||
|
required: true
|
||
|
pvc_namespace:
|
||
|
description:
|
||
|
- Use to specify the namespace of the target PersistentVolumeClaim.
|
||
|
required: true
|
||
|
upload_host:
|
||
|
description:
|
||
|
- URL containing the host and port on which the CDI Upload Proxy is available.
|
||
|
- "More info: U(https://github.com/kubevirt/containerized-data-importer/blob/master/doc/upload.md#expose-cdi-uploadproxy-service)"
|
||
|
upload_host_validate_certs:
|
||
|
description:
|
||
|
- Whether or not to verify the CDI Upload Proxy's SSL certificates against your system's CA trust store.
|
||
|
default: true
|
||
|
type: bool
|
||
|
aliases: [ upload_host_verify_ssl ]
|
||
|
path:
|
||
|
description:
|
||
|
- Path of local image file to transfer.
|
||
|
merge_type:
|
||
|
description:
|
||
|
- Whether to override the default patch merge approach with a specific type. By default, the strategic
|
||
|
merge will typically be used.
|
||
|
type: list
|
||
|
choices: [ json, merge, strategic-merge ]
|
||
|
|
||
|
extends_documentation_fragment:
|
||
|
- community.kubernetes.k8s_auth_options
|
||
|
|
||
|
|
||
|
requirements:
|
||
|
- python >= 2.7
|
||
|
- openshift >= 0.8.2
|
||
|
- requests >= 2.0.0
|
||
|
'''
|
||
|
|
||
|
EXAMPLES = '''
|
||
|
- name: Upload local image to pvc-vm1
|
||
|
kubevirt_cdi_upload:
|
||
|
pvc_namespace: default
|
||
|
pvc_name: pvc-vm1
|
||
|
upload_host: https://localhost:8443
|
||
|
upload_host_validate_certs: false
|
||
|
path: /tmp/cirros-0.4.0-x86_64-disk.img
|
||
|
'''
|
||
|
|
||
|
RETURN = '''# '''
|
||
|
|
||
|
import copy
|
||
|
import traceback
|
||
|
|
||
|
from collections import defaultdict
|
||
|
|
||
|
from ansible_collections.community.kubernetes.plugins.module_utils.k8s.common import AUTH_ARG_SPEC
|
||
|
from ansible_collections.community.kubernetes.plugins.module_utils.k8s.raw import KubernetesRawModule
|
||
|
|
||
|
# 3rd party imports
|
||
|
try:
|
||
|
import requests
|
||
|
HAS_REQUESTS = True
|
||
|
except ImportError:
|
||
|
HAS_REQUESTS = False
|
||
|
|
||
|
|
||
|
SERVICE_ARG_SPEC = {
|
||
|
'pvc_name': {'required': True},
|
||
|
'pvc_namespace': {'required': True},
|
||
|
'upload_host': {'required': True},
|
||
|
'upload_host_validate_certs': {
|
||
|
'type': 'bool',
|
||
|
'default': True,
|
||
|
'aliases': ['upload_host_verify_ssl']
|
||
|
},
|
||
|
'path': {'required': True},
|
||
|
'merge_type': {
|
||
|
'type': 'list',
|
||
|
'choices': ['json', 'merge', 'strategic-merge']
|
||
|
},
|
||
|
}
|
||
|
|
||
|
|
||
|
class KubeVirtCDIUpload(KubernetesRawModule):
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(KubeVirtCDIUpload, self).__init__(*args, k8s_kind='UploadTokenRequest', **kwargs)
|
||
|
|
||
|
if not HAS_REQUESTS:
|
||
|
self.fail("This module requires the python 'requests' package. Try `pip install requests`.")
|
||
|
|
||
|
@property
|
||
|
def argspec(self):
|
||
|
""" argspec property builder """
|
||
|
argument_spec = copy.deepcopy(AUTH_ARG_SPEC)
|
||
|
argument_spec.update(SERVICE_ARG_SPEC)
|
||
|
return argument_spec
|
||
|
|
||
|
def execute_module(self):
|
||
|
""" Module execution """
|
||
|
|
||
|
API = 'v1alpha1'
|
||
|
KIND = 'UploadTokenRequest'
|
||
|
|
||
|
self.client = self.get_api_client()
|
||
|
|
||
|
api_version = 'upload.cdi.kubevirt.io/{0}'.format(API)
|
||
|
pvc_name = self.params.get('pvc_name')
|
||
|
pvc_namespace = self.params.get('pvc_namespace')
|
||
|
upload_host = self.params.get('upload_host')
|
||
|
upload_host_verify_ssl = self.params.get('upload_host_validate_certs')
|
||
|
path = self.params.get('path')
|
||
|
|
||
|
definition = defaultdict(defaultdict)
|
||
|
|
||
|
definition['kind'] = KIND
|
||
|
definition['apiVersion'] = api_version
|
||
|
|
||
|
def_meta = definition['metadata']
|
||
|
def_meta['name'] = pvc_name
|
||
|
def_meta['namespace'] = pvc_namespace
|
||
|
|
||
|
def_spec = definition['spec']
|
||
|
def_spec['pvcName'] = pvc_name
|
||
|
|
||
|
# Let's check the file's there before we do anything else
|
||
|
imgfile = open(path, 'rb')
|
||
|
|
||
|
resource = self.find_resource(KIND, api_version, fail=True)
|
||
|
definition = self.set_defaults(resource, definition)
|
||
|
result = self.perform_action(resource, definition)
|
||
|
|
||
|
headers = {'Authorization': "Bearer {0}".format(result['result']['status']['token'])}
|
||
|
url = "{0}/{1}/upload".format(upload_host, API)
|
||
|
ret = requests.post(url, data=imgfile, headers=headers, verify=upload_host_verify_ssl)
|
||
|
|
||
|
if ret.status_code != 200:
|
||
|
self.fail_request("Something went wrong while uploading data", method='POST', url=url,
|
||
|
reason=ret.reason, status_code=ret.status_code)
|
||
|
|
||
|
self.exit_json(changed=True)
|
||
|
|
||
|
def fail_request(self, msg, **kwargs):
|
||
|
req_info = {}
|
||
|
for k, v in kwargs.items():
|
||
|
req_info['req_' + k] = v
|
||
|
self.fail_json(msg=msg, **req_info)
|
||
|
|
||
|
|
||
|
def main():
|
||
|
module = KubeVirtCDIUpload()
|
||
|
try:
|
||
|
module.execute_module()
|
||
|
except Exception as e:
|
||
|
module.fail_json(msg=str(e), exception=traceback.format_exc())
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|