Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OCPVE-665: feat: report filter status into vgstatus #426

Conversation

jakobmoellerdev
Copy link
Contributor

@jakobmoellerdev jakobmoellerdev commented Sep 18, 2023

This adds the field .excluded to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

It also moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

To make the tests in vgmanager more stable I switched from envtest to fakeclient in the vgmanager test. That means we now have a much faster test execution and also dont have the issues of panics in the mock causing bail-out in ginkgo

The output of an LVMCluster started on a CRC node for example gets changed to the following:

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
  # ...
  finalizers:
  - lvmcluster.topolvm.io
  name: my-lvmcluster
  namespace: openshift-storage
  # ...
spec:
  storage:
    deviceClasses:
    - default: true
      fstype: xfs
      name: vg1
      thinPoolConfig:
        name: thin-pool-1
        overprovisionRatio: 10
        sizePercent: 90
status:
  deviceClassStatuses:
  - name: vg1
    nodeStatus:
    - devices:
      - /dev/loop0
      excluded:
      - name: /dev/vda
        reasons:
        - /dev/vda has children and should not be considered
      - name: /dev/vda1
        reasons:
        - /dev/vda1 has the invalid "BIOS-BOOT" partition label
      - name: /dev/vda2
        reasons:
        - /dev/vda2 has invalid filesystem signature vfat and cannot be used
      - name: /dev/vda3
        reasons:
        - /dev/vda3 has bind mounts and cannot be used
        - /dev/vda3 has invalid filesystem signature ext4 and cannot be used
        - /dev/vda3 has the invalid "boot" partition label
      - name: /dev/vda4
        reasons:
        - /dev/vda4 has bind mounts and cannot be used
        - /dev/vda4 has invalid filesystem signature xfs and cannot be used
      name: vg1
      node: crc-2zx29-master-0
      status: Ready
  ready: true
  state: Ready

@jakobmoellerdev jakobmoellerdev changed the title feat: report filter status into vgstatus OCPVE-665: feat: report filter status into vgstatus Sep 18, 2023
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Sep 18, 2023
@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 18, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set.

In response to this:

This adds the field .filterStatus to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices. It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path. It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress. Last but not least it moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 18, 2023

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci openshift-ci bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 18, 2023
@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 18, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set.

In response to this:

This adds the field .filterStatus to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path. It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

Last but not least it moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 18, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set.

In response to this:

This adds the field .filterStatus to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

Last but not least it moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@jakobmoellerdev
Copy link
Contributor Author

/test all

@openshift-ci openshift-ci bot added the size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. label Sep 18, 2023
@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from bfbc6b5 to b5572c9 Compare September 18, 2023 14:23
@jakobmoellerdev
Copy link
Contributor Author

/test all

@codecov-commenter
Copy link

codecov-commenter commented Sep 18, 2023

Codecov Report

Merging #426 (43b36fb) into main (9677ed3) will decrease coverage by 3.81%.
Report is 4 commits behind head on main.
The diff coverage is 57.85%.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #426      +/-   ##
==========================================
- Coverage   63.68%   59.88%   -3.81%     
==========================================
  Files          28       29       +1     
  Lines        2360     2413      +53     
==========================================
- Hits         1503     1445      -58     
- Misses        709      821     +112     
+ Partials      148      147       -1     
Files Changed Coverage Δ
api/v1alpha1/lvmcluster_types.go 100.00% <ø> (ø)
api/v1alpha1/lvmvolumegroupnodestatus_types.go 100.00% <ø> (ø)
api/v1alpha1/lvmvolumegroup_webhook.go 10.81% <10.81%> (ø)
pkg/vgmanager/status.go 39.47% <32.50%> (-20.76%) ⬇️
pkg/vgmanager/vgmanager_controller.go 34.63% <54.34%> (-10.51%) ⬇️
pkg/filter/filter.go 73.52% <74.13%> (+10.78%) ⬆️
pkg/vgmanager/devices.go 81.57% <89.65%> (-4.36%) ⬇️
controllers/lvmcluster_controller.go 61.34% <100.00%> (-0.40%) ⬇️
controllers/vgmanager_daemonset.go 100.00% <100.00%> (ø)

... and 1 file with indirect coverage changes

@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from b5572c9 to 3cc0553 Compare September 18, 2023 14:58
@jakobmoellerdev
Copy link
Contributor Author

/test all

@openshift-ci openshift-ci bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Sep 18, 2023
@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from 3cc0553 to ef18102 Compare September 19, 2023 08:31
@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 19, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set.

In response to this:

This adds the field .filterStatus to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

Last but not least it moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

The output of an LVMCluster started on a CRC node for example gets changed to the following:

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
 # ...
 finalizers:
 - lvmcluster.topolvm.io
 name: my-lvmcluster
 namespace: openshift-storage
 # ...
spec:
 storage:
   deviceClasses:
   - default: true
     fstype: xfs
     name: vg1
     thinPoolConfig:
       name: thin-pool-1
       overprovisionRatio: 10
       sizePercent: 90
status:
 deviceClassStatuses:
 - name: vg1
   nodeStatus:
   - devices:
     - /dev/loop0
     filterStatus:
       devices:
         noBiosBootInPartLabel:
         - filteredReason: device /dev/vda1 has the "BIOS-BOOT" part-label set and
             cannot be used
           name: /dev/vda1
         noChildren:
         - filteredReason: device /dev/dm-0 has children devices and cannot be used
           name: /dev/dm-0
         noValidFilesystemSignature:
         - filteredReason: device /dev/loop0 has invalid filesystem signature LVM2_member
             and cannot be used
           name: /dev/loop0
         usableDeviceType:
         - filteredReason: device /dev/dm-2 has type lvm cannot be used
           name: /dev/dm-2
       registered:
       - noBindMounts
       - noBiosBootInPartLabel
       - noChildren
       - noReservedInPartLabel
       - noValidFilesystemSignature
       - notReadOnly
       - notSuspended
       - usableDeviceType
     name: vg1
     node: crc-2zx29-master-0
     status: Ready
 ready: true
 state: Ready

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@jakobmoellerdev
Copy link
Contributor Author

/test all

@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from ef18102 to 0781db1 Compare September 19, 2023 10:29
@jakobmoellerdev
Copy link
Contributor Author

/test all

@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 19, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but no target version was set.

In response to this:

This adds the field .filterStatus to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

Last but not least it moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

The output of an LVMCluster started on a CRC node for example gets changed to the following:

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
 # ...
 finalizers:
 - lvmcluster.topolvm.io
 name: my-lvmcluster
 namespace: openshift-storage
 # ...
spec:
 storage:
   deviceClasses:
   - default: true
     fstype: xfs
     name: vg1
     thinPoolConfig:
       name: thin-pool-1
       overprovisionRatio: 10
       sizePercent: 90
status:
 deviceClassStatuses:
 - name: vg1
   nodeStatus:
   - devices:
     - /dev/loop0
     filtered:
       devices:
         noBindMounts:
         - name: /dev/vda4
           reason: device /dev/vda4 has bind mounts and cannot be used
         noBiosBootInPartLabel:
         - name: /dev/vda1
           reason: device /dev/vda1 has the "BIOS-BOOT" part-label set and cannot
             be used
         noChildren:
         - name: /dev/dm-0
           reason: device /dev/dm-0 has children devices and cannot be used
         onlyValidFilesystemSignatures:
         - name: /dev/vda2
           reason: device /dev/vda2 has invalid filesystem signature vfat and cannot
             be used
         usableDeviceType:
         - name: /dev/dm-2
           reason: device /dev/dm-2 has type lvm cannot be used
       registered:
       - noBindMounts
       - noBiosBootInPartLabel
       - noChildren
       - noReservedInPartLabel
       - notReadOnly
       - notSuspended
       - onlyValidFilesystemSignatures
       - usableDeviceType
     name: vg1
     node: crc-2zx29-master-0
     status: Ready
 ready: true
 state: Ready

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@jakobmoellerdev jakobmoellerdev marked this pull request as ready for review September 19, 2023 10:33
@openshift-ci openshift-ci bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 19, 2023
@jakobmoellerdev
Copy link
Contributor Author

/retest-required

2 similar comments
@jakobmoellerdev
Copy link
Contributor Author

/retest-required

@jakobmoellerdev
Copy link
Contributor Author

/retest-required

@jeff-roche
Copy link
Contributor

General first impressions (I still need to dig in more): I don't love some of the formatting.

  • I'm not sure we need the categorized filters if we have the device and the reason, we might be able to just switch this to an array of filtered out devices and their reason?
  • I'm also not sure what the point of the list of filters is in the "registered" section. Seems a bit verbose.
  • I'd also potentially change "filtered" to "filteredOut" to be a little more clear.

@jeff-roche
Copy link
Contributor

Mostly nits and wording/grammar changes. Nice work!

@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from f2b5763 to 9eb69f3 Compare September 21, 2023 08:28
@jakobmoellerdev
Copy link
Contributor Author

/test ci-index-lvm-operator-bundle

@jakobmoellerdev
Copy link
Contributor Author

/retest-required

2 similar comments
@jakobmoellerdev
Copy link
Contributor Author

/retest-required

@jakobmoellerdev
Copy link
Contributor Author

/retest-required

@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from 9eb69f3 to 27b533a Compare September 22, 2023 07:08
@jakobmoellerdev
Copy link
Contributor Author

/test unit-test

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Sep 22, 2023
@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from 11eeb03 to a269bff Compare September 22, 2023 10:25
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Sep 22, 2023
@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 22, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but it targets "openshift-4.15" instead.

In response to this:

This adds the field .filtered to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

It also moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

To make the tests in vgmanager more stable I switched from envtest to fakeclient in the vgmanager test. That means we now have a much faster test execution and also dont have the issues of panics in the mock causing bail-out in ginkgo

The output of an LVMCluster started on a CRC node for example gets changed to the following:

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
 # ...
 finalizers:
 - lvmcluster.topolvm.io
 name: my-lvmcluster
 namespace: openshift-storage
 # ...
spec:
 storage:
   deviceClasses:
   - default: true
     fstype: xfs
     name: vg1
     thinPoolConfig:
       name: thin-pool-1
       overprovisionRatio: 10
       sizePercent: 90
status:
 deviceClassStatuses:
 - name: vg1
   nodeStatus:
   - devices:
     - /dev/loop0
     excluded:
     - name: /dev/vda
       reasons:
       - /dev/vda has children and should not be considered
     - name: /dev/vda1
       reasons:
       - /dev/vda1 has the invalid "BIOS-BOOT" partition label
     - name: /dev/vda2
       reasons:
       - /dev/vda2 has invalid filesystem signature vfat and cannot be used
     - name: /dev/vda3
       reasons:
       - /dev/vda3 has bind mounts and cannot be used
       - /dev/vda3 has invalid filesystem signature ext4 and cannot be used
       - /dev/vda3 has the invalid "boot" partition label
     - name: /dev/vda4
       reasons:
       - /dev/vda4 has bind mounts and cannot be used
       - /dev/vda4 has invalid filesystem signature xfs and cannot be used
     name: vg1
     node: crc-2zx29-master-0
     status: Ready
 ready: true
 state: Ready

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@jakobmoellerdev
Copy link
Contributor Author

/test all

2 similar comments
@jakobmoellerdev
Copy link
Contributor Author

/test all

@jakobmoellerdev
Copy link
Contributor Author

/test all

@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch 2 times, most recently from 05771ca to e9ba448 Compare September 22, 2023 14:57
pkg/vgmanager/devices.go Outdated Show resolved Hide resolved
api/v1alpha1/lvmvolumegroup_webhook.go Outdated Show resolved Hide resolved
@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from e9ba448 to 0d2f747 Compare September 25, 2023 09:50
@jakobmoellerdev jakobmoellerdev force-pushed the OCPVE-665-report-diskSelector-reasons branch from 0d2f747 to 43b36fb Compare September 25, 2023 09:50
@openshift-ci-robot
Copy link

openshift-ci-robot commented Sep 25, 2023

@jakobmoellerdev: This pull request references OCPVE-665 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.15.0" version, but it targets "openshift-4.15" instead.

In response to this:

This adds the field .excluded to the LVMVolumeGroupNodeStatus. This allows not only to introspect all currently active filters on the VolumeGroup's deviceCandidates, but will also contain a list of all devices that are filtered out by the FilterName in case of unavailable devices.

It simplifies the filter to only return error instead of bool,error as it did not make any difference in the code path.

It also make sure that if there are available devices, the status is set to Progressing so that the LVMCluster does not jump from Initial to Failed state without showing Progress.

It also moves the duplicate device selector path check into a webhook for LVMVolumeGroup instead of being checked every reconcile in vgmanager.

To make the tests in vgmanager more stable I switched from envtest to fakeclient in the vgmanager test. That means we now have a much faster test execution and also dont have the issues of panics in the mock causing bail-out in ginkgo

The output of an LVMCluster started on a CRC node for example gets changed to the following:

apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
 # ...
 finalizers:
 - lvmcluster.topolvm.io
 name: my-lvmcluster
 namespace: openshift-storage
 # ...
spec:
 storage:
   deviceClasses:
   - default: true
     fstype: xfs
     name: vg1
     thinPoolConfig:
       name: thin-pool-1
       overprovisionRatio: 10
       sizePercent: 90
status:
 deviceClassStatuses:
 - name: vg1
   nodeStatus:
   - devices:
     - /dev/loop0
     excluded:
     - name: /dev/vda
       reasons:
       - /dev/vda has children and should not be considered
     - name: /dev/vda1
       reasons:
       - /dev/vda1 has the invalid "BIOS-BOOT" partition label
     - name: /dev/vda2
       reasons:
       - /dev/vda2 has invalid filesystem signature vfat and cannot be used
     - name: /dev/vda3
       reasons:
       - /dev/vda3 has bind mounts and cannot be used
       - /dev/vda3 has invalid filesystem signature ext4 and cannot be used
       - /dev/vda3 has the invalid "boot" partition label
     - name: /dev/vda4
       reasons:
       - /dev/vda4 has bind mounts and cannot be used
       - /dev/vda4 has invalid filesystem signature xfs and cannot be used
     name: vg1
     node: crc-2zx29-master-0
     status: Ready
 ready: true
 state: Ready

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@suleymanakbas91
Copy link
Contributor

/lgtm
/approve

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Sep 25, 2023
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 25, 2023

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jakobmoellerdev, suleymanakbas91

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Sep 25, 2023
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 25, 2023

@jakobmoellerdev: all tests passed!

Full PR test history. Your PR dashboard.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@openshift-merge-robot openshift-merge-robot merged commit 2c853f5 into openshift:main Sep 25, 2023
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants