2525 partition_count:
2626 description:
2727 - The number of partitions.
28- - Valid only when I(Strategy ) is set to C (partition).
29- - Must be a value between C (1) and C (7).
28+ - Valid only when O(strategy ) is set to V (partition).
29+ - Must be a value between V (1) and V (7).
3030 type: int
3131 version_added: 3.1.0
3232 state:
8686placement_group:
8787 description: Placement group attributes
8888 returned: when state != absent
89- type: complex
89+ type: dict
9090 contains:
91+ group_arn:
92+ description: Placement Group ARN.
93+ type: str
94+ returned: always
95+ sample: "arn:aws:ec2:us-east-1:123456789012:placement-group"
96+ group_id:
97+ description: Placement Group Id.
98+ type: str
99+ returned: always
100+ sample: "pg-123456789012"
91101 name:
92- description: PG name
102+ description: Placement Group name.
103+ type: str
104+ returned: always
105+ sample: "my-cluster"
106+ partition_count:
107+ description: Partition Count.
93108 type: str
94- sample: my-cluster
109+ returned: If applicable
110+ sample: "my-cluster"
95111 state:
96- description: PG state
112+ description: Placement Groupt state.
97113 type: str
114+ returned: If applicable
98115 sample: "available"
99116 strategy:
100- description: PG strategy
117+ description: Placement Group strategy.
101118 type: str
119+ returned: If applicable
102120 sample: "cluster"
103121 tags:
104- description: Tags associated with the placement group
122+ description: Tags associated with the placement group.
105123 type: dict
124+ returned: If applicable
106125 version_added: 8.1.0
107126 sample:
108127 tags:
109128 some: value1
110129 other: value2
111130"""
112131
113- try :
114- import botocore
115- except ImportError :
116- pass # caught by AnsibleAWSModule
132+ from typing import Any
133+ from typing import Dict
117134
118- from ansible_collections .amazon .aws .plugins .module_utils .botocore import is_boto3_error_code
119- from ansible_collections .amazon .aws .plugins .module_utils .retries import AWSRetry
135+ from ansible .module_utils .common .dict_transformations import camel_dict_to_snake_dict
136+
137+ from ansible_collections .amazon .aws .plugins .module_utils .ec2 import create_ec2_placement_group
138+ from ansible_collections .amazon .aws .plugins .module_utils .ec2 import delete_ec2_placement_group
139+ from ansible_collections .amazon .aws .plugins .module_utils .ec2 import describe_ec2_placement_groups
120140from ansible_collections .amazon .aws .plugins .module_utils .tagging import boto3_tag_list_to_ansible_dict
121141from ansible_collections .amazon .aws .plugins .module_utils .tagging import boto3_tag_specifications
122142
123143from ansible_collections .community .aws .plugins .module_utils .modules import AnsibleCommunityAWSModule as AnsibleAWSModule
124144
125145
126- @AWSRetry .exponential_backoff ()
127- def search_placement_group (connection , module ):
146+ def search_placement_group (connection , name : str ) -> Dict [str , Any ]:
128147 """
129148 Check if a placement group exists.
130149 """
131- name = module .params .get ("name" )
132- try :
133- response = connection .describe_placement_groups (Filters = [{"Name" : "group-name" , "Values" : [name ]}])
134- except (botocore .exceptions .ClientError , botocore .exceptions .BotoCoreError ) as e :
135- module .fail_json_aws (e , msg = f"Couldn't find placement group named [{ name } ]" )
150+ response = describe_ec2_placement_groups (connection , Filters = [{"Name" : "group-name" , "Values" : [name ]}])
136151
137- if len (response [ "PlacementGroups" ] ) != 1 :
152+ if len (response ) != 1 :
138153 return None
139154 else :
140- placement_group = response ["PlacementGroups" ][0 ]
141- return {
142- "name" : placement_group ["GroupName" ],
143- "state" : placement_group ["State" ],
144- "strategy" : placement_group ["Strategy" ],
145- "tags" : boto3_tag_list_to_ansible_dict (placement_group .get ("Tags" )),
146- }
155+ return format_placement_group_information (response [0 ])
147156
148157
149- @AWSRetry .exponential_backoff (catch_extra_error_codes = ["InvalidPlacementGroup.Unknown" ])
150- def get_placement_group_information (connection , name ):
158+ def format_placement_group_information (response : Dict [str , Any ]) -> Dict [str , Any ]:
151159 """
152- Retrieve information about a placement group.
160+ Format placement group information
153161 """
154- response = connection .describe_placement_groups (GroupNames = [name ])
155- placement_group = response ["PlacementGroups" ][0 ]
156- return {
157- "name" : placement_group ["GroupName" ],
158- "state" : placement_group ["State" ],
159- "strategy" : placement_group ["Strategy" ],
160- "tags" : boto3_tag_list_to_ansible_dict (placement_group .get ("Tags" )),
161- }
162-
163-
164- @AWSRetry .exponential_backoff ()
165- def create_placement_group (connection , module ):
162+
163+ response = camel_dict_to_snake_dict (response , ignore_list = ["Tags" ])
164+ if "tags" in response :
165+ response ["tags" ] = boto3_tag_list_to_ansible_dict (response .get ("tags" , []))
166+ response ["name" ] = response ["group_name" ]
167+ return response
168+
169+
170+ def create_placement_group (connection , module : AnsibleAWSModule ) -> None :
166171 name = module .params .get ("name" )
167172 strategy = module .params .get ("strategy" )
168173 tags = module .params .get ("tags" )
@@ -178,38 +183,26 @@ def create_placement_group(connection, module):
178183 params ["TagSpecifications" ] = boto3_tag_specifications (tags , types = ["placement-group" ])
179184 if partition_count :
180185 params ["PartitionCount" ] = partition_count
181- params ["DryRun" ] = module .check_mode
182-
183- try :
184- connection .create_placement_group (** params )
185- except is_boto3_error_code ("DryRunOperation" ):
186+ if module .check_mode :
186187 module .exit_json (
187188 changed = True ,
188189 placement_group = {
189190 "name" : name ,
190- "state" : "DryRun" ,
191191 "strategy" : strategy ,
192192 "tags" : tags ,
193193 },
194+ msg = "EC2 placement group would be created if not in check mode" ,
194195 )
195- except (
196- botocore .exceptions .ClientError ,
197- botocore .exceptions .BotoCoreError ,
198- ) as e : # pylint: disable=duplicate-except
199- module .fail_json_aws (e , msg = f"Couldn't create placement group [{ name } ]" )
200196
201- module .exit_json (changed = True , placement_group = get_placement_group_information (connection , name ))
197+ response = create_ec2_placement_group (connection , ** params )
198+ module .exit_json (changed = True , placement_group = format_placement_group_information (response ))
202199
203200
204- @AWSRetry .exponential_backoff ()
205- def delete_placement_group (connection , module ):
201+ def delete_placement_group (connection , module : AnsibleAWSModule ) -> None :
202+ if module .check_mode :
203+ module .exit_json (changed = True , msg = "VPC would be deleted if not in check mode" )
206204 name = module .params .get ("name" )
207-
208- try :
209- connection .delete_placement_group (GroupName = name , DryRun = module .check_mode )
210- except (botocore .exceptions .ClientError , botocore .exceptions .BotoCoreError ) as e :
211- module .fail_json_aws (e , msg = f"Couldn't delete placement group [{ name } ]" )
212-
205+ delete_ec2_placement_group (connection , name )
213206 module .exit_json (changed = True )
214207
215208
@@ -227,9 +220,10 @@ def main():
227220 connection = module .client ("ec2" )
228221
229222 state = module .params .get ("state" )
223+ name = module .params .get ("name" )
224+ placement_group = search_placement_group (connection , name )
230225
231226 if state == "present" :
232- placement_group = search_placement_group (connection , module )
233227 if placement_group is None :
234228 create_placement_group (connection , module )
235229 else :
@@ -243,7 +237,6 @@ def main():
243237 )
244238
245239 elif state == "absent" :
246- placement_group = search_placement_group (connection , module )
247240 if placement_group is None :
248241 module .exit_json (changed = False )
249242 else :
0 commit comments