mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-08-22 22:11:44 -07:00
This reverts commit 4373b155a5
.
This commit is contained in:
parent
950ff6bce6
commit
78023e79d7
18 changed files with 1881 additions and 538 deletions
|
@ -18,24 +18,22 @@
|
|||
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
from ansible.module_utils.k8s.common import K8sAnsibleMixin, HAS_K8S_MODULE_HELPER
|
||||
from ansible.module_utils.six import iteritems
|
||||
|
||||
try:
|
||||
from ansible.errors import AnsibleError
|
||||
except ImportError:
|
||||
AnsibleError = Exception
|
||||
|
||||
try:
|
||||
from openshift.dynamic.exceptions import DynamicApiError
|
||||
except ImportError:
|
||||
pass
|
||||
from openshift.helper.kubernetes import KubernetesObjectHelper
|
||||
from openshift.helper.openshift import OpenShiftObjectHelper
|
||||
from openshift.helper.exceptions import KubernetesException
|
||||
HAS_K8S_MODULE_HELPER = True
|
||||
except ImportError as exc:
|
||||
HAS_K8S_MODULE_HELPER = False
|
||||
|
||||
|
||||
class K8sInventoryException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class K8sInventoryHelper(K8sAnsibleMixin):
|
||||
class K8sInventoryHelper(object):
|
||||
helper = None
|
||||
transport = 'kubectl'
|
||||
|
||||
|
@ -58,7 +56,7 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
self.fetch_objects(connections)
|
||||
|
||||
def fetch_objects(self, connections):
|
||||
client = self.get_api_client()
|
||||
self.helper = self.get_helper('v1', 'namespace_list')
|
||||
|
||||
if connections:
|
||||
if not isinstance(connections, list):
|
||||
|
@ -67,50 +65,68 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
for connection in connections:
|
||||
if not isinstance(connection, dict):
|
||||
raise K8sInventoryException("Expecting connection to be a dictionary.")
|
||||
client = self.get_api_client(**connection)
|
||||
name = connection.get('name', self.get_default_host_name(client.configuration.host))
|
||||
self.authenticate(connection)
|
||||
name = connection.get('name', self.get_default_host_name(self.helper.api_client.host))
|
||||
if connection.get('namespaces'):
|
||||
namespaces = connections['namespaces']
|
||||
else:
|
||||
namespaces = self.get_available_namespaces(client)
|
||||
namespaces = self.get_available_namespaces()
|
||||
for namespace in namespaces:
|
||||
self.get_pods_for_namespace(client, name, namespace)
|
||||
self.get_services_for_namespace(client, name, namespace)
|
||||
self.get_pods_for_namespace(name, namespace)
|
||||
self.get_services_for_namespace(name, namespace)
|
||||
else:
|
||||
name = self.get_default_host_name(client.configuration.host)
|
||||
namespaces = self.get_available_namespaces(client)
|
||||
name = self.get_default_host_name(self.helper.api_client.host)
|
||||
namespaces = self.get_available_namespaces()
|
||||
for namespace in namespaces:
|
||||
self.get_pods_for_namespace(client, name, namespace)
|
||||
self.get_services_for_namespace(client, name, namespace)
|
||||
self.get_pods_for_namespace(name, namespace)
|
||||
self.get_services_for_namespace(name, namespace)
|
||||
|
||||
def authenticate(self, connection=None):
|
||||
auth_options = {}
|
||||
if connection:
|
||||
auth_args = ('host', 'api_key', 'kubeconfig', 'context', 'username', 'password',
|
||||
'cert_file', 'key_file', 'ssl_ca_cert', 'verify_ssl')
|
||||
for key, value in iteritems(connection):
|
||||
if key in auth_args and value is not None:
|
||||
auth_options[key] = value
|
||||
try:
|
||||
self.helper.set_client_config(**auth_options)
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error connecting to the API: {0}'.format(exc.message))
|
||||
|
||||
@staticmethod
|
||||
def get_default_host_name(host):
|
||||
return host.replace('https://', '').replace('http://', '').replace('.', '-').replace(':', '_')
|
||||
|
||||
def get_available_namespaces(self, client):
|
||||
v1_namespace = client.resources.get(api_version='v1', kind='Namespace')
|
||||
def get_helper(self, api_version, kind):
|
||||
try:
|
||||
obj = v1_namespace.get()
|
||||
except DynamicApiError as exc:
|
||||
helper = KubernetesObjectHelper(api_version=api_version, kind=kind, debug=False)
|
||||
helper.get_model(api_version, kind)
|
||||
return helper
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error initializing object helper: {0}'.format(exc.message))
|
||||
|
||||
def get_available_namespaces(self):
|
||||
try:
|
||||
obj = self.helper.get_object()
|
||||
except KubernetesObjectHelper as exc:
|
||||
raise K8sInventoryException('Error fetching Namespace list: {0}'.format(exc.message))
|
||||
return [namespace.metadata.name for namespace in obj.items]
|
||||
|
||||
def get_pods_for_namespace(self, client, name, namespace):
|
||||
v1_pod = client.resources.get(api_version='v1', kind='Pod')
|
||||
def get_pods_for_namespace(self, name, namespace):
|
||||
self.helper.set_model('v1', 'pod_list')
|
||||
try:
|
||||
obj = v1_pod.get(namespace=namespace)
|
||||
except DynamicApiError as exc:
|
||||
obj = self.helper.get_object(namespace=namespace)
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error fetching Pod list: {0}'.format(exc.message))
|
||||
|
||||
namespace_group = 'namespace_{0}'.format(namespace)
|
||||
namespace_pods_group = '{0}_pods'.format(namespace_group)
|
||||
namespace_pod_group = '{0}_pods'.format(namespace)
|
||||
|
||||
self.inventory.add_group(name)
|
||||
self.inventory.add_group(namespace_group)
|
||||
self.inventory.add_child(name, namespace_group)
|
||||
self.inventory.add_group(namespace_pods_group)
|
||||
self.inventory.add_child(namespace_group, namespace_pods_group)
|
||||
|
||||
self.inventory.add_group(namespace)
|
||||
self.inventory.add_child(name, namespace)
|
||||
self.inventory.add_group(namespace_pod_group)
|
||||
self.inventory.add_child(namespace, namespace_pod_group)
|
||||
for pod in obj.items:
|
||||
pod_name = pod.metadata.name
|
||||
pod_groups = []
|
||||
|
@ -120,17 +136,17 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
if pod.metadata.labels:
|
||||
pod_labels = pod.metadata.labels
|
||||
# create a group for each label_value
|
||||
for key, value in pod.metadata.labels:
|
||||
group_name = 'label_{0}_{1}'.format(key, value)
|
||||
for key, value in iteritems(pod.metadata.labels):
|
||||
group_name = '{0}_{1}'.format(key, value)
|
||||
if group_name not in pod_groups:
|
||||
pod_groups.append(group_name)
|
||||
self.inventory.add_group(group_name)
|
||||
|
||||
for container in pod.status.containerStatuses:
|
||||
for container in pod.status.container_statuses:
|
||||
# add each pod_container to the namespace group, and to each label_value group
|
||||
container_name = '{0}_{1}'.format(pod.metadata.name, container.name)
|
||||
self.inventory.add_host(container_name)
|
||||
self.inventory.add_child(namespace_pods_group, container_name)
|
||||
self.inventory.add_child(namespace_pod_group, container_name)
|
||||
if pod_groups:
|
||||
for group in pod_groups:
|
||||
self.inventory.add_child(group, container_name)
|
||||
|
@ -139,14 +155,14 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
self.inventory.set_variable(container_name, 'object_type', 'pod')
|
||||
self.inventory.set_variable(container_name, 'labels', pod_labels)
|
||||
self.inventory.set_variable(container_name, 'annotations', pod_annotations)
|
||||
self.inventory.set_variable(container_name, 'cluster_name', pod.metadata.clusterName)
|
||||
self.inventory.set_variable(container_name, 'pod_node_name', pod.spec.nodeName)
|
||||
self.inventory.set_variable(container_name, 'pod_name', pod.spec.name)
|
||||
self.inventory.set_variable(container_name, 'pod_host_ip', pod.status.hostIP)
|
||||
self.inventory.set_variable(container_name, 'cluster_name', pod.metadata.cluster_name)
|
||||
self.inventory.set_variable(container_name, 'pod_node_name', pod.spec.node_name)
|
||||
self.inventory.set_variable(container_name, 'pod_name', pod.spec.node_name)
|
||||
self.inventory.set_variable(container_name, 'pod_host_ip', pod.status.host_ip)
|
||||
self.inventory.set_variable(container_name, 'pod_phase', pod.status.phase)
|
||||
self.inventory.set_variable(container_name, 'pod_ip', pod.status.podIP)
|
||||
self.inventory.set_variable(container_name, 'pod_self_link', pod.metadata.selfLink)
|
||||
self.inventory.set_variable(container_name, 'pod_resource_version', pod.metadata.resourceVersion)
|
||||
self.inventory.set_variable(container_name, 'pod_ip', pod.status.pod_ip)
|
||||
self.inventory.set_variable(container_name, 'pod_self_link', pod.metadata.self_link)
|
||||
self.inventory.set_variable(container_name, 'pod_resource_version', pod.metadata.resource_version)
|
||||
self.inventory.set_variable(container_name, 'pod_uid', pod.metadata.uid)
|
||||
self.inventory.set_variable(container_name, 'container_name', container.image)
|
||||
self.inventory.set_variable(container_name, 'container_image', container.image)
|
||||
|
@ -163,22 +179,20 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
self.inventory.set_variable(container_name, 'ansible_{0}_container'.format(self.transport),
|
||||
container.name)
|
||||
|
||||
def get_services_for_namespace(self, client, name, namespace):
|
||||
v1_service = client.resources.get(api_version='v1', kind='Service')
|
||||
def get_services_for_namespace(self, name, namespace):
|
||||
self.helper.set_model('v1', 'service_list')
|
||||
try:
|
||||
obj = v1_service.get(namespace=namespace)
|
||||
except DynamicApiError as exc:
|
||||
obj = self.helper.get_object(namespace=namespace)
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error fetching Service list: {0}'.format(exc.message))
|
||||
|
||||
namespace_group = 'namespace_{0}'.format(namespace)
|
||||
namespace_services_group = '{0}_services'.format(namespace_group)
|
||||
namespace_service_group = '{0}_services'.format(namespace)
|
||||
|
||||
self.inventory.add_group(name)
|
||||
self.inventory.add_group(namespace_group)
|
||||
self.inventory.add_child(name, namespace_group)
|
||||
self.inventory.add_group(namespace_services_group)
|
||||
self.inventory.add_child(namespace_group, namespace_services_group)
|
||||
|
||||
self.inventory.add_group(namespace)
|
||||
self.inventory.add_child(name, namespace)
|
||||
self.inventory.add_group(namespace_service_group)
|
||||
self.inventory.add_child(namespace, namespace_service_group)
|
||||
for service in obj.items:
|
||||
service_name = service.metadata.name
|
||||
service_labels = {} if not service.metadata.labels else service.metadata.labels
|
||||
|
@ -188,54 +202,51 @@ class K8sInventoryHelper(K8sAnsibleMixin):
|
|||
|
||||
if service.metadata.labels:
|
||||
# create a group for each label_value
|
||||
for key, value in service.metadata.labels:
|
||||
group_name = 'label_{0}_{1}'.format(key, value)
|
||||
for key, value in iteritems(service.metadata.labels):
|
||||
group_name = '{0}_{1}'.format(key, value)
|
||||
self.inventory.add_group(group_name)
|
||||
self.inventory.add_child(group_name, service_name)
|
||||
|
||||
try:
|
||||
self.inventory.add_child(namespace_services_group, service_name)
|
||||
except AnsibleError as e:
|
||||
raise
|
||||
self.inventory.add_child(namespace_service_group, service_name)
|
||||
|
||||
ports = [{'name': port.name,
|
||||
'port': port.port,
|
||||
'protocol': port.protocol,
|
||||
'targetPort': port.targetPort,
|
||||
'nodePort': port.nodePort} for port in service.spec.ports or []]
|
||||
'targetPort': port.target_port,
|
||||
'nodePort': port.node_port} for port in service.spec.ports]
|
||||
|
||||
# add hostvars
|
||||
self.inventory.set_variable(service_name, 'object_type', 'service')
|
||||
self.inventory.set_variable(service_name, 'labels', service_labels)
|
||||
self.inventory.set_variable(service_name, 'annotations', service_annotations)
|
||||
self.inventory.set_variable(service_name, 'cluster_name', service.metadata.clusterName)
|
||||
self.inventory.set_variable(service_name, 'cluster_name', service.metadata.cluster_name)
|
||||
self.inventory.set_variable(service_name, 'ports', ports)
|
||||
self.inventory.set_variable(service_name, 'type', service.spec.type)
|
||||
self.inventory.set_variable(service_name, 'self_link', service.metadata.selfLink)
|
||||
self.inventory.set_variable(service_name, 'resource_version', service.metadata.resourceVersion)
|
||||
self.inventory.set_variable(service_name, 'self_link', service.metadata.self_link)
|
||||
self.inventory.set_variable(service_name, 'resource_version', service.metadata.resource_version)
|
||||
self.inventory.set_variable(service_name, 'uid', service.metadata.uid)
|
||||
|
||||
if service.spec.externalTrafficPolicy:
|
||||
if service.spec.external_traffic_policy:
|
||||
self.inventory.set_variable(service_name, 'external_traffic_policy',
|
||||
service.spec.externalTrafficPolicy)
|
||||
if service.spec.externalIPs:
|
||||
self.inventory.set_variable(service_name, 'external_ips', service.spec.externalIPs)
|
||||
service.spec.external_traffic_policy)
|
||||
if hasattr(service.spec, 'external_ips') and service.spec.external_ips:
|
||||
self.inventory.set_variable(service_name, 'external_ips', service.spec.external_ips)
|
||||
|
||||
if service.spec.externalName:
|
||||
self.inventory.set_variable(service_name, 'external_name', service.spec.externalName)
|
||||
if service.spec.external_name:
|
||||
self.inventory.set_variable(service_name, 'external_name', service.spec.external_name)
|
||||
|
||||
if service.spec.healthCheckNodePort:
|
||||
if service.spec.health_check_node_port:
|
||||
self.inventory.set_variable(service_name, 'health_check_node_port',
|
||||
service.spec.healthCheckNodePort)
|
||||
if service.spec.loadBalancerIP:
|
||||
service.spec.health_check_node_port)
|
||||
if service.spec.load_balancer_ip:
|
||||
self.inventory.set_variable(service_name, 'load_balancer_ip',
|
||||
service.spec.loadBalancerIP)
|
||||
service.spec.load_balancer_ip)
|
||||
if service.spec.selector:
|
||||
self.inventory.set_variable(service_name, 'selector', service.spec.selector)
|
||||
|
||||
if hasattr(service.status.loadBalancer, 'ingress') and service.status.loadBalancer.ingress:
|
||||
if hasattr(service.status.load_balancer, 'ingress') and service.status.load_balancer.ingress:
|
||||
load_balancer = [{'hostname': ingress.hostname,
|
||||
'ip': ingress.ip} for ingress in service.status.loadBalancer.ingress]
|
||||
'ip': ingress.ip} for ingress in service.status.load_balancer.ingress]
|
||||
self.inventory.set_variable(service_name, 'load_balancer', load_balancer)
|
||||
|
||||
|
||||
|
@ -245,39 +256,46 @@ class OpenShiftInventoryHelper(K8sInventoryHelper):
|
|||
|
||||
def fetch_objects(self, connections):
|
||||
super(OpenShiftInventoryHelper, self).fetch_objects(connections)
|
||||
client = self.get_api_client()
|
||||
self.helper = self.get_helper('v1', 'namespace_list')
|
||||
|
||||
if connections:
|
||||
for connection in connections:
|
||||
client = self.get_api_client(**connection)
|
||||
name = connection.get('name', self.get_default_host_name(client.configuration.host))
|
||||
self.authenticate(connection)
|
||||
name = connection.get('name', self.get_default_host_name(self.helper.api_client.host))
|
||||
if connection.get('namespaces'):
|
||||
namespaces = connection['namespaces']
|
||||
else:
|
||||
namespaces = self.get_available_namespaces(client)
|
||||
namespaces = self.get_available_namespaces()
|
||||
for namespace in namespaces:
|
||||
self.get_routes_for_namespace(client, name, namespace)
|
||||
self.get_routes_for_namespace(name, namespace)
|
||||
else:
|
||||
name = self.get_default_host_name(client.configuration.host)
|
||||
namespaces = self.get_available_namespaces(client)
|
||||
name = self.get_default_host_name(self.helper.api_client.host)
|
||||
namespaces = self.get_available_namespaces()
|
||||
for namespace in namespaces:
|
||||
self.get_routes_for_namespace(client, name, namespace)
|
||||
self.get_routes_for_namespace(name, namespace)
|
||||
|
||||
def get_routes_for_namespace(self, client, name, namespace):
|
||||
v1_route = client.resources.get(api_version='v1', kind='Route')
|
||||
def get_helper(self, api_version, kind):
|
||||
try:
|
||||
obj = v1_route.get(namespace=namespace)
|
||||
except DynamicApiError as exc:
|
||||
helper = OpenShiftObjectHelper(api_version=api_version, kind=kind, debug=False)
|
||||
helper.get_model(api_version, kind)
|
||||
return helper
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error initializing object helper: {0}'.format(exc.message))
|
||||
|
||||
def get_routes_for_namespace(self, name, namespace):
|
||||
self.helper.set_model('v1', 'route_list')
|
||||
try:
|
||||
obj = self.helper.get_object(namespace=namespace)
|
||||
except KubernetesException as exc:
|
||||
raise K8sInventoryException('Error fetching Routes list: {0}'.format(exc.message))
|
||||
|
||||
namespace_group = 'namespace_{0}'.format(namespace)
|
||||
namespace_routes_group = '{0}_routes'.format(namespace_group)
|
||||
namespace_routes_group = '{0}_routes'.format(namespace)
|
||||
|
||||
self.inventory.add_group(name)
|
||||
self.inventory.add_group(namespace_group)
|
||||
self.inventory.add_child(name, namespace_group)
|
||||
self.inventory.add_group(namespace)
|
||||
self.inventory.add_child(name, namespace)
|
||||
self.inventory.add_group(namespace_routes_group)
|
||||
self.inventory.add_child(namespace_group, namespace_routes_group)
|
||||
self.inventory.add_child(namespace, namespace_routes_group)
|
||||
for route in obj.items:
|
||||
route_name = route.metadata.name
|
||||
route_labels = {} if not route.metadata.labels else route.metadata.labels
|
||||
|
@ -287,8 +305,8 @@ class OpenShiftInventoryHelper(K8sInventoryHelper):
|
|||
|
||||
if route.metadata.labels:
|
||||
# create a group for each label_value
|
||||
for key, value in route.metadata.labels:
|
||||
group_name = 'label_{0}_{1}'.format(key, value)
|
||||
for key, value in iteritems(route.metadata.labels):
|
||||
group_name = '{0}_{1}'.format(key, value)
|
||||
self.inventory.add_group(group_name)
|
||||
self.inventory.add_child(group_name, route_name)
|
||||
|
||||
|
@ -297,10 +315,10 @@ class OpenShiftInventoryHelper(K8sInventoryHelper):
|
|||
# add hostvars
|
||||
self.inventory.set_variable(route_name, 'labels', route_labels)
|
||||
self.inventory.set_variable(route_name, 'annotations', route_annotations)
|
||||
self.inventory.set_variable(route_name, 'cluster_name', route.metadata.clusterName)
|
||||
self.inventory.set_variable(route_name, 'cluster_name', route.metadata.cluster_name)
|
||||
self.inventory.set_variable(route_name, 'object_type', 'route')
|
||||
self.inventory.set_variable(route_name, 'self_link', route.metadata.selfLink)
|
||||
self.inventory.set_variable(route_name, 'resource_version', route.metadata.resourceVersion)
|
||||
self.inventory.set_variable(route_name, 'self_link', route.metadata.self_link)
|
||||
self.inventory.set_variable(route_name, 'resource_version', route.metadata.resource_version)
|
||||
self.inventory.set_variable(route_name, 'uid', route.metadata.uid)
|
||||
|
||||
if route.spec.host:
|
||||
|
@ -309,5 +327,5 @@ class OpenShiftInventoryHelper(K8sInventoryHelper):
|
|||
if route.spec.path:
|
||||
self.inventory.set_variable(route_name, 'path', route.spec.path)
|
||||
|
||||
if hasattr(route.spec.port, 'targetPort') and route.spec.port.targetPort:
|
||||
if hasattr(route.spec.port, 'target_port') and route.spec.port.target_port:
|
||||
self.inventory.set_variable(route_name, 'port', route.spec.port)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue