Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions molecule/default/converge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,20 @@
name: osdkau-test-failure-modes
state: absent
wait: yes

- block:
- name: Create namespace
k8s:
kind: Namespace
name: osdkau-test-k8s-events

- import_tasks: tasks/k8s_events.yml
vars:
namespace: osdkau-test-k8s-events
always:
- name: Clean up namespace
k8s:
kind: Namespace
name: osdkau-test-k8s-events
state: absent
wait: yes
39 changes: 39 additions & 0 deletions molecule/default/tasks/k8s_events.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
- name: Create TestCR resource
k8s:
definition:
apiVersion: apps.example.com/v1alpha1
kind: TestCR
metadata:
namespace: '{{ namespace }}'
name: my-test
spec:
size: 2

- name: Create a k8s event
k8s_event:
namespace: '{{ namespace }}'
name: test-name
message: test-message
reason: test-reason
involvedObject:
apiVersion: apps.example.com/v1alpha1
kind: Event
name: test-involved-object
namespace: '{{ namespace }}'

- name: Get the Event
k8s_info:
kind: Event
name: test-name
namespace: '{{ namespace }}'
register: event_obj

- debug: var=event_obj

- assert:
that:
- event_obj.resources.0.metadata.name == 'test-name'
- event_obj.resources.0.message == 'test-message'
- event_obj.resources.0.reason == 'test-reason'
- event_obj.resources.0.involvedObject.name == 'test-involved-object'
102 changes: 102 additions & 0 deletions plugins/module_utils/api_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
from __future__ import absolute_import, division, print_function

__metaclass__ = type


import os
import traceback

from ansible.module_utils._text import to_native
from ansible.module_utils.six import iteritems

K8S_IMP_ERR = None
try:
from ansible_collections.operator_sdk.util.plugins.module_utils.args_common import (
AUTH_ARG_SPEC,
AUTH_ARG_MAP,
)
import kubernetes
from openshift.dynamic import DynamicClient
from openshift.dynamic.exceptions import (ResourceNotFoundError, ResourceNotUniqueError)
HAS_K8S_MODULE_HELPER = True
k8s_import_exception = None
except ImportError as e:
HAS_K8S_MODULE_HELPER = False
k8s_import_exception = e
K8S_IMP_ERR = traceback.format_exc()


def get_api_client(module=None):
auth = {}

def _raise_or_fail(exc, message):
if module:
module.fail_json(msg=message, error=to_native(exc))
else:
raise exc

# If authorization variables aren't defined, look for them in environment variables
for true_name, arg_name in AUTH_ARG_MAP.items():
if module and module.params.get(arg_name):
auth[true_name] = module.params.get(arg_name)
else:
env_value = os.getenv('K8S_AUTH_{0}'.format(arg_name.upper()), None) or os.getenv('K8S_AUTH_{0}'.format(true_name.upper()), None)
if env_value is not None:
if AUTH_ARG_SPEC[arg_name].get('type') == 'bool':
env_value = env_value.lower() not in ['0', 'false', 'no']
auth[true_name] = env_value

def auth_set(*names):
return all([auth.get(name) for name in names])

if auth_set('username', 'password', 'host') or auth_set('api_key', 'host'):
# We have enough in the parameters to authenticate, no need to load incluster or kubeconfig
pass
elif auth_set('kubeconfig') or auth_set('context'):
try:
kubernetes.config.load_kube_config(auth.get('kubeconfig'), auth.get('context'), persist_config=auth.get('persist_config'))
except Exception as err:
_raise_or_fail(err, 'Failed to load kubeconfig due to %s')

else:
# First try to do incluster config, then kubeconfig
try:
kubernetes.config.load_incluster_config()
except kubernetes.config.ConfigException:
try:
kubernetes.config.load_kube_config(auth.get('kubeconfig'), auth.get('context'), persist_config=auth.get('persist_config'))
except Exception as err:
_raise_or_fail(err, 'Failed to load kubeconfig due to %s')

# Override any values in the default configuration with Ansible parameters
# As of kubernetes-client v12.0.0, get_default_copy() is required here
try:
configuration = kubernetes.client.Configuration().get_default_copy()
except AttributeError:
configuration = kubernetes.client.Configuration()

for key, value in iteritems(auth):
if key in AUTH_ARG_MAP.keys() and value is not None:
if key == 'api_key':
setattr(configuration, key, {'authorization': "Bearer {0}".format(value)})
else:
setattr(configuration, key, value)

try:
client = DynamicClient(kubernetes.client.ApiClient(configuration))
except Exception as err:
_raise_or_fail(err, 'Failed to get client due to %s')

return client


def find_resource(client, kind, api_version):
for attribute in ['kind', 'name', 'singular_name']:
try:
return client.resources.get(**{'api_version': api_version, attribute: kind})
except (ResourceNotFoundError, ResourceNotUniqueError):
pass
try:
return client.resources.get(api_version=api_version, short_names=[kind])
except (ResourceNotFoundError, ResourceNotUniqueError):
return None
Loading