def fetch_objects(self, connections): super(InventoryModule, self).fetch_objects(connections) if connections: if not isinstance(connections, list): raise K8sInventoryException( "Expecting connections to be a list.") for connection in connections: client = self.get_api_client(**connection) name = connection.get( 'name', self.get_default_host_name(client.configuration.host)) if connection.get('namespaces'): namespaces = connection['namespaces'] else: namespaces = self.get_available_namespaces(client) for namespace in namespaces: self.get_routes_for_namespace(client, name, namespace) else: client = self.get_api_client() name = self.get_default_host_name(client.configuration.host) namespaces = self.get_available_namespaces(client) for namespace in namespaces: self.get_routes_for_namespace(client, name, namespace)
def get_routes_for_namespace(self, client, name, namespace): v1_route = client.resources.get(api_version='v1', kind='Route') try: obj = v1_route.get(namespace=namespace) except DynamicApiError as exc: self.display.debug(exc) raise K8sInventoryException('Error fetching Routes list: %s' % format_dynamic_api_exc(exc)) namespace_group = 'namespace_{0}'.format(namespace) namespace_routes_group = '{0}_routes'.format(namespace_group) self.inventory.add_group(name) self.inventory.add_group(namespace_group) self.inventory.add_child(name, namespace_group) self.inventory.add_group(namespace_routes_group) self.inventory.add_child(namespace_group, namespace_routes_group) for route in obj.items: route_name = route.metadata.name route_annotations = {} if not route.metadata.annotations else dict(route.metadata.annotations) self.inventory.add_host(route_name) 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) self.inventory.add_group(group_name) self.inventory.add_child(group_name, route_name) route_labels = dict(route.metadata.labels) else: route_labels = {} self.inventory.add_child(namespace_routes_group, route_name) # 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, '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, 'uid', route.metadata.uid) if route.spec.host: self.inventory.set_variable(route_name, 'host', route.spec.host) 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: self.inventory.set_variable(route_name, 'port', dict(route.spec.port))
def get_vms_for_namespace(self, client, name, namespace, name_format, interface_name=None, api_version=None, annotation_variable=None): v1_vm = client.resources.get(api_version=api_version, kind='VirtualMachineInstance') try: obj = v1_vm.get(namespace=namespace) except DynamicApiError as exc: self.display.debug(exc) raise K8sInventoryException( 'Error fetching Virtual Machines list: %s' % format_dynamic_api_exc(exc)) namespace_group = 'namespace_{0}'.format(namespace) namespace_vms_group = '{0}_vms'.format(namespace_group) name = self._sanitize_group_name(name) namespace_group = self._sanitize_group_name(namespace_group) namespace_vms_group = self._sanitize_group_name(namespace_vms_group) self.inventory.add_group(name) self.inventory.add_group(namespace_group) self.inventory.add_child(name, namespace_group) self.inventory.add_group(namespace_vms_group) self.inventory.add_child(namespace_group, namespace_vms_group) for vm in obj.items: if not (vm.status and vm.status.interfaces): continue # Find interface by its name: if interface_name is None: interface = vm.status.interfaces[0] else: interface = next((i for i in vm.status.interfaces if i.name == interface_name), None) # If interface is not found or IP address is not reported skip this VM: if interface is None or interface.ipAddress is None: continue vm_name = name_format.format(namespace=vm.metadata.namespace, name=vm.metadata.name, uid=vm.metadata.uid) vm_ip = interface.ipAddress vm_annotations = {} if not vm.metadata.annotations else dict( vm.metadata.annotations) self.inventory.add_host(vm_name) if vm.metadata.labels: # create a group for each label_value for key, value in vm.metadata.labels: group_name = 'label_{0}_{1}'.format(key, value) group_name = self._sanitize_group_name(group_name) self.inventory.add_group(group_name) self.inventory.add_child(group_name, vm_name) vm_labels = dict(vm.metadata.labels) else: vm_labels = {} self.inventory.add_child(namespace_vms_group, vm_name) # add hostvars self.inventory.set_variable(vm_name, 'ansible_host', vm_ip) self.inventory.set_variable(vm_name, 'labels', vm_labels) self.inventory.set_variable(vm_name, 'annotations', vm_annotations) self.inventory.set_variable(vm_name, 'object_type', 'vm') self.inventory.set_variable(vm_name, 'resource_version', vm.metadata.resourceVersion) self.inventory.set_variable(vm_name, 'uid', vm.metadata.uid) # Add all variables which are listed in 'ansible' annotation: annotations_data = json.loads( vm_annotations.get(annotation_variable, "{}")) for k, v in annotations_data.items(): self.inventory.set_variable(vm_name, k, v)