From 100bcee082f4cf1d33d8371dddead251e537c18f Mon Sep 17 00:00:00 2001 From: Felix Matouschek Date: Tue, 5 Sep 2023 14:45:45 +0200 Subject: [PATCH 1/2] inventory: Flatten created groups Drop creation of the namespace_vmis_group as it is redundant. Signed-off-by: Felix Matouschek --- changelogs/fragments/0_flatten_groups.yml | 2 ++ plugins/inventory/kubevirt.py | 10 ++-------- 2 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 changelogs/fragments/0_flatten_groups.yml diff --git a/changelogs/fragments/0_flatten_groups.yml b/changelogs/fragments/0_flatten_groups.yml new file mode 100644 index 0000000..8b51610 --- /dev/null +++ b/changelogs/fragments/0_flatten_groups.yml @@ -0,0 +1,2 @@ +minor_changes: + - "inventory: Drop creation of the namespace_vmis_group as it is redundant" diff --git a/plugins/inventory/kubevirt.py b/plugins/inventory/kubevirt.py index 53784f0..bf4fa42 100644 --- a/plugins/inventory/kubevirt.py +++ b/plugins/inventory/kubevirt.py @@ -444,18 +444,12 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): services = self.get_ssh_services_for_namespace(client, namespace) - namespace_group = f"namespace_{namespace}" - namespace_vmis_group = f"{namespace_group}_vmis" - name = self._sanitize_group_name(name) - namespace_group = self._sanitize_group_name(namespace_group) - namespace_vmis_group = self._sanitize_group_name(namespace_vmis_group) + namespace_group = self._sanitize_group_name(f"namespace_{namespace}") self.inventory.add_group(name) self.inventory.add_group(namespace_group) self.inventory.add_child(name, namespace_group) - self.inventory.add_group(namespace_vmis_group) - self.inventory.add_child(namespace_group, namespace_vmis_group) for vmi in vmi_list.items: if not (vmi.status and vmi.status.interfaces): @@ -500,7 +494,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): # Add vmi to the namespace group, and to each label_value group self.inventory.add_host(vmi_name) - self.inventory.add_child(namespace_vmis_group, vmi_name) + self.inventory.add_child(namespace_group, vmi_name) for group in vmi_groups: self.inventory.add_child(group, vmi_name) From e33b47932687152434ced9c373bf03636fed26a9 Mon Sep 17 00:00:00 2001 From: Felix Matouschek Date: Tue, 5 Sep 2023 14:48:12 +0200 Subject: [PATCH 2/2] inventory: Add create_groups option This adds the create_groups option to the inventory, which allows to control the creation of groups from labels on VirtualMachines. By default it is disabled. Signed-off-by: Felix Matouschek --- changelogs/fragments/1_add_create_groups.yml | 2 + plugins/inventory/kubevirt.py | 44 ++++++++++++------- .../inventory_kubevirt/test.kubevirt.yml | 1 + .../test.label.kubevirt.yml | 1 + .../inventory_kubevirt/test.net.kubevirt.yml | 1 + 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 changelogs/fragments/1_add_create_groups.yml diff --git a/changelogs/fragments/1_add_create_groups.yml b/changelogs/fragments/1_add_create_groups.yml new file mode 100644 index 0000000..be6be77 --- /dev/null +++ b/changelogs/fragments/1_add_create_groups.yml @@ -0,0 +1,2 @@ +minor_changes: + - "inventory: Allow to control creation of additional groups" diff --git a/plugins/inventory/kubevirt.py b/plugins/inventory/kubevirt.py index bf4fa42..fb96a27 100644 --- a/plugins/inventory/kubevirt.py +++ b/plugins/inventory/kubevirt.py @@ -112,6 +112,11 @@ options: - Enable the use of services to establish an SSH connection to the VirtualMachine. type: bool default: True + create_groups: + description: + - Enable the creation of groups from labels on VirtualMachines. + type: bool + default: False api_version: description: - Specify the used KubeVirt API version. @@ -211,6 +216,7 @@ class GetVmiOptions: network_name: Optional[str] = None kube_secondary_dns: Optional[bool] = None use_service: Optional[bool] = None + create_groups: Optional[bool] = None base_domain: Optional[str] = None host_format: Optional[str] = None @@ -222,6 +228,8 @@ class GetVmiOptions: self.kube_secondary_dns = False if self.use_service is None: self.use_service = True + if self.create_groups is None: + self.create_groups = False if self.host_format is None: self.host_format = "{namespace}-{name}" @@ -374,6 +382,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): connection.get("network_name", connection.get("interface_name")), connection.get("kube_secondary_dns"), connection.get("use_service"), + connection.get("create_groups"), connection.get("base_domain", self.get_cluster_domain(client)), self.host_format, ) @@ -473,30 +482,33 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): name=vmi.metadata.name, uid=vmi.metadata.uid, ) - vmi_groups = [] vmi_annotations = ( {} if not vmi.metadata.annotations else self.__resource_field_to_dict(vmi.metadata.annotations) ) + vmi_labels = ( + {} + if not vmi.metadata.labels + else self.__resource_field_to_dict(vmi.metadata.labels) + ) - if vmi.metadata.labels: - # create a group for each label_value - for key, value in vmi.metadata.labels: - group_name = f"label_{key}_{value}" - group_name = self._sanitize_group_name(group_name) - if group_name not in vmi_groups: - vmi_groups.append(group_name) - self.inventory.add_group(group_name) - vmi_labels = self.__resource_field_to_dict(vmi.metadata.labels) - else: - vmi_labels = {} - - # Add vmi to the namespace group, and to each label_value group + # Add vmi to the namespace group self.inventory.add_host(vmi_name) self.inventory.add_child(namespace_group, vmi_name) - for group in vmi_groups: - self.inventory.add_child(group, vmi_name) + + # Create label groups and add vmi to it if enabled + if vmi.metadata.labels and opts.create_groups: + # Create a group for each label_value + vmi_groups = [] + for key, value in vmi.metadata.labels: + group_name = self._sanitize_group_name(f"label_{key}_{value}") + if group_name not in vmi_groups: + vmi_groups.append(group_name) + # Add vmi to each label_value group + for group in vmi_groups: + self.inventory.add_group(group) + self.inventory.add_child(group, vmi_name) # Set up the connection self.inventory.set_variable(vmi_name, "ansible_connection", "ssh") diff --git a/tests/integration/targets/inventory_kubevirt/test.kubevirt.yml b/tests/integration/targets/inventory_kubevirt/test.kubevirt.yml index e9c2806..90a79f2 100644 --- a/tests/integration/targets/inventory_kubevirt/test.kubevirt.yml +++ b/tests/integration/targets/inventory_kubevirt/test.kubevirt.yml @@ -2,3 +2,4 @@ plugin: kubevirt.core.kubevirt connections: - namespaces: - default + create_groups: yes diff --git a/tests/integration/targets/inventory_kubevirt/test.label.kubevirt.yml b/tests/integration/targets/inventory_kubevirt/test.label.kubevirt.yml index 4d4fba2..8d895a3 100644 --- a/tests/integration/targets/inventory_kubevirt/test.label.kubevirt.yml +++ b/tests/integration/targets/inventory_kubevirt/test.label.kubevirt.yml @@ -2,4 +2,5 @@ plugin: kubevirt.core.kubevirt connections: - namespaces: - default + create_groups: yes label_selector: app=test diff --git a/tests/integration/targets/inventory_kubevirt/test.net.kubevirt.yml b/tests/integration/targets/inventory_kubevirt/test.net.kubevirt.yml index 828b2fb..5307a3d 100644 --- a/tests/integration/targets/inventory_kubevirt/test.net.kubevirt.yml +++ b/tests/integration/targets/inventory_kubevirt/test.net.kubevirt.yml @@ -2,4 +2,5 @@ plugin: kubevirt.core.kubevirt connections: - namespaces: - default + create_groups: yes network_name: bridge-network