Repository: ansible-collections/community.general

Issue:
Filesystem resize should support btrfs resize
### Summary

It would be nice if the filesystem module could resize btrfs filesystems.

I tried to get into the code of the module but my python skills a not good enough. 
Until now I resize the btrfs filesystem with

```bash (paste below)
btrfs filesystem resize max /mountpoint
```

mountpoint is calculated with:

```bash (paste below)
mount | sed -nr 's#^{{item.0.disk.dev}}{{item.1.num}} on (.+) type btrfs .*#\\1#gp' |head -1`
```

### Issue Type

Feature Idea

### Component Name

filesystem

### Additional Information

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)

```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct


Discussion:
Files identified in the description:
* [`plugins/modules/system/filesystem.py`](https://github.com/ansible-collections/community.general/blob/main/plugins/modules/system/filesystem.py)

If these files are incorrect, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @abulimov @pilou- @quidame
[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/plugins/modules/system/filesystem.py b/plugins/modules/system/filesystem.py
--- a/plugins/modules/system/filesystem.py
+++ b/plugins/modules/system/filesystem.py
@@ -59,7 +59,7 @@
   resizefs:
     description:
       - If C(yes), if the block device and filesystem size differ, grow the filesystem into the space.
-      - Supported for C(ext2), C(ext3), C(ext4), C(ext4dev), C(f2fs), C(lvm), C(xfs), C(ufs) and C(vfat) filesystems.
+      - Supported for C(btrfs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(f2fs), C(lvm), C(xfs), C(ufs) and C(vfat) filesystems.
         Attempts to resize other filesystem types will fail.
       - XFS Will only grow if mounted. Currently, the module is based on commands
         from C(util-linux) package to perform operations, so resizing of XFS is
@@ -331,6 +331,10 @@ class Reiserfs(Filesystem):
 
 class Btrfs(Filesystem):
     MKFS = 'mkfs.btrfs'
+    INFO = 'btrfs'
+    GROW = 'btrfs'
+    GROW_MAX_SPACE_FLAGS = ['filesystem', 'resize', 'max']
+    GROW_MOUNTPOINT_ONLY = True
 
     def __init__(self, module):
         super(Btrfs, self).__init__(module)
@@ -349,6 +353,19 @@ def __init__(self, module):
             self.MKFS_FORCE_FLAGS = ['-f']
             self.module.warn('Unable to identify mkfs.btrfs version (%r, %r)' % (stdout, stderr))
 
+    def get_fs_size(self, dev):
+        """Return size in bytes of filesystem on device (integer)."""
+        mountpoint = dev.get_mountpoint()
+        if not mountpoint:
+            self.module.fail_json(msg="%s needs to be mounted for %s operations" % (dev, self.fstype))
+
+        dummy, stdout, dummy = self.module.run_command([self.module.get_bin_path(self.INFO),
+                                                        'filesystem', 'usage', '-b', mountpoint], check_rc=True)
+        for line in stdout.splitlines():
+            if "Device size" in line:
+                return int(line.split()[-1])
+        raise ValueError(stdout)
+
 
 class Ocfs2(Filesystem):
     MKFS = 'mkfs.ocfs2'


Test patch:
diff --git a/tests/integration/targets/filesystem/defaults/main.yml b/tests/integration/targets/filesystem/defaults/main.yml
--- a/tests/integration/targets/filesystem/defaults/main.yml
+++ b/tests/integration/targets/filesystem/defaults/main.yml
@@ -16,7 +16,7 @@ tested_filesystems:
   ext3: {fssize: 10, grow: True}
   ext2: {fssize: 10, grow: True}
   xfs: {fssize: 20, grow: False}  # grow requires a mounted filesystem
-  btrfs: {fssize: 150, grow: False}  # grow not implemented
+  btrfs: {fssize: 150, grow: False}  # grow requires a mounted filesystem
   reiserfs: {fssize: 33, grow: False}  # grow not implemented
   vfat: {fssize: 20, grow: True}
   ocfs2: {fssize: '{{ ocfs2_fssize }}', grow: False}  # grow not implemented