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