| Index: third_party/gsutil/boto/tests/unit/ec2/test_connection.py
|
| diff --git a/third_party/gsutil/boto/tests/unit/ec2/test_connection.py b/third_party/gsutil/boto/tests/unit/ec2/test_connection.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5f28510feaa0385342e9fe180b61861273573fc6
|
| --- /dev/null
|
| +++ b/third_party/gsutil/boto/tests/unit/ec2/test_connection.py
|
| @@ -0,0 +1,480 @@
|
| +#!/usr/bin/env python
|
| +from tests.unit import unittest
|
| +from tests.unit import AWSMockServiceTestCase
|
| +
|
| +from boto.ec2.connection import EC2Connection
|
| +
|
| +
|
| +class TestEC2ConnectionBase(AWSMockServiceTestCase):
|
| + connection_class = EC2Connection
|
| +
|
| + def setUp(self):
|
| + super(TestEC2ConnectionBase, self).setUp()
|
| + self.ec2 = self.service_connection
|
| +
|
| +
|
| +class TestReservedInstanceOfferings(TestEC2ConnectionBase):
|
| +
|
| + def default_body(self):
|
| + return """
|
| + <DescribeReservedInstancesOfferingsResponse>
|
| + <requestId>d3253568-edcf-4897-9a3d-fb28e0b3fa38</requestId>
|
| + <reservedInstancesOfferingsSet>
|
| + <item>
|
| + <reservedInstancesOfferingId>2964d1bf71d8</reservedInstancesOfferingId>
|
| + <instanceType>c1.medium</instanceType>
|
| + <availabilityZone>us-east-1c</availabilityZone>
|
| + <duration>94608000</duration>
|
| + <fixedPrice>775.0</fixedPrice>
|
| + <usagePrice>0.0</usagePrice>
|
| + <productDescription>product description</productDescription>
|
| + <instanceTenancy>default</instanceTenancy>
|
| + <currencyCode>USD</currencyCode>
|
| + <offeringType>Heavy Utilization</offeringType>
|
| + <recurringCharges>
|
| + <item>
|
| + <frequency>Hourly</frequency>
|
| + <amount>0.095</amount>
|
| + </item>
|
| + </recurringCharges>
|
| + <marketplace>false</marketplace>
|
| + <pricingDetailsSet>
|
| + <item>
|
| + <price>0.045</price>
|
| + <count>1</count>
|
| + </item>
|
| + </pricingDetailsSet>
|
| + </item>
|
| + <item>
|
| + <reservedInstancesOfferingId>2dce26e46889</reservedInstancesOfferingId>
|
| + <instanceType>c1.medium</instanceType>
|
| + <availabilityZone>us-east-1c</availabilityZone>
|
| + <duration>94608000</duration>
|
| + <fixedPrice>775.0</fixedPrice>
|
| + <usagePrice>0.0</usagePrice>
|
| + <productDescription>Linux/UNIX</productDescription>
|
| + <instanceTenancy>default</instanceTenancy>
|
| + <currencyCode>USD</currencyCode>
|
| + <offeringType>Heavy Utilization</offeringType>
|
| + <recurringCharges>
|
| + <item>
|
| + <frequency>Hourly</frequency>
|
| + <amount>0.035</amount>
|
| + </item>
|
| + </recurringCharges>
|
| + <marketplace>false</marketplace>
|
| + <pricingDetailsSet/>
|
| + </item>
|
| + </reservedInstancesOfferingsSet>
|
| + <nextToken>next_token</nextToken>
|
| + </DescribeReservedInstancesOfferingsResponse>
|
| + """
|
| +
|
| + def test_get_reserved_instance_offerings(self):
|
| + self.set_http_response(status_code=200)
|
| + response = self.ec2.get_all_reserved_instances_offerings()
|
| + self.assertEqual(len(response), 2)
|
| + instance = response[0]
|
| + self.assertEqual(instance.id, '2964d1bf71d8')
|
| + self.assertEqual(instance.instance_type, 'c1.medium')
|
| + self.assertEqual(instance.availability_zone, 'us-east-1c')
|
| + self.assertEqual(instance.duration, 94608000)
|
| + self.assertEqual(instance.fixed_price, '775.0')
|
| + self.assertEqual(instance.usage_price, '0.0')
|
| + self.assertEqual(instance.description, 'product description')
|
| + self.assertEqual(instance.instance_tenancy, 'default')
|
| + self.assertEqual(instance.currency_code, 'USD')
|
| + self.assertEqual(instance.offering_type, 'Heavy Utilization')
|
| + self.assertEqual(len(instance.recurring_charges), 1)
|
| + self.assertEqual(instance.recurring_charges[0].frequency, 'Hourly')
|
| + self.assertEqual(instance.recurring_charges[0].amount, '0.095')
|
| + self.assertEqual(len(instance.pricing_details), 1)
|
| + self.assertEqual(instance.pricing_details[0].price, '0.045')
|
| + self.assertEqual(instance.pricing_details[0].count, '1')
|
| +
|
| + def test_get_reserved_instance_offerings_params(self):
|
| + self.set_http_response(status_code=200)
|
| + self.ec2.get_all_reserved_instances_offerings(
|
| + reserved_instances_offering_ids=['id1','id2'],
|
| + instance_type='t1.micro',
|
| + availability_zone='us-east-1',
|
| + product_description='description',
|
| + instance_tenancy='dedicated',
|
| + offering_type='offering_type',
|
| + include_marketplace=False,
|
| + min_duration=100,
|
| + max_duration=1000,
|
| + max_instance_count=1,
|
| + next_token='next_token',
|
| + max_results=10
|
| + )
|
| + self.assert_request_parameters({
|
| + 'Action': 'DescribeReservedInstancesOfferings',
|
| + 'ReservedInstancesOfferingId.1': 'id1',
|
| + 'ReservedInstancesOfferingId.2': 'id2',
|
| + 'InstanceType': 't1.micro',
|
| + 'AvailabilityZone': 'us-east-1',
|
| + 'ProductDescription': 'description',
|
| + 'InstanceTenancy': 'dedicated',
|
| + 'OfferingType': 'offering_type',
|
| + 'IncludeMarketplace': 'false',
|
| + 'MinDuration': '100',
|
| + 'MaxDuration': '1000',
|
| + 'MaxInstanceCount': '1',
|
| + 'NextToken': 'next_token',
|
| + 'MaxResults': '10',},
|
| + ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
|
| + 'SignatureVersion', 'Timestamp', 'Version'])
|
| +
|
| +
|
| +class TestPurchaseReservedInstanceOffering(TestEC2ConnectionBase):
|
| + def default_body(self):
|
| + return """<PurchaseReservedInstancesOffering />"""
|
| +
|
| + def test_serialized_api_args(self):
|
| + self.set_http_response(status_code=200)
|
| + response = self.ec2.purchase_reserved_instance_offering(
|
| + 'offering_id', 1, (100.0, 'USD'))
|
| + self.assert_request_parameters({
|
| + 'Action': 'PurchaseReservedInstancesOffering',
|
| + 'InstanceCount': 1,
|
| + 'ReservedInstancesOfferingId': 'offering_id',
|
| + 'LimitPrice.Amount': '100.0',
|
| + 'LimitPrice.CurrencyCode': 'USD',},
|
| + ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
|
| + 'SignatureVersion', 'Timestamp',
|
| + 'Version'])
|
| +
|
| +
|
| +class TestCancelReservedInstancesListing(TestEC2ConnectionBase):
|
| + def default_body(self):
|
| + return """
|
| + <CancelReservedInstancesListingResponse>
|
| + <requestId>request_id</requestId>
|
| + <reservedInstancesListingsSet>
|
| + <item>
|
| + <reservedInstancesListingId>listing_id</reservedInstancesListingId>
|
| + <reservedInstancesId>instance_id</reservedInstancesId>
|
| + <createDate>2012-07-12T16:55:28.000Z</createDate>
|
| + <updateDate>2012-07-12T16:55:28.000Z</updateDate>
|
| + <status>cancelled</status>
|
| + <statusMessage>CANCELLED</statusMessage>
|
| + <instanceCounts>
|
| + <item>
|
| + <state>Available</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Sold</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Cancelled</state>
|
| + <instanceCount>1</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Pending</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + </instanceCounts>
|
| + <priceSchedules>
|
| + <item>
|
| + <term>5</term>
|
| + <price>166.64</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>4</term>
|
| + <price>133.32</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>3</term>
|
| + <price>99.99</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>2</term>
|
| + <price>66.66</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>1</term>
|
| + <price>33.33</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + </priceSchedules>
|
| + <tagSet/>
|
| + <clientToken>XqJIt1342112125076</clientToken>
|
| + </item>
|
| + </reservedInstancesListingsSet>
|
| + </CancelReservedInstancesListingResponse>
|
| + """
|
| +
|
| + def test_reserved_instances_listing(self):
|
| + self.set_http_response(status_code=200)
|
| + response = self.ec2.cancel_reserved_instances_listing()
|
| + self.assertEqual(len(response), 1)
|
| + cancellation = response[0]
|
| + self.assertEqual(cancellation.status, 'cancelled')
|
| + self.assertEqual(cancellation.status_message, 'CANCELLED')
|
| + self.assertEqual(len(cancellation.instance_counts), 4)
|
| + first = cancellation.instance_counts[0]
|
| + self.assertEqual(first.state, 'Available')
|
| + self.assertEqual(first.instance_count, 0)
|
| + self.assertEqual(len(cancellation.price_schedules), 5)
|
| + schedule = cancellation.price_schedules[0]
|
| + self.assertEqual(schedule.term, 5)
|
| + self.assertEqual(schedule.price, '166.64')
|
| + self.assertEqual(schedule.currency_code, 'USD')
|
| + self.assertEqual(schedule.active, False)
|
| +
|
| +
|
| +class TestCreateReservedInstancesListing(TestEC2ConnectionBase):
|
| + def default_body(self):
|
| + return """
|
| + <CreateReservedInstancesListingResponse>
|
| + <requestId>request_id</requestId>
|
| + <reservedInstancesListingsSet>
|
| + <item>
|
| + <reservedInstancesListingId>listing_id</reservedInstancesListingId>
|
| + <reservedInstancesId>instance_id</reservedInstancesId>
|
| + <createDate>2012-07-17T17:11:09.449Z</createDate>
|
| + <updateDate>2012-07-17T17:11:09.468Z</updateDate>
|
| + <status>active</status>
|
| + <statusMessage>ACTIVE</statusMessage>
|
| + <instanceCounts>
|
| + <item>
|
| + <state>Available</state>
|
| + <instanceCount>1</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Sold</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Cancelled</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + <item>
|
| + <state>Pending</state>
|
| + <instanceCount>0</instanceCount>
|
| + </item>
|
| + </instanceCounts>
|
| + <priceSchedules>
|
| + <item>
|
| + <term>11</term>
|
| + <price>2.5</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>true</active>
|
| + </item>
|
| + <item>
|
| + <term>10</term>
|
| + <price>2.5</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>9</term>
|
| + <price>2.5</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>8</term>
|
| + <price>2.0</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>7</term>
|
| + <price>2.0</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>6</term>
|
| + <price>2.0</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>5</term>
|
| + <price>1.5</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>4</term>
|
| + <price>1.5</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>3</term>
|
| + <price>0.7</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>2</term>
|
| + <price>0.7</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + <item>
|
| + <term>1</term>
|
| + <price>0.1</price>
|
| + <currencyCode>USD</currencyCode>
|
| + <active>false</active>
|
| + </item>
|
| + </priceSchedules>
|
| + <tagSet/>
|
| + <clientToken>myIdempToken1</clientToken>
|
| + </item>
|
| + </reservedInstancesListingsSet>
|
| + </CreateReservedInstancesListingResponse>
|
| + """
|
| +
|
| + def test_create_reserved_instances_listing(self):
|
| + self.set_http_response(status_code=200)
|
| + response = self.ec2.create_reserved_instances_listing(
|
| + 'instance_id', 1, [('2.5', 11), ('2.0', 8)], 'client_token')
|
| + self.assertEqual(len(response), 1)
|
| + cancellation = response[0]
|
| + self.assertEqual(cancellation.status, 'active')
|
| + self.assertEqual(cancellation.status_message, 'ACTIVE')
|
| + self.assertEqual(len(cancellation.instance_counts), 4)
|
| + first = cancellation.instance_counts[0]
|
| + self.assertEqual(first.state, 'Available')
|
| + self.assertEqual(first.instance_count, 1)
|
| + self.assertEqual(len(cancellation.price_schedules), 11)
|
| + schedule = cancellation.price_schedules[0]
|
| + self.assertEqual(schedule.term, 11)
|
| + self.assertEqual(schedule.price, '2.5')
|
| + self.assertEqual(schedule.currency_code, 'USD')
|
| + self.assertEqual(schedule.active, True)
|
| +
|
| + self.assert_request_parameters({
|
| + 'Action': 'CreateReservedInstancesListing',
|
| + 'ReservedInstancesId': 'instance_id',
|
| + 'InstanceCount': '1',
|
| + 'ClientToken': 'client_token',
|
| + 'PriceSchedules.0.Price': '2.5',
|
| + 'PriceSchedules.0.Term': '11',
|
| + 'PriceSchedules.1.Price': '2.0',
|
| + 'PriceSchedules.1.Term': '8',},
|
| + ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
|
| + 'SignatureVersion', 'Timestamp',
|
| + 'Version'])
|
| +
|
| +
|
| +class TestDescribeSpotInstanceRequests(TestEC2ConnectionBase):
|
| + def default_body(self):
|
| + return """
|
| + <DescribeSpotInstanceRequestsResponse>
|
| + <requestId>requestid</requestId>
|
| + <spotInstanceRequestSet>
|
| + <item>
|
| + <spotInstanceRequestId>sir-id</spotInstanceRequestId>
|
| + <spotPrice>0.003000</spotPrice>
|
| + <type>one-time</type>
|
| + <state>active</state>
|
| + <status>
|
| + <code>fulfilled</code>
|
| + <updateTime>2012-10-19T18:09:26.000Z</updateTime>
|
| + <message>Your Spot request is fulfilled.</message>
|
| + </status>
|
| + <launchGroup>mylaunchgroup</launchGroup>
|
| + <launchSpecification>
|
| + <imageId>ami-id</imageId>
|
| + <keyName>mykeypair</keyName>
|
| + <groupSet>
|
| + <item>
|
| + <groupId>sg-id</groupId>
|
| + <groupName>groupname</groupName>
|
| + </item>
|
| + </groupSet>
|
| + <instanceType>t1.micro</instanceType>
|
| + <monitoring>
|
| + <enabled>false</enabled>
|
| + </monitoring>
|
| + </launchSpecification>
|
| + <instanceId>i-id</instanceId>
|
| + <createTime>2012-10-19T18:07:05.000Z</createTime>
|
| + <productDescription>Linux/UNIX</productDescription>
|
| + <launchedAvailabilityZone>us-east-1d</launchedAvailabilityZone>
|
| + </item>
|
| + </spotInstanceRequestSet>
|
| + </DescribeSpotInstanceRequestsResponse>
|
| + """
|
| +
|
| + def test_describe_spot_instance_requets(self):
|
| + self.set_http_response(status_code=200)
|
| + response = self.ec2.get_all_spot_instance_requests()
|
| + self.assertEqual(len(response), 1)
|
| + spotrequest = response[0]
|
| + self.assertEqual(spotrequest.id, 'sir-id')
|
| + self.assertEqual(spotrequest.price, 0.003)
|
| + self.assertEqual(spotrequest.type, 'one-time')
|
| + self.assertEqual(spotrequest.state, 'active')
|
| + self.assertEqual(spotrequest.fault, None)
|
| + self.assertEqual(spotrequest.valid_from, None)
|
| + self.assertEqual(spotrequest.valid_until, None)
|
| + self.assertEqual(spotrequest.launch_group, 'mylaunchgroup')
|
| + self.assertEqual(spotrequest.launched_availability_zone, 'us-east-1d')
|
| + self.assertEqual(spotrequest.product_description, 'Linux/UNIX')
|
| + self.assertEqual(spotrequest.availability_zone_group, None)
|
| + self.assertEqual(spotrequest.create_time,
|
| + '2012-10-19T18:07:05.000Z')
|
| + self.assertEqual(spotrequest.instance_id, 'i-id')
|
| + launch_spec = spotrequest.launch_specification
|
| + self.assertEqual(launch_spec.key_name, 'mykeypair')
|
| + self.assertEqual(launch_spec.instance_type, 't1.micro')
|
| + self.assertEqual(launch_spec.image_id, 'ami-id')
|
| + self.assertEqual(launch_spec.placement, None)
|
| + self.assertEqual(launch_spec.kernel, None)
|
| + self.assertEqual(launch_spec.ramdisk, None)
|
| + self.assertEqual(launch_spec.monitored, False)
|
| + self.assertEqual(launch_spec.subnet_id, None)
|
| + self.assertEqual(launch_spec.block_device_mapping, None)
|
| + self.assertEqual(launch_spec.instance_profile, None)
|
| + self.assertEqual(launch_spec.ebs_optimized, False)
|
| + status = spotrequest.status
|
| + self.assertEqual(status.code, 'fulfilled')
|
| + self.assertEqual(status.update_time, '2012-10-19T18:09:26.000Z')
|
| + self.assertEqual(status.message, 'Your Spot request is fulfilled.')
|
| +
|
| +
|
| +class TestCopySnapshot(TestEC2ConnectionBase):
|
| + def default_body(self):
|
| + return """
|
| + <CopySnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2012-12-01/">
|
| + <requestId>request_id</requestId>
|
| + <snapshotId>snap-copied-id</snapshotId>
|
| + </CopySnapshotResponse>
|
| + """
|
| +
|
| + def test_copy_snapshot(self):
|
| + self.set_http_response(status_code=200)
|
| + snapshot_id = self.ec2.copy_snapshot('us-west-2', 'snap-id',
|
| + 'description')
|
| + self.assertEqual(snapshot_id, 'snap-copied-id')
|
| +
|
| + self.assert_request_parameters({
|
| + 'Action': 'CopySnapshot',
|
| + 'Description': 'description',
|
| + 'SourceRegion': 'us-west-2',
|
| + 'SourceSnapshotId': 'snap-id'},
|
| + ignore_params_values=['AWSAccessKeyId', 'SignatureMethod',
|
| + 'SignatureVersion', 'Timestamp',
|
| + 'Version'])
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|