1from moto.core.responses import BaseResponse 2 3 4class AvailabilityZonesAndRegions(BaseResponse): 5 def describe_availability_zones(self): 6 self.error_on_dryrun() 7 zones = self.ec2_backend.describe_availability_zones() 8 template = self.response_template(DESCRIBE_ZONES_RESPONSE) 9 return template.render(zones=zones) 10 11 def describe_regions(self): 12 self.error_on_dryrun() 13 region_names = self._get_multi_param("RegionName") 14 regions = self.ec2_backend.describe_regions(region_names) 15 template = self.response_template(DESCRIBE_REGIONS_RESPONSE) 16 return template.render(regions=regions) 17 18 19DESCRIBE_REGIONS_RESPONSE = """<DescribeRegionsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/"> 20 <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId> 21 <regionInfo> 22 {% for region in regions %} 23 <item> 24 <regionName>{{ region.name }}</regionName> 25 <regionEndpoint>{{ region.endpoint }}</regionEndpoint> 26 <optInStatus>{{ region.opt_in_status }}</optInStatus> 27 </item> 28 {% endfor %} 29 </regionInfo> 30</DescribeRegionsResponse>""" 31 32DESCRIBE_ZONES_RESPONSE = """<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/"> 33 <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId> 34 <availabilityZoneInfo> 35 {% for zone in zones %} 36 <item> 37 <zoneName>{{ zone.name }}</zoneName> 38 <zoneState>available</zoneState> 39 <regionName>{{ zone.region_name }}</regionName> 40 <zoneId>{{ zone.zone_id }}</zoneId> 41 <messageSet/> 42 </item> 43 {% endfor %} 44 </availabilityZoneInfo> 45</DescribeAvailabilityZonesResponse>""" 46