Beispiel #1
0
    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)
Beispiel #2
0
    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))
Beispiel #3
0
    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)