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

Make "unit" parameter optional and add support for check mode #470

Merged
merged 18 commits into from
Mar 12, 2021
Merged

Make "unit" parameter optional and add support for check mode #470

merged 18 commits into from
Mar 12, 2021

Conversation

ichekaldin
Copy link
Contributor

SUMMARY

boto3 documentation explicitly suggests omitting this parameter.

Creating an alarm without the "unit" parameter specified fails:

- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present

with the following error:

Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>

Apparently specifying unit: None in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.

ISSUE TYPE
  • Feature Pull Request
COMPONENT NAME

ec2_metric_alarm

ADDITIONAL INFORMATION

boto3 documentation explicitly suggests omitting this parameter:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_alarm

Creating an alarm without the "unit" parameter specified fails:

```
- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present
```

with the following error:

```
Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
```

Apparently specifying `unit: None` in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.
@ansibullbot
Copy link

@ansibullbot ansibullbot added community_review feature This issue/PR relates to a feature request module module needs_triage plugins plugin (any type) labels Mar 11, 2021
Copy link
Contributor

@tremble tremble left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @ichekaldin thanks for your PR.

We have some integration tests (tests/integration/targets/ec2_metric_alarm) for this module, it would be good if you could expand these to include testing your latest changes.

While the tests currently run a loop of

  • make-change
  • describe-alarms

It would be better (if you're willing) to switch this over to a loop of:

  • make-change (check_mode=True) - should return Changed
  • make-change (check_mode=False) - should return Changed
  • make-change (check_mode=True) - should return Not Changed
  • make-change (check_mode=False) - should return Not Changed

for each test

This 4-step loop helps test both idempotency and check_mode

@ansibullbot ansibullbot added needs_revision This PR fails CI tests or a maintainer has requested a review/revision of the PR and removed community_review labels Mar 11, 2021
@ansibullbot ansibullbot added integration tests/integration tests tests labels Mar 11, 2021
Copy link
Contributor

@tremble tremble left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the initial tests, I'd like to see a test that creates another alarm with no units set. But once that's in we should be good to go.

@tremble
Copy link
Contributor

tremble commented Mar 11, 2021

The check mode tests seem to be failing:

https://app.shippable.com/github/ansible-collections/community.aws/runs/1818/37/tests

                          Traceback (most recent call last):
  File "/root/.ansible/tmp/ansible-tmp-1615473205.9528832-1119-185501734451040/AnsiballZ_ec2_metric_alarm.py", line 126, in <module>
    _ansiballz_main()
  File "/root/.ansible/tmp/ansible-tmp-1615473205.9528832-1119-185501734451040/AnsiballZ_ec2_metric_alarm.py", line 118, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/root/.ansible/tmp/ansible-tmp-1615473205.9528832-1119-185501734451040/AnsiballZ_ec2_metric_alarm.py", line 67, in invoke_module
    run_name='__main__', alter_sys=True)
  File "/usr/lib/python3.7/runpy.py", line 205, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmp/ansible_ec2_metric_alarm_payload_zfl19q23/ansible_ec2_metric_alarm_payload.zip/ansible_collections/community/aws/plugins/modules/ec2_metric_alarm.py", line 358, in <module>
  File "/tmp/ansible_ec2_metric_alarm_payload_zfl19q23/ansible_ec2_metric_alarm_payload.zip/ansible_collections/community/aws/plugins/modules/ec2_metric_alarm.py", line 352, in main
  File "/tmp/ansible_ec2_metric_alarm_payload_zfl19q23/ansible_ec2_metric_alarm_payload.zip/ansible_collections/community/aws/plugins/modules/ec2_metric_alarm.py", line 265, in create_metric_alarm
IndexError: list index out of range

@ichekaldin
Copy link
Contributor Author

@tremble It took me a few iterations to get the integrations tests working.

It looks like the PR is now failing the ansible/check test. I see this in the output:

Run command: /usr/bin/python3.6 /root/ansible/test/lib/ansible_test/_data/sanity/validate-modules/validate-modules --format json --arg-spec plugins/modules/aws_acm.py plugins/modules/aws_acm_info.py plugins/modules/aws_api_gateway.py plugins/modules/aws_application_scaling_policy.py plugins/modules/aws_batch_compute_environment.py plugins/modules/aws_batch_job_definition.py plugins/modules/aws_batch_job_queue.py plugins/modules/aws_codebuild.py plugins/modules/aws_codecommit.py plugins/modules/aws_codepipeline.py plugins/modules/aws_config_aggregation_authorization.py plugins/modules/aws_config_aggregator.py plugins/modules/aws_config_delivery_channel.py plugins/modules/aws_config_recorder.py plugins/modules/aws_config_rule.py plugins/modules/aws_direct_connect_confirm_connection.py plugins/modules/aws_direct_connect_connection.py plugins/modules/aws_direct_connect_gateway.py plugins/modules/aws_direct_connect_link_aggregation_group.py plugins/modules/aws_direct_connect_virtual_interface.py plugins/modules/aws_eks_cluster.py plugins/modules/aws_elasticbeanstalk_app.py plugins/modules/aws_glue_connection.py plugins/modules/aws_glue_job.py plugins/modules/aws_inspector_target.py plugins/modules/aws_kms.py plugins/modules/aws_kms_info.py plugins/modules/aws_region_info.py plugins/modules/aws_s3_bucket_info.py plugins/modules/aws_s3_cors.py plugins/modules/aws_secret.py plugins/modules/aws_ses_identity.py plugins/modules/aws_ses_identity_policy.py plugins/modules/aws_ses_rule_set.py plugins/modules/aws_sgw_info.py plugins/modules/aws_ssm_parameter_store.py plugins/modules/aws_step_functions_state_machine.py plugins/modules/aws_step_functions_state_machine_execution.py plugins/modules/aws_waf_condition.py plugins/modules/aws_waf_info.py plugins/modules/aws_waf_rule.py plugins/modules/aws_waf_web_acl.py plugins/modules/cloudformation_exports_info.py plugins/modules/cloudformation_stack_set.py plugins/modules/cloudfront_distribution.py plugins/modules/cloudfront_info.py plugins/modules/cloudfront_invalidation.py plugins/modules/cloudfront_origin_access_identity.py plugins/modules/cloudtrail.py plugins/modules/cloudwatchevent_rule.py plugins/modules/cloudwatchlogs_log_group.py plugins/modules/cloudwatchlogs_log_group_info.py plugins/modules/cloudwatchlogs_log_group_metric_filter.py plugins/modules/data_pipeline.py plugins/modules/dms_endpoint.py plugins/modules/dms_replication_subnet_group.py plugins/modules/dynamodb_table.py plugins/modules/dynamodb_ttl.py plugins/modules/ec2_ami_copy.py plugins/modules/ec2_asg.py plugins/modules/ec2_asg_info.py plugins/modules/ec2_asg_lifecycle_hook.py plugins/modules/ec2_customer_gateway.py plugins/modules/ec2_customer_gateway_info.py plugins/modules/ec2_eip.py plugins/modules/ec2_eip_info.py plugins/modules/ec2_elb.py plugins/modules/ec2_elb_info.py plugins/modules/ec2_instance.py plugins/modules/ec2_instance_info.py plugins/modules/ec2_launch_template.py plugins/modules/ec2_lc.py plugins/modules/ec2_lc_find.py plugins/modules/ec2_lc_info.py plugins/modules/ec2_metric_alarm.py plugins/modules/ec2_placement_group.py plugins/modules/ec2_placement_group_info.py plugins/modules/ec2_scaling_policy.py plugins/modules/ec2_snapshot_copy.py plugins/modules/ec2_transit_gateway.py plugins/modules/ec2_transit_gateway_info.py plugins/modules/ec2_vpc_egress_igw.py plugins/modules/ec2_vpc_endpoint.py plugins/modules/ec2_vpc_endpoint_info.py plugins/modules/ec2_vpc_igw.py plugins/modules/ec2_vpc_igw_info.py plugins/modules/ec2_vpc_nacl.py plugins/modules/ec2_vpc_nacl_info.py plugins/modules/ec2_vpc_nat_gateway.py plugins/modules/ec2_vpc_nat_gateway_info.py plugins/modules/ec2_vpc_peer.py plugins/modules/ec2_vpc_peering_info.py plugins/modules/ec2_vpc_route_table.py plugins/modules/ec2_vpc_route_table_info.py plugins/modules/ec2_vpc_vgw.py plugins/modules/ec2_vpc_vgw_info.py plugins/modules/ec2_vpc_vpn.py plugins/modules/ec2_vpc_vpn_info.py plugins/modules/ec2_win_password.py plugins/modules/ecs_attribute.py plugins/modules/ecs_cluster.py plugins/modules/ecs_ecr.py plugins/modules/ecs_service.py plugins/modules/ecs_service_info.py plugins/modules/ecs_tag.py plugins/modules/ecs_task.py plugins/modules/ecs_taskdefinition.py plugins/modules/ecs_taskdefinition_info.py plugins/modules/efs.py plugins/modules/efs_info.py plugins/modules/elasticache.py plugins/modules/elasticache_info.py plugins/modules/elasticache_parameter_group.py plugins/modules/elasticache_snapshot.py plugins/modules/elasticache_subnet_group.py plugins/modules/elb_application_lb.py plugins/modules/elb_application_lb_info.py plugins/modules/elb_classic_lb.py plugins/modules/elb_classic_lb_info.py plugins/modules/elb_instance.py plugins/modules/elb_network_lb.py plugins/modules/elb_target.py plugins/modules/elb_target_group.py plugins/modules/elb_target_group_info.py plugins/modules/elb_target_info.py plugins/modules/execute_lambda.py plugins/modules/iam.py plugins/modules/iam_cert.py plugins/modules/iam_group.py plugins/modules/iam_managed_policy.py plugins/modules/iam_mfa_device_info.py plugins/modules/iam_password_policy.py plugins/modules/iam_policy.py plugins/modules/iam_policy_info.py plugins/modules/iam_role.py plugins/modules/iam_role_info.py plugins/modules/iam_saml_federation.py plugins/modules/iam_server_certificate_info.py plugins/modules/iam_user.py plugins/modules/iam_user_info.py plugins/modules/kinesis_stream.py plugins/modules/lambda.py plugins/modules/lambda_alias.py plugins/modules/lambda_event.py plugins/modules/lambda_facts.py plugins/modules/lambda_info.py plugins/modules/lambda_policy.py plugins/modules/lightsail.py plugins/modules/rds.py plugins/modules/rds_instance.py plugins/modules/rds_instance_info.py plugins/modules/rds_param_group.py plugins/modules/rds_snapshot.py plugins/modules/rds_snapshot_info.py plugins/modules/rds_subnet_group.py plugins/modules/redshift.py plugins/modules/redshift_cross_region_snapshots.py plugins/modules/redshift_info.py plugins/modules/redshift_subnet_group.py plugins/modules/route53.py plugins/modules/route53_health_check.py plugins/modules/route53_info.py plugins/modules/route53_zone.py plugins/modules/s3_bucket_notification.py plugins/modules/s3_lifecycle.py plugins/modules/s3_logging.py plugins/modules/s3_metrics_configuration.py plugins/modules/s3_sync.py plugins/modules/s3_website.py plugins/modules/sns.py plugins/modules/sns_topic.py plugins/modules/sqs_queue.py plugins/modules/sts_assume_role.py plugins/modules/sts_session_token.py --collection ansible_collections/community/aws --collection-version 1.4.1-dev42
...
Command exited with status 3 after 9.458611965179443 seconds.
ERROR: Found 2 validate-modules issue(s) which need to be resolved:
ERROR: plugins/modules/aws_secret.py:0:0: no-log-needed: Argument 'secret' in argument_spec could be a secret, though doesn't have `no_log` set
ERROR: plugins/modules/s3_sync.py:0:0: no-log-needed: Argument 'key_prefix' in argument_spec could be a secret, though doesn't have `no_log` set

I'm not 100% sure how to move this forward as neither s3_sync.py nor aws_secret.py are part of this PR. Am I looking at the correct error?

@ansibullbot ansibullbot added community_review and removed needs_revision This PR fails CI tests or a maintainer has requested a review/revision of the PR labels Mar 11, 2021
@tremble
Copy link
Contributor

tremble commented Mar 12, 2021

You're looking at the correct error. There was a recent update to ansible-test's sanity tests which picked up some issues now addressed by #471 given that Shippable's passing. I wouldn't worry about Zuul right now (we still have some work to do getting things passing in Zuul)

Copy link
Contributor

@tremble tremble left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for your contribution. There's a slight tweak that I'll make to the changelog format, which I'm only going to bother with because I want to retrigger the Zuul tests.

@tremble tremble merged commit daa5ed0 into ansible-collections:main Mar 12, 2021
@ichekaldin ichekaldin deleted the ichekaldin/ec2_metric_alarm_unit_optional branch May 6, 2021 23:23
danquixote pushed a commit to danquixote/community.aws that referenced this pull request May 16, 2021
…e-collections#470)

* Make "unit" parameter optional and add support for check mode

boto3 documentation explicitly suggests omitting this parameter:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_alarm

Creating an alarm without the "unit" parameter specified fails:

```
- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present
```

with the following error:

```
Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
```

Apparently specifying `unit: None` in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.

* Fix module output for tests

* Add tests for idempotency and check mode

* Fix an error when the module creates a new alarm in check mode

Alarm is not actuall created in check mode, and therefore
`describe_alarms` returns an empty list.

* Add tests for alarm creation with no unit attribute specified

* Fix typo - MetricAlarms vs MetricsAlarms

* Fix variable name - alarm_info_query_check vs alarm_info_check

* Fix variable names in tests

* Fix tests by ensuring that alarm doesn't exist before we begin

* Fix variable name

* Fix assertion

* Ensure check mode is enabled when it is supposed to be

* Enable check mode for alarm deletion

* Fix variable name - alarm_info_no_unit vs alarm_info

* Fix the test of creating the alarm without unit attribute

* Fix variable name - alarm_info_query_no_unit vs alarm_info

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

Co-authored-by: Mark Chappell <[email protected]>
alinabuzachis pushed a commit to alinabuzachis/community.aws that referenced this pull request Jul 19, 2021
…e-collections#470)

* Make "unit" parameter optional and add support for check mode

boto3 documentation explicitly suggests omitting this parameter:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_alarm

Creating an alarm without the "unit" parameter specified fails:

```
- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present
```

with the following error:

```
Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
```

Apparently specifying `unit: None` in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.

* Fix module output for tests

* Add tests for idempotency and check mode

* Fix an error when the module creates a new alarm in check mode

Alarm is not actuall created in check mode, and therefore
`describe_alarms` returns an empty list.

* Add tests for alarm creation with no unit attribute specified

* Fix typo - MetricAlarms vs MetricsAlarms

* Fix variable name - alarm_info_query_check vs alarm_info_check

* Fix variable names in tests

* Fix tests by ensuring that alarm doesn't exist before we begin

* Fix variable name

* Fix assertion

* Ensure check mode is enabled when it is supposed to be

* Enable check mode for alarm deletion

* Fix variable name - alarm_info_no_unit vs alarm_info

* Fix the test of creating the alarm without unit attribute

* Fix variable name - alarm_info_query_no_unit vs alarm_info

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

Co-authored-by: Mark Chappell <[email protected]>
alinabuzachis pushed a commit to alinabuzachis/community.aws that referenced this pull request Jul 19, 2021
…e-collections#470)

* Make "unit" parameter optional and add support for check mode

boto3 documentation explicitly suggests omitting this parameter:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_alarm

Creating an alarm without the "unit" parameter specified fails:

```
- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present
```

with the following error:

```
Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
```

Apparently specifying `unit: None` in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.

* Fix module output for tests

* Add tests for idempotency and check mode

* Fix an error when the module creates a new alarm in check mode

Alarm is not actuall created in check mode, and therefore
`describe_alarms` returns an empty list.

* Add tests for alarm creation with no unit attribute specified

* Fix typo - MetricAlarms vs MetricsAlarms

* Fix variable name - alarm_info_query_check vs alarm_info_check

* Fix variable names in tests

* Fix tests by ensuring that alarm doesn't exist before we begin

* Fix variable name

* Fix assertion

* Ensure check mode is enabled when it is supposed to be

* Enable check mode for alarm deletion

* Fix variable name - alarm_info_no_unit vs alarm_info

* Fix the test of creating the alarm without unit attribute

* Fix variable name - alarm_info_query_no_unit vs alarm_info

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

Co-authored-by: Mark Chappell <[email protected]>
danielcotton pushed a commit to danielcotton/community.aws that referenced this pull request Nov 23, 2021
…e-collections#470)

* Make "unit" parameter optional and add support for check mode

boto3 documentation explicitly suggests omitting this parameter:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_alarm

Creating an alarm without the "unit" parameter specified fails:

```
- community.aws.ec2_metric_alarm:
    name: My alarm
    description: My description
    namespace: AWS/CertificateManager
    metric: DaysToExpiry
    statistic: Average
    comparison: LessThanOrEqualToThreshold
    threshold: 45
    period: 86400
    evaluation_periods: 1
    dimensions:
      CertificateArn: "arn:aws:acm:us-east-1:123412341234:certificate/example"
    alarm_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    ok_actions:
      - arn:aws:sns:us-east-1:123412341234:my-sns-topic
    treat_missing_data: ignore
    state: present
```

with the following error:

```
Invalid type for parameter Unit, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
```

Apparently specifying `unit: None` in the example above is not the same as omitting the unit -
it causes the alarm to be in "Insufficient data" state.

* Fix module output for tests

* Add tests for idempotency and check mode

* Fix an error when the module creates a new alarm in check mode

Alarm is not actuall created in check mode, and therefore
`describe_alarms` returns an empty list.

* Add tests for alarm creation with no unit attribute specified

* Fix typo - MetricAlarms vs MetricsAlarms

* Fix variable name - alarm_info_query_check vs alarm_info_check

* Fix variable names in tests

* Fix tests by ensuring that alarm doesn't exist before we begin

* Fix variable name

* Fix assertion

* Ensure check mode is enabled when it is supposed to be

* Enable check mode for alarm deletion

* Fix variable name - alarm_info_no_unit vs alarm_info

* Fix the test of creating the alarm without unit attribute

* Fix variable name - alarm_info_query_no_unit vs alarm_info

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

* Update changelogs/fragments/470-ec2_metric_alarm-unit-optional.yml

Co-authored-by: Mark Chappell <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
community_review feature This issue/PR relates to a feature request integration tests/integration module module plugins plugin (any type) tests tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants