Repository: aws/aws-cli

Issue:
Using `--no-paginate` with `aws cloudformation describe-stacks` throws error
Version: `aws-cli/1.10.34 Python/2.7.9 Linux/3.16.0-4-amd64 botocore/1.4.24`

When I attempt to run `aws cloudformation describe-stacks --no-paginate --region us-west-2` I receive:

```
'Namespace' object has no attribute 'page_size'
```

This does not happen if I do not use the `--no-paginate` flag.



Discussion:
https://forums.aws.amazon.com/thread.jspa?threadID=231962 appears to be a similar issue

Confirmed bug, full traceback:

```
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/awscli/clidriver.py", line 186, in main
    return command_table[parsed_args.command](remaining, parsed_args)
  File "/usr/local/lib/python2.7/site-packages/awscli/clidriver.py", line 379, in __call__
    return command_table[parsed_args.operation](remaining, parsed_globals)
  File "/usr/local/lib/python2.7/site-packages/awscli/clidriver.py", line 518, in __call__
    parsed_globals=parsed_globals)
  File "/usr/local/lib/python2.7/site-packages/awscli/clidriver.py", line 621, in _emit
    return self._session.emit(name, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/session.py", line 683, in emit
    return self._events.emit(event_name, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/hooks.py", line 227, in emit
    return self._emit(event_name, kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/hooks.py", line 210, in _emit
    response = handler(**kwargs)
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/paginate.py", line 189, in check_should_enable_pagination
    ensure_paging_params_not_set(parsed_args, shadowed_args)
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/paginate.py", line 196, in ensure_paging_params_not_set
    p not in shadowed_params and getattr(parsed_args, p)]
AttributeError: 'Namespace' object has no attribute 'page_size'
```

Seems to be caused by: https://github.com/aws/aws-cli/pull/1958

cc @JordonPhillips 

Indeed, this issue appears to have been introduced by 12aa790f94e87b64ba2f96bf0237e03e752ae8ed.


Resolving patch:
diff --git a/awscli/customizations/paginate.py b/awscli/customizations/paginate.py
--- a/awscli/customizations/paginate.py
+++ b/awscli/customizations/paginate.py
@@ -184,7 +184,7 @@ def check_should_enable_pagination(input_tokens, shadowed_args, argument_table,
             # what we're doing here.
             for key, value in shadowed_args.items():
                 argument_table[key] = value
-    
+
     if not parsed_globals.paginate:
         ensure_paging_params_not_set(parsed_args, shadowed_args)
 
@@ -193,7 +193,7 @@ def ensure_paging_params_not_set(parsed_args, shadowed_args):
     paging_params = ['starting_token', 'page_size', 'max_items']
     shadowed_params = [p.replace('-', '_') for p in shadowed_args.keys()]
     params_used = [p for p in paging_params if
-                   p not in shadowed_params and getattr(parsed_args, p)]
+                   p not in shadowed_params and getattr(parsed_args, p, None)]
 
     if len(params_used) > 0:
         converted_params = ', '.join(


Test patch:
diff --git a/tests/functional/cloudformation/test_describe_stacks.py b/tests/functional/cloudformation/test_describe_stacks.py
new file mode 100644
--- /dev/null
+++ b/tests/functional/cloudformation/test_describe_stacks.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+#     http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from awscli.testutils import BaseAWSCommandParamsTest
+
+
+class TestDescribeStacks(BaseAWSCommandParamsTest):
+
+    prefix = 'cloudformation describe-stacks '
+
+    def test_can_single_argument(self):
+        cmdline = self.prefix + '--stack-name test-stack'
+        result = {'StackName': 'test-stack'}
+        self.assert_params_for_cmd(cmdline, result)
+
+    def test_can_specify_no_paginate(self):
+        cmdline = self.prefix + '--stack-name test-stack --no-paginate'
+        result = {'StackName': 'test-stack'}
+        self.assert_params_for_cmd(cmdline, result)
diff --git a/tests/unit/customizations/test_paginate.py b/tests/unit/customizations/test_paginate.py
--- a/tests/unit/customizations/test_paginate.py
+++ b/tests/unit/customizations/test_paginate.py
@@ -303,3 +303,9 @@ def test_pagination_params_raise_error_with_no_paginate(self):
 
         with self.assertRaises(PaginationError):
             paginate.ensure_paging_params_not_set(self.parsed_args, {})
+
+    def test_can_handle_missing_page_size(self):
+        # Not all pagination operations have a page_size.
+        del self.parsed_args.page_size
+        self.assertIsNone(paginate.ensure_paging_params_not_set(
+            self.parsed_args, {}))