aws-sdk-costexplorer 1.79.0 → 1.80.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-costexplorer/client.rb +87 -3
- data/lib/aws-sdk-costexplorer/client_api.rb +62 -0
- data/lib/aws-sdk-costexplorer/endpoint_parameters.rb +3 -0
- data/lib/aws-sdk-costexplorer/endpoint_provider.rb +180 -181
- data/lib/aws-sdk-costexplorer/endpoints.rb +28 -0
- data/lib/aws-sdk-costexplorer/errors.rb +16 -0
- data/lib/aws-sdk-costexplorer/plugins/endpoints.rb +4 -0
- data/lib/aws-sdk-costexplorer/types.rb +118 -1450
- data/lib/aws-sdk-costexplorer.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f29b723690f77b46793898db81ba6e1f209f34e2354626394a2d2b8efd17b35b
|
4
|
+
data.tar.gz: cb6e46daf2706629f949d5ef43238ae6d27dfca49bc916d9c4475181f017d44a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b34ff974f7f1e5a69df15f3ceb033001b4f73771ddcaabedcb05d598499fc1e386f00d4cf10767d8888335c9b176c66d327f0ae2d6c39f775833adeda9806441
|
7
|
+
data.tar.gz: 77c3259379b7d91dc6fc6a0048c5ed9a52d16fd77c81738ea8a33c5c4265210e9606f5ea32a266be4fd4b1f912427c584a093057b08d440c1fe793a28ea27c2c
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
Unreleased Changes
|
2
2
|
------------------
|
3
3
|
|
4
|
+
1.80.0 (2022-12-05)
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* Feature - This release introduces two new APIs that offer a 1-click experience to refresh Savings Plans recommendations. The two APIs are StartSavingsPlansPurchaseRecommendationGeneration and ListSavingsPlansPurchaseRecommendationGeneration.
|
8
|
+
|
4
9
|
1.79.0 (2022-10-25)
|
5
10
|
------------------
|
6
11
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.80.0
|
@@ -3292,8 +3292,10 @@ module Aws::CostExplorer
|
|
3292
3292
|
req.send_request(options)
|
3293
3293
|
end
|
3294
3294
|
|
3295
|
-
# Retrieves
|
3296
|
-
#
|
3295
|
+
# Retrieves the Savings Plans recommendations for your account. First
|
3296
|
+
# use `StartSavingsPlansPurchaseRecommendationGeneration` to generate a
|
3297
|
+
# new set of recommendations, and then use
|
3298
|
+
# `GetSavingsPlansPurchaseRecommendation` to retrieve them.
|
3297
3299
|
#
|
3298
3300
|
# @option params [required, String] :savings_plans_type
|
3299
3301
|
# The Savings Plans recommendation type that's requested.
|
@@ -4208,6 +4210,55 @@ module Aws::CostExplorer
|
|
4208
4210
|
req.send_request(options)
|
4209
4211
|
end
|
4210
4212
|
|
4213
|
+
# Retrieves a list of your historical recommendation generations within
|
4214
|
+
# the past 30 days.
|
4215
|
+
#
|
4216
|
+
# @option params [String] :generation_status
|
4217
|
+
# The status of the recommendation generation.
|
4218
|
+
#
|
4219
|
+
# @option params [Array<String>] :recommendation_ids
|
4220
|
+
# The IDs for each specific recommendation.
|
4221
|
+
#
|
4222
|
+
# @option params [Integer] :page_size
|
4223
|
+
# The number of recommendations that you want returned in a single
|
4224
|
+
# response object.
|
4225
|
+
#
|
4226
|
+
# @option params [String] :next_page_token
|
4227
|
+
# The token to retrieve the next set of results.
|
4228
|
+
#
|
4229
|
+
# @return [Types::ListSavingsPlansPurchaseRecommendationGenerationResponse] Returns a {Seahorse::Client::Response response} object which responds to the following methods:
|
4230
|
+
#
|
4231
|
+
# * {Types::ListSavingsPlansPurchaseRecommendationGenerationResponse#generation_summary_list #generation_summary_list} => Array<Types::GenerationSummary>
|
4232
|
+
# * {Types::ListSavingsPlansPurchaseRecommendationGenerationResponse#next_page_token #next_page_token} => String
|
4233
|
+
#
|
4234
|
+
# @example Request syntax with placeholder values
|
4235
|
+
#
|
4236
|
+
# resp = client.list_savings_plans_purchase_recommendation_generation({
|
4237
|
+
# generation_status: "SUCCEEDED", # accepts SUCCEEDED, PROCESSING, FAILED
|
4238
|
+
# recommendation_ids: ["RecommendationId"],
|
4239
|
+
# page_size: 1,
|
4240
|
+
# next_page_token: "NextPageToken",
|
4241
|
+
# })
|
4242
|
+
#
|
4243
|
+
# @example Response structure
|
4244
|
+
#
|
4245
|
+
# resp.generation_summary_list #=> Array
|
4246
|
+
# resp.generation_summary_list[0].recommendation_id #=> String
|
4247
|
+
# resp.generation_summary_list[0].generation_status #=> String, one of "SUCCEEDED", "PROCESSING", "FAILED"
|
4248
|
+
# resp.generation_summary_list[0].generation_started_time #=> String
|
4249
|
+
# resp.generation_summary_list[0].generation_completion_time #=> String
|
4250
|
+
# resp.generation_summary_list[0].estimated_completion_time #=> String
|
4251
|
+
# resp.next_page_token #=> String
|
4252
|
+
#
|
4253
|
+
# @see http://docs.aws.amazon.com/goto/WebAPI/ce-2017-10-25/ListSavingsPlansPurchaseRecommendationGeneration AWS API Documentation
|
4254
|
+
#
|
4255
|
+
# @overload list_savings_plans_purchase_recommendation_generation(params = {})
|
4256
|
+
# @param [Hash] params ({})
|
4257
|
+
def list_savings_plans_purchase_recommendation_generation(params = {}, options = {})
|
4258
|
+
req = build_request(:list_savings_plans_purchase_recommendation_generation, params)
|
4259
|
+
req.send_request(options)
|
4260
|
+
end
|
4261
|
+
|
4211
4262
|
# Returns a list of resource tags associated with the resource specified
|
4212
4263
|
# by the Amazon Resource Name (ARN).
|
4213
4264
|
#
|
@@ -4277,6 +4328,39 @@ module Aws::CostExplorer
|
|
4277
4328
|
req.send_request(options)
|
4278
4329
|
end
|
4279
4330
|
|
4331
|
+
# Requests a Savings Plans recommendation generation. This enables you
|
4332
|
+
# to calculate a fresh set of Savings Plans recommendations that takes
|
4333
|
+
# your latest usage data and current Savings Plans inventory into
|
4334
|
+
# account. You can refresh Savings Plans recommendations up to three
|
4335
|
+
# times daily for a consolidated billing family.
|
4336
|
+
#
|
4337
|
+
# <note markdown="1"> `StartSavingsPlansPurchaseRecommendationGeneration` has no request
|
4338
|
+
# syntax because no input parameters are needed to support this
|
4339
|
+
# operation.
|
4340
|
+
#
|
4341
|
+
# </note>
|
4342
|
+
#
|
4343
|
+
# @return [Types::StartSavingsPlansPurchaseRecommendationGenerationResponse] Returns a {Seahorse::Client::Response response} object which responds to the following methods:
|
4344
|
+
#
|
4345
|
+
# * {Types::StartSavingsPlansPurchaseRecommendationGenerationResponse#recommendation_id #recommendation_id} => String
|
4346
|
+
# * {Types::StartSavingsPlansPurchaseRecommendationGenerationResponse#generation_started_time #generation_started_time} => String
|
4347
|
+
# * {Types::StartSavingsPlansPurchaseRecommendationGenerationResponse#estimated_completion_time #estimated_completion_time} => String
|
4348
|
+
#
|
4349
|
+
# @example Response structure
|
4350
|
+
#
|
4351
|
+
# resp.recommendation_id #=> String
|
4352
|
+
# resp.generation_started_time #=> String
|
4353
|
+
# resp.estimated_completion_time #=> String
|
4354
|
+
#
|
4355
|
+
# @see http://docs.aws.amazon.com/goto/WebAPI/ce-2017-10-25/StartSavingsPlansPurchaseRecommendationGeneration AWS API Documentation
|
4356
|
+
#
|
4357
|
+
# @overload start_savings_plans_purchase_recommendation_generation(params = {})
|
4358
|
+
# @param [Hash] params ({})
|
4359
|
+
def start_savings_plans_purchase_recommendation_generation(params = {}, options = {})
|
4360
|
+
req = build_request(:start_savings_plans_purchase_recommendation_generation, params)
|
4361
|
+
req.send_request(options)
|
4362
|
+
end
|
4363
|
+
|
4280
4364
|
# An API operation for adding one or more tags (key-value pairs) to a
|
4281
4365
|
# resource.
|
4282
4366
|
#
|
@@ -4634,7 +4718,7 @@ module Aws::CostExplorer
|
|
4634
4718
|
params: params,
|
4635
4719
|
config: config)
|
4636
4720
|
context[:gem_name] = 'aws-sdk-costexplorer'
|
4637
|
-
context[:gem_version] = '1.
|
4721
|
+
context[:gem_version] = '1.80.0'
|
4638
4722
|
Seahorse::Client::Request.new(handlers, context)
|
4639
4723
|
end
|
4640
4724
|
|
@@ -113,6 +113,10 @@ module Aws::CostExplorer
|
|
113
113
|
FindingReasonCodes = Shapes::ListShape.new(name: 'FindingReasonCodes')
|
114
114
|
ForecastResult = Shapes::StructureShape.new(name: 'ForecastResult')
|
115
115
|
ForecastResultsByTime = Shapes::ListShape.new(name: 'ForecastResultsByTime')
|
116
|
+
GenerationExistsException = Shapes::StructureShape.new(name: 'GenerationExistsException')
|
117
|
+
GenerationStatus = Shapes::StringShape.new(name: 'GenerationStatus')
|
118
|
+
GenerationSummary = Shapes::StructureShape.new(name: 'GenerationSummary')
|
119
|
+
GenerationSummaryList = Shapes::ListShape.new(name: 'GenerationSummaryList')
|
116
120
|
GenericBoolean = Shapes::BooleanShape.new(name: 'GenericBoolean')
|
117
121
|
GenericDouble = Shapes::FloatShape.new(name: 'GenericDouble')
|
118
122
|
GenericString = Shapes::StringShape.new(name: 'GenericString')
|
@@ -169,6 +173,8 @@ module Aws::CostExplorer
|
|
169
173
|
ListCostAllocationTagsResponse = Shapes::StructureShape.new(name: 'ListCostAllocationTagsResponse')
|
170
174
|
ListCostCategoryDefinitionsRequest = Shapes::StructureShape.new(name: 'ListCostCategoryDefinitionsRequest')
|
171
175
|
ListCostCategoryDefinitionsResponse = Shapes::StructureShape.new(name: 'ListCostCategoryDefinitionsResponse')
|
176
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest = Shapes::StructureShape.new(name: 'ListSavingsPlansPurchaseRecommendationGenerationRequest')
|
177
|
+
ListSavingsPlansPurchaseRecommendationGenerationResponse = Shapes::StructureShape.new(name: 'ListSavingsPlansPurchaseRecommendationGenerationResponse')
|
172
178
|
ListTagsForResourceRequest = Shapes::StructureShape.new(name: 'ListTagsForResourceRequest')
|
173
179
|
ListTagsForResourceResponse = Shapes::StructureShape.new(name: 'ListTagsForResourceResponse')
|
174
180
|
LookbackPeriodInDays = Shapes::StringShape.new(name: 'LookbackPeriodInDays')
|
@@ -209,6 +215,8 @@ module Aws::CostExplorer
|
|
209
215
|
RDSInstanceDetails = Shapes::StructureShape.new(name: 'RDSInstanceDetails')
|
210
216
|
RICostForUnusedHours = Shapes::StringShape.new(name: 'RICostForUnusedHours')
|
211
217
|
RealizedSavings = Shapes::StringShape.new(name: 'RealizedSavings')
|
218
|
+
RecommendationId = Shapes::StringShape.new(name: 'RecommendationId')
|
219
|
+
RecommendationIdList = Shapes::ListShape.new(name: 'RecommendationIdList')
|
212
220
|
RecommendationTarget = Shapes::StringShape.new(name: 'RecommendationTarget')
|
213
221
|
RedshiftInstanceDetails = Shapes::StructureShape.new(name: 'RedshiftInstanceDetails')
|
214
222
|
RequestChangedException = Shapes::StructureShape.new(name: 'RequestChangedException')
|
@@ -272,6 +280,8 @@ module Aws::CostExplorer
|
|
272
280
|
SortDefinitionKey = Shapes::StringShape.new(name: 'SortDefinitionKey')
|
273
281
|
SortDefinitions = Shapes::ListShape.new(name: 'SortDefinitions')
|
274
282
|
SortOrder = Shapes::StringShape.new(name: 'SortOrder')
|
283
|
+
StartSavingsPlansPurchaseRecommendationGenerationRequest = Shapes::StructureShape.new(name: 'StartSavingsPlansPurchaseRecommendationGenerationRequest')
|
284
|
+
StartSavingsPlansPurchaseRecommendationGenerationResponse = Shapes::StructureShape.new(name: 'StartSavingsPlansPurchaseRecommendationGenerationResponse')
|
275
285
|
Subscriber = Shapes::StructureShape.new(name: 'Subscriber')
|
276
286
|
SubscriberAddress = Shapes::StringShape.new(name: 'SubscriberAddress')
|
277
287
|
SubscriberStatus = Shapes::StringShape.new(name: 'SubscriberStatus')
|
@@ -645,6 +655,18 @@ module Aws::CostExplorer
|
|
645
655
|
|
646
656
|
ForecastResultsByTime.member = Shapes::ShapeRef.new(shape: ForecastResult)
|
647
657
|
|
658
|
+
GenerationExistsException.add_member(:message, Shapes::ShapeRef.new(shape: ErrorMessage, location_name: "Message"))
|
659
|
+
GenerationExistsException.struct_class = Types::GenerationExistsException
|
660
|
+
|
661
|
+
GenerationSummary.add_member(:recommendation_id, Shapes::ShapeRef.new(shape: RecommendationId, location_name: "RecommendationId"))
|
662
|
+
GenerationSummary.add_member(:generation_status, Shapes::ShapeRef.new(shape: GenerationStatus, location_name: "GenerationStatus"))
|
663
|
+
GenerationSummary.add_member(:generation_started_time, Shapes::ShapeRef.new(shape: ZonedDateTime, location_name: "GenerationStartedTime"))
|
664
|
+
GenerationSummary.add_member(:generation_completion_time, Shapes::ShapeRef.new(shape: ZonedDateTime, location_name: "GenerationCompletionTime"))
|
665
|
+
GenerationSummary.add_member(:estimated_completion_time, Shapes::ShapeRef.new(shape: ZonedDateTime, location_name: "EstimatedCompletionTime"))
|
666
|
+
GenerationSummary.struct_class = Types::GenerationSummary
|
667
|
+
|
668
|
+
GenerationSummaryList.member = Shapes::ShapeRef.new(shape: GenerationSummary)
|
669
|
+
|
648
670
|
GetAnomaliesRequest.add_member(:monitor_arn, Shapes::ShapeRef.new(shape: GenericString, location_name: "MonitorArn"))
|
649
671
|
GetAnomaliesRequest.add_member(:date_interval, Shapes::ShapeRef.new(shape: AnomalyDateInterval, required: true, location_name: "DateInterval"))
|
650
672
|
GetAnomaliesRequest.add_member(:feedback, Shapes::ShapeRef.new(shape: AnomalyFeedbackType, location_name: "Feedback"))
|
@@ -937,6 +959,16 @@ module Aws::CostExplorer
|
|
937
959
|
ListCostCategoryDefinitionsResponse.add_member(:next_token, Shapes::ShapeRef.new(shape: NextPageToken, location_name: "NextToken"))
|
938
960
|
ListCostCategoryDefinitionsResponse.struct_class = Types::ListCostCategoryDefinitionsResponse
|
939
961
|
|
962
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest.add_member(:generation_status, Shapes::ShapeRef.new(shape: GenerationStatus, location_name: "GenerationStatus"))
|
963
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest.add_member(:recommendation_ids, Shapes::ShapeRef.new(shape: RecommendationIdList, location_name: "RecommendationIds"))
|
964
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest.add_member(:page_size, Shapes::ShapeRef.new(shape: NonNegativeInteger, location_name: "PageSize"))
|
965
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest.add_member(:next_page_token, Shapes::ShapeRef.new(shape: NextPageToken, location_name: "NextPageToken"))
|
966
|
+
ListSavingsPlansPurchaseRecommendationGenerationRequest.struct_class = Types::ListSavingsPlansPurchaseRecommendationGenerationRequest
|
967
|
+
|
968
|
+
ListSavingsPlansPurchaseRecommendationGenerationResponse.add_member(:generation_summary_list, Shapes::ShapeRef.new(shape: GenerationSummaryList, location_name: "GenerationSummaryList"))
|
969
|
+
ListSavingsPlansPurchaseRecommendationGenerationResponse.add_member(:next_page_token, Shapes::ShapeRef.new(shape: NextPageToken, location_name: "NextPageToken"))
|
970
|
+
ListSavingsPlansPurchaseRecommendationGenerationResponse.struct_class = Types::ListSavingsPlansPurchaseRecommendationGenerationResponse
|
971
|
+
|
940
972
|
ListTagsForResourceRequest.add_member(:resource_arn, Shapes::ShapeRef.new(shape: Arn, required: true, location_name: "ResourceArn"))
|
941
973
|
ListTagsForResourceRequest.struct_class = Types::ListTagsForResourceRequest
|
942
974
|
|
@@ -985,6 +1017,8 @@ module Aws::CostExplorer
|
|
985
1017
|
RDSInstanceDetails.add_member(:size_flex_eligible, Shapes::ShapeRef.new(shape: GenericBoolean, location_name: "SizeFlexEligible"))
|
986
1018
|
RDSInstanceDetails.struct_class = Types::RDSInstanceDetails
|
987
1019
|
|
1020
|
+
RecommendationIdList.member = Shapes::ShapeRef.new(shape: RecommendationId)
|
1021
|
+
|
988
1022
|
RedshiftInstanceDetails.add_member(:family, Shapes::ShapeRef.new(shape: GenericString, location_name: "Family"))
|
989
1023
|
RedshiftInstanceDetails.add_member(:node_type, Shapes::ShapeRef.new(shape: GenericString, location_name: "NodeType"))
|
990
1024
|
RedshiftInstanceDetails.add_member(:region, Shapes::ShapeRef.new(shape: GenericString, location_name: "Region"))
|
@@ -1247,6 +1281,13 @@ module Aws::CostExplorer
|
|
1247
1281
|
|
1248
1282
|
SortDefinitions.member = Shapes::ShapeRef.new(shape: SortDefinition)
|
1249
1283
|
|
1284
|
+
StartSavingsPlansPurchaseRecommendationGenerationRequest.struct_class = Types::StartSavingsPlansPurchaseRecommendationGenerationRequest
|
1285
|
+
|
1286
|
+
StartSavingsPlansPurchaseRecommendationGenerationResponse.add_member(:recommendation_id, Shapes::ShapeRef.new(shape: RecommendationId, location_name: "RecommendationId"))
|
1287
|
+
StartSavingsPlansPurchaseRecommendationGenerationResponse.add_member(:generation_started_time, Shapes::ShapeRef.new(shape: ZonedDateTime, location_name: "GenerationStartedTime"))
|
1288
|
+
StartSavingsPlansPurchaseRecommendationGenerationResponse.add_member(:estimated_completion_time, Shapes::ShapeRef.new(shape: ZonedDateTime, location_name: "EstimatedCompletionTime"))
|
1289
|
+
StartSavingsPlansPurchaseRecommendationGenerationResponse.struct_class = Types::StartSavingsPlansPurchaseRecommendationGenerationResponse
|
1290
|
+
|
1250
1291
|
Subscriber.add_member(:address, Shapes::ShapeRef.new(shape: SubscriberAddress, location_name: "Address"))
|
1251
1292
|
Subscriber.add_member(:type, Shapes::ShapeRef.new(shape: SubscriberType, location_name: "Type"))
|
1252
1293
|
Subscriber.add_member(:status, Shapes::ShapeRef.new(shape: SubscriberStatus, location_name: "Status"))
|
@@ -1695,6 +1736,16 @@ module Aws::CostExplorer
|
|
1695
1736
|
)
|
1696
1737
|
end)
|
1697
1738
|
|
1739
|
+
api.add_operation(:list_savings_plans_purchase_recommendation_generation, Seahorse::Model::Operation.new.tap do |o|
|
1740
|
+
o.name = "ListSavingsPlansPurchaseRecommendationGeneration"
|
1741
|
+
o.http_method = "POST"
|
1742
|
+
o.http_request_uri = "/"
|
1743
|
+
o.input = Shapes::ShapeRef.new(shape: ListSavingsPlansPurchaseRecommendationGenerationRequest)
|
1744
|
+
o.output = Shapes::ShapeRef.new(shape: ListSavingsPlansPurchaseRecommendationGenerationResponse)
|
1745
|
+
o.errors << Shapes::ShapeRef.new(shape: LimitExceededException)
|
1746
|
+
o.errors << Shapes::ShapeRef.new(shape: InvalidNextTokenException)
|
1747
|
+
end)
|
1748
|
+
|
1698
1749
|
api.add_operation(:list_tags_for_resource, Seahorse::Model::Operation.new.tap do |o|
|
1699
1750
|
o.name = "ListTagsForResource"
|
1700
1751
|
o.http_method = "POST"
|
@@ -1714,6 +1765,17 @@ module Aws::CostExplorer
|
|
1714
1765
|
o.errors << Shapes::ShapeRef.new(shape: LimitExceededException)
|
1715
1766
|
end)
|
1716
1767
|
|
1768
|
+
api.add_operation(:start_savings_plans_purchase_recommendation_generation, Seahorse::Model::Operation.new.tap do |o|
|
1769
|
+
o.name = "StartSavingsPlansPurchaseRecommendationGeneration"
|
1770
|
+
o.http_method = "POST"
|
1771
|
+
o.http_request_uri = "/"
|
1772
|
+
o.input = Shapes::ShapeRef.new(shape: StartSavingsPlansPurchaseRecommendationGenerationRequest)
|
1773
|
+
o.output = Shapes::ShapeRef.new(shape: StartSavingsPlansPurchaseRecommendationGenerationResponse)
|
1774
|
+
o.errors << Shapes::ShapeRef.new(shape: LimitExceededException)
|
1775
|
+
o.errors << Shapes::ShapeRef.new(shape: ServiceQuotaExceededException)
|
1776
|
+
o.errors << Shapes::ShapeRef.new(shape: GenerationExistsException)
|
1777
|
+
end)
|
1778
|
+
|
1717
1779
|
api.add_operation(:tag_resource, Seahorse::Model::Operation.new.tap do |o|
|
1718
1780
|
o.name = "TagResource"
|
1719
1781
|
o.http_method = "POST"
|
@@ -50,6 +50,9 @@ module Aws::CostExplorer
|
|
50
50
|
|
51
51
|
def initialize(options = {})
|
52
52
|
self[:region] = options[:region]
|
53
|
+
if self[:region].nil?
|
54
|
+
raise ArgumentError, "Missing required EndpointParameter: :region"
|
55
|
+
end
|
53
56
|
self[:use_dual_stack] = options[:use_dual_stack]
|
54
57
|
self[:use_dual_stack] = false if self[:use_dual_stack].nil?
|
55
58
|
if self[:use_dual_stack].nil?
|