-
Notifications
You must be signed in to change notification settings - Fork 342
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
fix incomplete enforce_count() return values #964
fix incomplete enforce_count() return values #964
Conversation
Hi @nethershaw, Thanks for taking the time to submit this PR. I agree with you on the general premise of the change. There are integration tests under |
Will try my best. I should be able to reproduce existing tests that look for this return key so as to be consistent with earlier work. |
Docs Build 📝Thank you for contribution!✨ This PR has been merged and your docs changes will be incorporated when they are next published. |
Examining the integration tests forced me to consider slightly expanding the scope of my modifications to ensure consistency wherever the result keys I had intended to keep it simple. Sorry about that. |
My general experience has been that working on the integration tests results in the author thinking more deeply about the consequences of the change, so it's certainly not a bad thing that this has resulted in the PR growing a bit it just highlights that things were inconsistent in multiple places, and it's still a nice self-contained change. What you may find is that when It looks like some of the tests are failing, the links in the bot's comment go to Zuul where the CI tests are being run and from there it's possible to see why the tests are failing. The sanity test results are a little spammy, I tend to do a search in the raw logs for "ERROR". In this case it looks like there's a little trailing whitespace on line 1953:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nethershaw thank you for working on this. Could you please rebase this PR? You must add a changelog fragment also. Thank you.
This is the Ansible way. Since a call to enforce_count() requires that a call to find_instances() has already been made, the information required to populate the `instances` return key is already held by the variable `existing_matches`. There are zero use cases where it makes sense not to output this information; if I want exactly one such instance and an existing instance matches the filter, I definitely always want to know its details.
- populate `instance_ids` in all cases where `existing_matches` are present, even in check mode - populate `instances` in all non-check mode cases where `existing_matches` are present - the `instance_ids` and `instances` return values are always a union of any `existing_matches` and instances launched/terminated by the module - the only time `instance_ids` is absent is in the case that check mode is true and `existing_matches` is the empty set When `exact_count` is in use: - if a call to `ensure_present()` would launch instances and `existing_matches` are present, the return key `changed_ids` will indicate only the launched instances; the return key `instance_ids` will include both existing and launched instances. This allows for selection of either subset of the cohort. - if a call to `enforce_count()` would terminate instances and `existing matches` are present, the return key `terminated_ids` will still indicate the terminated instances; the return key `instance_ids` will indicate all instances that matched the filter query prior to any terminations as a final means of preserving the metadata of all instances in the cohort.
- instances - instance_ids - terminated_ids - changed_ids
regate |
regate |
regate |
regate |
regate |
Backport to stable-5: 💔 cherry-picking failed — conflicts found❌ Failed to cleanly apply 0ef8359 on top of patchback/backports/stable-5/0ef8359fd96c5b141683bd526564def5399501f0/pr-964 Backporting merged PR #964 into main
🤖 @patchback |
fix incomplete enforce_count() return values SUMMARY This is the Ansible way. Since a call to enforce_count() requires that a call to find_instances() has already been made, the information required to populate the instances return key is already held by the variable existing_matches. There are zero use cases where it makes sense not to output this information; if I want exactly one such instance and an existing instance matches the filter, I definitely always want to know its details. Fixes ansible-collections#963, ansible-collections#859 ISSUE TYPE Bugfix Pull Request COMPONENT NAME ec2_instance ADDITIONAL INFORMATION See linked issues. Before: { "changed": false, "invocation": { "module_args": { "availability_zone": null, "aws_access_key": null, "aws_ca_bundle": null, "aws_config": null, "aws_secret_key": null, "count": null, "cpu_credit_specification": null, "cpu_options": null, "debug_botocore_endpoint_logs": false, "detailed_monitoring": false, "ebs_optimized": true, "ec2_url": null, "exact_count": 1, "filters": { "tag:Name": "something", "tag:env": "prod" }, "image": null, "image_id": "REDACTED", "instance_ids": [], "instance_initiated_shutdown_behavior": null, "instance_role": "REDACTED", "instance_type": "m5.2xlarge", "key_name": "REDACTED", "launch_template": null, "metadata_options": null, "name": null, "network": { "source_dest_check": true }, "placement_group": null, "profile": null, "purge_tags": false, "region": "us-west-2", "security_group": null, "security_groups": [ "default" ], "security_token": null, "state": "present", "tags": { "Name": "something", "env": "prod", }, "tenancy": null, "termination_protection": null, "tower_callback": null, "user_data": "REDACTED", "validate_certs": true, "volumes": [ { "device_name": "/dev/sda1", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 20, "volume_type": "gp3" } }, { "device_name": "/dev/xvdo", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 20, "volume_type": "gp3" } }, { "device_name": "/dev/xvdp", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 10, "volume_type": "gp3" } }, { "device_name": "/dev/xvdi", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 100, "volume_type": "gp3" } } ], "vpc_subnet_id": "REDACTED", "wait": true, "wait_timeout": 300 } }, "msg": "1 instances already running, nothing to do." } After: { "changed": false, "instance_ids": [ "REDACTED" ], "instances": [ { "ami_launch_index": 0, "architecture": "x86_64", "block_device_mappings": [ { "device_name": "/dev/sda1", "ebs": { "attach_time": "2022-08-10T19:50:24+00:00", "delete_on_termination": true, "status": "attached", "volume_id": "REDACTED" } }, { "device_name": "/dev/xvdo", "ebs": { "attach_time": "2022-08-10T19:50:24+00:00", "delete_on_termination": true, "status": "attached", "volume_id": "REDACTED" } }, { "device_name": "/dev/xvdp", "ebs": { "attach_time": "2022-08-10T19:50:24+00:00", "delete_on_termination": true, "status": "attached", "volume_id": "REDACTED" } }, { "device_name": "/dev/xvdi", "ebs": { "attach_time": "2022-08-10T19:50:24+00:00", "delete_on_termination": true, "status": "attached", "volume_id": "REDACTED" } } ], "capacity_reservation_specification": { "capacity_reservation_preference": "open" }, "client_token": "REDACTED", "cpu_options": { "core_count": 4, "threads_per_core": 2 }, "ebs_optimized": true, "ena_support": true, "enclave_options": { "enabled": false }, "hibernation_options": { "configured": false }, "hypervisor": "xen", "iam_instance_profile": { "arn": "REDACTED", "id": "REDACTED" }, "image_id": "REDACTED", "instance_id": "REDACTED", "instance_type": "m5.2xlarge", "key_name": "REDACTED", "launch_time": "2022-08-10T19:50:23+00:00", "maintenance_options": { "auto_recovery": "default" }, "metadata_options": { "http_endpoint": "enabled", "http_protocol_ipv6": "disabled", "http_put_response_hop_limit": 1, "http_tokens": "optional", "instance_metadata_tags": "disabled", "state": "applied" }, "monitoring": { "state": "disabled" }, "network_interfaces": [ { "attachment": { "attach_time": "2022-08-10T19:50:23+00:00", "attachment_id": "REDACTED", "delete_on_termination": true, "device_index": 0, "network_card_index": 0, "status": "attached" }, "description": "", "groups": [ { "group_id": "REDACTED", "group_name": "REDACTED" } ], "interface_type": "interface", "ipv6_addresses": [], "mac_address": "REDACTED", "network_interface_id": "REDACTED", "owner_id": "REDACTED", "private_dns_name": "REDACTED", "private_ip_address": "REDACTED", "private_ip_addresses": [ { "primary": true, "private_dns_name": "REDACTED", "private_ip_address": "REDACTED" } ], "source_dest_check": true, "status": "in-use", "subnet_id": "REDACTED", "vpc_id": "REDACTED" } ], "placement": { "availability_zone": "us-west-2a", "group_name": "", "tenancy": "default" }, "platform_details": "Linux/UNIX", "private_dns_name": "REDACTED", "private_dns_name_options": { "enable_resource_name_dns_a_record": false, "enable_resource_name_dns_aaaa_record": false, "hostname_type": "ip-name" }, "private_ip_address": "REDACTED", "product_codes": [], "public_dns_name": "", "root_device_name": "/dev/sda1", "root_device_type": "ebs", "security_groups": [ { "group_id": "REDACTED", "group_name": "REDACTED" } ], "source_dest_check": true, "state": { "code": 16, "name": "running" }, "state_transition_reason": "", "subnet_id": "REDACTED", "tags": { "Name": "something", "env": "prod", }, "usage_operation": "RunInstances", "usage_operation_update_time": "2022-08-10T19:50:23+00:00", "virtualization_type": "hvm", "vpc_id": "REDACTED" } ], "invocation": { "module_args": { "availability_zone": null, "aws_access_key": null, "aws_ca_bundle": null, "aws_config": null, "aws_secret_key": null, "count": null, "cpu_credit_specification": null, "cpu_options": null, "debug_botocore_endpoint_logs": false, "detailed_monitoring": false, "ebs_optimized": true, "ec2_url": null, "exact_count": 1, "filters": { "tag:Name": "something", "tag:env": "prod" }, "image": null, "image_id": "REDACTED", "instance_ids": [], "instance_initiated_shutdown_behavior": null, "instance_role": "REDACTED", "instance_type": "m5.2xlarge", "key_name": "REDACTED", "launch_template": null, "metadata_options": null, "name": null, "network": { "source_dest_check": true }, "placement_group": null, "profile": null, "purge_tags": false, "region": "us-west-2", "security_group": null, "security_groups": [ "default" ], "security_token": null, "state": "present", "tags": { "Name": "something", "env": "prod", }, "tenancy": null, "termination_protection": null, "tower_callback": null, "user_data": "REDACTED", "validate_certs": true, "volumes": [ { "device_name": "/dev/sda1", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 20, "volume_type": "gp3" } }, { "device_name": "/dev/xvdo", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 20, "volume_type": "gp3" } }, { "device_name": "/dev/xvdp", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 10, "volume_type": "gp3" } }, { "device_name": "/dev/xvdi", "ebs": { "delete_on_termination": true, "encrypted": true, "volume_size": 100, "volume_type": "gp3" } } ], "vpc_subnet_id": "REDACTED", "wait": true, "wait_timeout": 300 } }, "msg": "1 instances already running, nothing to do." } Reviewed-by: Alina Buzachis Reviewed-by: Mark Chappell
sns_topic - Add tags and purge_tags options SUMMARY sns_topic - Add tags and purge_tags options Closes ansible-collections#964 ISSUE TYPE Feature Pull Request COMPONENT NAME sns_topic Reviewed-by: Mark Woolley <[email protected]> Reviewed-by: Mark Chappell <None> Reviewed-by: Alina Buzachis <None>
sns_topic - Add tags and purge_tags options SUMMARY sns_topic - Add tags and purge_tags options Closes ansible-collections#964 ISSUE TYPE Feature Pull Request COMPONENT NAME sns_topic Reviewed-by: Mark Woolley <[email protected]> Reviewed-by: Mark Chappell <None> Reviewed-by: Alina Buzachis <None>
sns_topic - Add tags and purge_tags options SUMMARY sns_topic - Add tags and purge_tags options Closes ansible-collections#964 ISSUE TYPE Feature Pull Request COMPONENT NAME sns_topic Reviewed-by: Mark Woolley <[email protected]> Reviewed-by: Mark Chappell <None> Reviewed-by: Alina Buzachis <None>
SUMMARY
This is the Ansible way.
Since a call to enforce_count() requires that a call to find_instances() has already been made, the information required to populate the
instances
return key is already held by the variableexisting_matches
. There are zero use cases where it makes sense not to output this information; if I want exactly one such instance and an existing instance matches the filter, I definitely always want to know its details.Fixes #963, #859
ISSUE TYPE
COMPONENT NAME
ec2_instance
ADDITIONAL INFORMATION
See linked issues.
Before:
After: