summaryrefslogtreecommitdiff
path: root/boto/redshift/layer1.py
blob: 2317f5d2d84b5a9b96a3bc05b88f11d039463cc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
# Copyright (c) 2013 Amazon.com, Inc. or its affiliates.  All Rights Reserved
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish, dis-
# tribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the fol-
# lowing conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#

import json
import boto
from boto.connection import AWSQueryConnection
from boto.regioninfo import RegionInfo
from boto.exception import JSONResponseError
from boto.redshift import exceptions


class RedshiftConnection(AWSQueryConnection):
    """
    Amazon Redshift **Overview**
    This is an interface reference for Amazon Redshift. It contains
    documentation for one of the programming or command line
    interfaces you can use to manage Amazon Redshift clusters. Note
    that Amazon Redshift is asynchronous, which means that some
    interfaces may require techniques, such as polling or asynchronous
    callback handlers, to determine when a command has been applied.
    In this reference, the parameter descriptions indicate whether a
    change is applied immediately, on the next instance reboot, or
    during the next maintenance window. For a summary of the Amazon
    Redshift cluster management interfaces, go to `Using the Amazon
    Redshift Management Interfaces `_.

    Amazon Redshift manages all the work of setting up, operating, and
    scaling a data warehouse: provisioning capacity, monitoring and
    backing up the cluster, and applying patches and upgrades to the
    Amazon Redshift engine. You can focus on using your data to
    acquire new insights for your business and customers.

    If you are a first-time user of Amazon Redshift, we recommend that
    you begin by reading the The `Amazon Redshift Getting Started
    Guide`_

    If you are a database developer, the `Amazon Redshift Database
    Developer Guide`_ explains how to design, build, query, and
    maintain the databases that make up your data warehouse.
    """
    APIVersion = "2012-12-01"
    DefaultRegionName = "us-east-1"
    DefaultRegionEndpoint = "redshift.us-east-1.amazonaws.com"
    ResponseError = JSONResponseError

    _faults = {
        "SnapshotCopyAlreadyDisabled": exceptions.SnapshotCopyAlreadyDisabled,
        "ClusterNotFound": exceptions.ClusterNotFound,
        "UnknownSnapshotCopyRegion": exceptions.UnknownSnapshotCopyRegion,
        "InvalidClusterSubnetState": exceptions.InvalidClusterSubnetState,
        "InvalidSubnet": exceptions.InvalidSubnet,
        "ReservedNodeQuotaExceeded": exceptions.ReservedNodeQuotaExceeded,
        "InvalidClusterState": exceptions.InvalidClusterState,
        "HsmClientCertificateQuotaExceeded": exceptions.HsmClientCertificateQuotaExceeded,
        "SubscriptionCategoryNotFound": exceptions.SubscriptionCategoryNotFound,
        "HsmClientCertificateNotFound": exceptions.HsmClientCertificateNotFound,
        "SubscriptionEventIdNotFound": exceptions.SubscriptionEventIdNotFound,
        "ClusterSecurityGroupAlreadyExists": exceptions.ClusterSecurityGroupAlreadyExists,
        "HsmConfigurationAlreadyExists": exceptions.HsmConfigurationAlreadyExists,
        "NumberOfNodesQuotaExceeded": exceptions.NumberOfNodesQuotaExceeded,
        "ReservedNodeOfferingNotFound": exceptions.ReservedNodeOfferingNotFound,
        "BucketNotFound": exceptions.BucketNotFound,
        "InsufficientClusterCapacity": exceptions.InsufficientClusterCapacity,
        "InvalidRestore": exceptions.InvalidRestore,
        "UnauthorizedOperation": exceptions.UnauthorizedOperation,
        "ClusterQuotaExceeded": exceptions.ClusterQuotaExceeded,
        "InvalidVPCNetworkState": exceptions.InvalidVPCNetworkState,
        "ClusterSnapshotNotFound": exceptions.ClusterSnapshotNotFound,
        "AuthorizationQuotaExceeded": exceptions.AuthorizationQuotaExceeded,
        "InvalidHsmClientCertificateState": exceptions.InvalidHsmClientCertificateState,
        "SNSTopicArnNotFound": exceptions.SNSTopicArnNotFound,
        "ResizeNotFound": exceptions.ResizeNotFound,
        "ClusterSubnetGroupNotFound": exceptions.ClusterSubnetGroupNotFound,
        "SNSNoAuthorization": exceptions.SNSNoAuthorization,
        "ClusterSnapshotQuotaExceeded": exceptions.ClusterSnapshotQuotaExceeded,
        "AccessToSnapshotDenied": exceptions.AccessToSnapshotDenied,
        "InvalidClusterSecurityGroupState": exceptions.InvalidClusterSecurityGroupState,
        "NumberOfNodesPerClusterLimitExceeded": exceptions.NumberOfNodesPerClusterLimitExceeded,
        "ClusterSubnetQuotaExceeded": exceptions.ClusterSubnetQuotaExceeded,
        "SNSInvalidTopic": exceptions.SNSInvalidTopic,
        "ClusterSecurityGroupNotFound": exceptions.ClusterSecurityGroupNotFound,
        "InvalidElasticIp": exceptions.InvalidElasticIp,
        "InvalidClusterParameterGroupState": exceptions.InvalidClusterParameterGroupState,
        "InvalidHsmConfigurationState": exceptions.InvalidHsmConfigurationState,
        "ClusterAlreadyExists": exceptions.ClusterAlreadyExists,
        "HsmConfigurationQuotaExceeded": exceptions.HsmConfigurationQuotaExceeded,
        "ClusterSnapshotAlreadyExists": exceptions.ClusterSnapshotAlreadyExists,
        "SubscriptionSeverityNotFound": exceptions.SubscriptionSeverityNotFound,
        "SourceNotFound": exceptions.SourceNotFound,
        "ReservedNodeAlreadyExists": exceptions.ReservedNodeAlreadyExists,
        "ClusterSubnetGroupQuotaExceeded": exceptions.ClusterSubnetGroupQuotaExceeded,
        "ClusterParameterGroupNotFound": exceptions.ClusterParameterGroupNotFound,
        "InvalidS3BucketName": exceptions.InvalidS3BucketName,
        "InvalidS3KeyPrefix": exceptions.InvalidS3KeyPrefix,
        "SubscriptionAlreadyExist": exceptions.SubscriptionAlreadyExist,
        "HsmConfigurationNotFound": exceptions.HsmConfigurationNotFound,
        "AuthorizationNotFound": exceptions.AuthorizationNotFound,
        "ClusterSecurityGroupQuotaExceeded": exceptions.ClusterSecurityGroupQuotaExceeded,
        "SubnetAlreadyInUse": exceptions.SubnetAlreadyInUse,
        "EventSubscriptionQuotaExceeded": exceptions.EventSubscriptionQuotaExceeded,
        "AuthorizationAlreadyExists": exceptions.AuthorizationAlreadyExists,
        "InvalidClusterSnapshotState": exceptions.InvalidClusterSnapshotState,
        "ClusterParameterGroupQuotaExceeded": exceptions.ClusterParameterGroupQuotaExceeded,
        "SnapshotCopyDisabled": exceptions.SnapshotCopyDisabled,
        "ClusterSubnetGroupAlreadyExists": exceptions.ClusterSubnetGroupAlreadyExists,
        "ReservedNodeNotFound": exceptions.ReservedNodeNotFound,
        "HsmClientCertificateAlreadyExists": exceptions.HsmClientCertificateAlreadyExists,
        "InvalidClusterSubnetGroupState": exceptions.InvalidClusterSubnetGroupState,
        "SubscriptionNotFound": exceptions.SubscriptionNotFound,
        "InsufficientS3BucketPolicy": exceptions.InsufficientS3BucketPolicy,
        "ClusterParameterGroupAlreadyExists": exceptions.ClusterParameterGroupAlreadyExists,
        "UnsupportedOption": exceptions.UnsupportedOption,
        "CopyToRegionDisabled": exceptions.CopyToRegionDisabled,
        "SnapshotCopyAlreadyEnabled": exceptions.SnapshotCopyAlreadyEnabled,
        "IncompatibleOrderableOptions": exceptions.IncompatibleOrderableOptions,
    }


    def __init__(self, **kwargs):
        region = kwargs.pop('region', None)
        if not region:
            region = RegionInfo(self, self.DefaultRegionName,
                                self.DefaultRegionEndpoint)
        if 'host' not in kwargs:
            kwargs['host'] = region.endpoint
        super(RedshiftConnection, self).__init__(**kwargs)
        self.region = region

    def _required_auth_capability(self):
        return ['hmac-v4']

    def authorize_cluster_security_group_ingress(self,
                                                 cluster_security_group_name,
                                                 cidrip=None,
                                                 ec2_security_group_name=None,
                                                 ec2_security_group_owner_id=None):
        """
        Adds an inbound (ingress) rule to an Amazon Redshift security
        group. Depending on whether the application accessing your
        cluster is running on the Internet or an EC2 instance, you can
        authorize inbound access to either a Classless Interdomain
        Routing (CIDR) IP address range or an EC2 security group. You
        can add as many as 20 ingress rules to an Amazon Redshift
        security group.
        The EC2 security group must be defined in the AWS region where
        the cluster resides.
        For an overview of CIDR blocks, see the Wikipedia article on
        `Classless Inter-Domain Routing`_.

        You must also associate the security group with a cluster so
        that clients running on these IP addresses or the EC2 instance
        are authorized to connect to the cluster. For information
        about managing security groups, go to `Working with Security
        Groups`_ in the Amazon Redshift Management Guide .

        :type cluster_security_group_name: string
        :param cluster_security_group_name: The name of the security group to
            which the ingress rule is added.

        :type cidrip: string
        :param cidrip: The IP range to be added the Amazon Redshift security
            group.

        :type ec2_security_group_name: string
        :param ec2_security_group_name: The EC2 security group to be added the
            Amazon Redshift security group.

        :type ec2_security_group_owner_id: string
        :param ec2_security_group_owner_id: The AWS account number of the owner
            of the security group specified by the EC2SecurityGroupName
            parameter. The AWS Access Key ID is not an acceptable value.
        Example: `111122223333`

        """
        params = {
            'ClusterSecurityGroupName': cluster_security_group_name,
        }
        if cidrip is not None:
            params['CIDRIP'] = cidrip
        if ec2_security_group_name is not None:
            params['EC2SecurityGroupName'] = ec2_security_group_name
        if ec2_security_group_owner_id is not None:
            params['EC2SecurityGroupOwnerId'] = ec2_security_group_owner_id
        return self._make_request(
            action='AuthorizeClusterSecurityGroupIngress',
            verb='POST',
            path='/', params=params)

    def authorize_snapshot_access(self, snapshot_identifier,
                                  account_with_restore_access,
                                  snapshot_cluster_identifier=None):
        """
        Authorizes the specified AWS customer account to restore the
        specified snapshot.

        For more information about working with snapshots, go to
        `Amazon Redshift Snapshots`_ in the Amazon Redshift Management
        Guide .

        :type snapshot_identifier: string
        :param snapshot_identifier: The identifier of the snapshot the account
            is authorized to restore.

        :type snapshot_cluster_identifier: string
        :param snapshot_cluster_identifier: The identifier of the cluster the
            snapshot was created from. This parameter is required if your IAM
            user has a policy containing a snapshot resource element that
            specifies anything other than * for the cluster name.

        :type account_with_restore_access: string
        :param account_with_restore_access: The identifier of the AWS customer
            account authorized to restore the specified snapshot.

        """
        params = {
            'SnapshotIdentifier': snapshot_identifier,
            'AccountWithRestoreAccess': account_with_restore_access,
        }
        if snapshot_cluster_identifier is not None:
            params['SnapshotClusterIdentifier'] = snapshot_cluster_identifier
        return self._make_request(
            action='AuthorizeSnapshotAccess',
            verb='POST',
            path='/', params=params)

    def copy_cluster_snapshot(self, source_snapshot_identifier,
                              target_snapshot_identifier,
                              source_snapshot_cluster_identifier=None):
        """
        Copies the specified automated cluster snapshot to a new
        manual cluster snapshot. The source must be an automated
        snapshot and it must be in the available state.

        When you delete a cluster, Amazon Redshift deletes any
        automated snapshots of the cluster. Also, when the retention
        period of the snapshot expires, Amazon Redshift automatically
        deletes it. If you want to keep an automated snapshot for a
        longer period, you can make a manual copy of the snapshot.
        Manual snapshots are retained until you delete them.

        For more information about working with snapshots, go to
        `Amazon Redshift Snapshots`_ in the Amazon Redshift Management
        Guide .

        :type source_snapshot_identifier: string
        :param source_snapshot_identifier:
        The identifier for the source snapshot.

        Constraints:


        + Must be the identifier for a valid automated snapshot whose state is
              "available".

        :type source_snapshot_cluster_identifier: string
        :param source_snapshot_cluster_identifier:
        The identifier of the cluster the source snapshot was created from.
            This parameter is required if your IAM user has a policy containing
            a snapshot resource element that specifies anything other than *
            for the cluster name.

        Constraints:


        + Must be the identifier for a valid cluster.

        :type target_snapshot_identifier: string
        :param target_snapshot_identifier:
        The identifier given to the new manual snapshot.

        Constraints:


        + Cannot be null, empty, or blank.
        + Must contain from 1 to 255 alphanumeric characters or hyphens.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.
        + Must be unique for the AWS account that is making the request.

        """
        params = {
            'SourceSnapshotIdentifier': source_snapshot_identifier,
            'TargetSnapshotIdentifier': target_snapshot_identifier,
        }
        if source_snapshot_cluster_identifier is not None:
            params['SourceSnapshotClusterIdentifier'] = source_snapshot_cluster_identifier
        return self._make_request(
            action='CopyClusterSnapshot',
            verb='POST',
            path='/', params=params)

    def create_cluster(self, cluster_identifier, node_type, master_username,
                       master_user_password, db_name=None, cluster_type=None,
                       cluster_security_groups=None,
                       vpc_security_group_ids=None,
                       cluster_subnet_group_name=None,
                       availability_zone=None,
                       preferred_maintenance_window=None,
                       cluster_parameter_group_name=None,
                       automated_snapshot_retention_period=None, port=None,
                       cluster_version=None, allow_version_upgrade=None,
                       number_of_nodes=None, publicly_accessible=None,
                       encrypted=None,
                       hsm_client_certificate_identifier=None,
                       hsm_configuration_identifier=None, elastic_ip=None):
        """
        Creates a new cluster. To create the cluster in virtual
        private cloud (VPC), you must provide cluster subnet group
        name. If you don't provide a cluster subnet group name or the
        cluster security group parameter, Amazon Redshift creates a
        non-VPC cluster, it associates the default cluster security
        group with the cluster. For more information about managing
        clusters, go to `Amazon Redshift Clusters`_ in the Amazon
        Redshift Management Guide .

        :type db_name: string
        :param db_name:
        The name of the first database to be created when the cluster is
            created.

        To create additional databases after the cluster is created, connect to
            the cluster with a SQL client and use SQL commands to create a
            database. For more information, go to `Create a Database`_ in the
            Amazon Redshift Database Developer Guide.

        Default: `dev`

        Constraints:


        + Must contain 1 to 64 alphanumeric characters.
        + Must contain only lowercase letters.
        + Cannot be a word that is reserved by the service. A list of reserved
              words can be found in `Reserved Words`_ in the Amazon Redshift
              Database Developer Guide.

        :type cluster_identifier: string
        :param cluster_identifier: A unique identifier for the cluster. You use
            this identifier to refer to the cluster for any subsequent cluster
            operations such as deleting or modifying. The identifier also
            appears in the Amazon Redshift console.
        Constraints:


        + Must contain from 1 to 63 alphanumeric characters or hyphens.
        + Alphabetic characters must be lowercase.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.
        + Must be unique for all clusters within an AWS account.


        Example: `myexamplecluster`

        :type cluster_type: string
        :param cluster_type: The type of the cluster. When cluster type is
            specified as

        + `single-node`, the **NumberOfNodes** parameter is not required.
        + `multi-node`, the **NumberOfNodes** parameter is required.


        Valid Values: `multi-node` | `single-node`

        Default: `multi-node`

        :type node_type: string
        :param node_type: The node type to be provisioned for the cluster. For
            information about node types, go to ` Working with Clusters`_ in
            the Amazon Redshift Management Guide .
        Valid Values: `dw.hs1.xlarge` | `dw.hs1.8xlarge`.

        :type master_username: string
        :param master_username:
        The user name associated with the master user account for the cluster
            that is being created.

        Constraints:


        + Must be 1 - 128 alphanumeric characters.
        + First character must be a letter.
        + Cannot be a reserved word. A list of reserved words can be found in
              `Reserved Words`_ in the Amazon Redshift Database Developer Guide.

        :type master_user_password: string
        :param master_user_password:
        The password associated with the master user account for the cluster
            that is being created.

        Constraints:


        + Must be between 8 and 64 characters in length.
        + Must contain at least one uppercase letter.
        + Must contain at least one lowercase letter.
        + Must contain one number.
        + Can be any printable ASCII character (ASCII code 33 to 126) except '
              (single quote), " (double quote), \, /, @, or space.

        :type cluster_security_groups: list
        :param cluster_security_groups: A list of security groups to be
            associated with this cluster.
        Default: The default cluster security group for Amazon Redshift.

        :type vpc_security_group_ids: list
        :param vpc_security_group_ids: A list of Virtual Private Cloud (VPC)
            security groups to be associated with the cluster.
        Default: The default VPC security group is associated with the cluster.

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name of a cluster subnet group to
            be associated with this cluster.
        If this parameter is not provided the resulting cluster will be
            deployed outside virtual private cloud (VPC).

        :type availability_zone: string
        :param availability_zone: The EC2 Availability Zone (AZ) in which you
            want Amazon Redshift to provision the cluster. For example, if you
            have several EC2 instances running in a specific Availability Zone,
            then you might want the cluster to be provisioned in the same zone
            in order to decrease network latency.
        Default: A random, system-chosen Availability Zone in the region that
            is specified by the endpoint.

        Example: `us-east-1d`

        Constraint: The specified Availability Zone must be in the same region
            as the current endpoint.

        :type preferred_maintenance_window: string
        :param preferred_maintenance_window: The weekly time range (in UTC)
            during which automated cluster maintenance can occur.
        Format: `ddd:hh24:mi-ddd:hh24:mi`

        Default: A 30-minute window selected at random from an 8-hour block of
            time per region, occurring on a random day of the week. The
            following list shows the time blocks for each region from which the
            default maintenance windows are assigned.


        + **US-East (Northern Virginia) Region:** 03:00-11:00 UTC
        + **US-West (Oregon) Region** 06:00-14:00 UTC


        Valid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun

        Constraints: Minimum 30-minute window.

        :type cluster_parameter_group_name: string
        :param cluster_parameter_group_name:
        The name of the parameter group to be associated with this cluster.

        Default: The default Amazon Redshift cluster parameter group. For
            information about the default parameter group, go to `Working with
            Amazon Redshift Parameter Groups`_

        Constraints:


        + Must be 1 to 255 alphanumeric characters or hyphens.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.

        :type automated_snapshot_retention_period: integer
        :param automated_snapshot_retention_period: The number of days that
            automated snapshots are retained. If the value is 0, automated
            snapshots are disabled. Even if automated snapshots are disabled,
            you can still create manual snapshots when you want with
            CreateClusterSnapshot.
        Default: `1`

        Constraints: Must be a value from 0 to 35.

        :type port: integer
        :param port: The port number on which the cluster accepts incoming
            connections.
        The cluster is accessible only via the JDBC and ODBC connection
            strings. Part of the connection string requires the port on which
            the cluster will listen for incoming connections.

        Default: `5439`

        Valid Values: `1150-65535`

        :type cluster_version: string
        :param cluster_version: The version of the Amazon Redshift engine
            software that you want to deploy on the cluster.
        The version selected runs on all the nodes in the cluster.

        Constraints: Only version 1.0 is currently available.

        Example: `1.0`

        :type allow_version_upgrade: boolean
        :param allow_version_upgrade: If `True`, upgrades can be applied during
            the maintenance window to the Amazon Redshift engine that is
            running on the cluster.
        When a new version of the Amazon Redshift engine is released, you can
            request that the service automatically apply upgrades during the
            maintenance window to the Amazon Redshift engine that is running on
            your cluster.

        Default: `True`

        :type number_of_nodes: integer
        :param number_of_nodes: The number of compute nodes in the cluster.
            This parameter is required when the **ClusterType** parameter is
            specified as `multi-node`.
        For information about determining how many nodes you need, go to `
            Working with Clusters`_ in the Amazon Redshift Management Guide .

        If you don't specify this parameter, you get a single-node cluster.
            When requesting a multi-node cluster, you must specify the number
            of nodes that you want in the cluster.

        Default: `1`

        Constraints: Value must be at least 1 and no more than 100.

        :type publicly_accessible: boolean
        :param publicly_accessible: If `True`, the cluster can be accessed from
            a public network.

        :type encrypted: boolean
        :param encrypted: If `True`, the data in cluster is encrypted at rest.
        Default: false

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: Specifies the name of the HSM
            client certificate the Amazon Redshift cluster uses to retrieve the
            data encryption keys stored in an HSM.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: Specifies the name of the HSM
            configuration that contains the information the Amazon Redshift
            cluster can use to retrieve and store keys in an HSM.

        :type elastic_ip: string
        :param elastic_ip: The Elastic IP (EIP) address for the cluster.
        Constraints: The cluster must be provisioned in EC2-VPC and publicly-
            accessible through an Internet gateway. For more information about
            provisioning clusters in EC2-VPC, go to `Supported Platforms to
            Launch Your Cluster`_ in the Amazon Redshift Management Guide.

        """
        params = {
            'ClusterIdentifier': cluster_identifier,
            'NodeType': node_type,
            'MasterUsername': master_username,
            'MasterUserPassword': master_user_password,
        }
        if db_name is not None:
            params['DBName'] = db_name
        if cluster_type is not None:
            params['ClusterType'] = cluster_type
        if cluster_security_groups is not None:
            self.build_list_params(params,
                                   cluster_security_groups,
                                   'ClusterSecurityGroups.member')
        if vpc_security_group_ids is not None:
            self.build_list_params(params,
                                   vpc_security_group_ids,
                                   'VpcSecurityGroupIds.member')
        if cluster_subnet_group_name is not None:
            params['ClusterSubnetGroupName'] = cluster_subnet_group_name
        if availability_zone is not None:
            params['AvailabilityZone'] = availability_zone
        if preferred_maintenance_window is not None:
            params['PreferredMaintenanceWindow'] = preferred_maintenance_window
        if cluster_parameter_group_name is not None:
            params['ClusterParameterGroupName'] = cluster_parameter_group_name
        if automated_snapshot_retention_period is not None:
            params['AutomatedSnapshotRetentionPeriod'] = automated_snapshot_retention_period
        if port is not None:
            params['Port'] = port
        if cluster_version is not None:
            params['ClusterVersion'] = cluster_version
        if allow_version_upgrade is not None:
            params['AllowVersionUpgrade'] = str(
                allow_version_upgrade).lower()
        if number_of_nodes is not None:
            params['NumberOfNodes'] = number_of_nodes
        if publicly_accessible is not None:
            params['PubliclyAccessible'] = str(
                publicly_accessible).lower()
        if encrypted is not None:
            params['Encrypted'] = str(
                encrypted).lower()
        if hsm_client_certificate_identifier is not None:
            params['HsmClientCertificateIdentifier'] = hsm_client_certificate_identifier
        if hsm_configuration_identifier is not None:
            params['HsmConfigurationIdentifier'] = hsm_configuration_identifier
        if elastic_ip is not None:
            params['ElasticIp'] = elastic_ip
        return self._make_request(
            action='CreateCluster',
            verb='POST',
            path='/', params=params)

    def create_cluster_parameter_group(self, parameter_group_name,
                                       parameter_group_family, description):
        """
        Creates an Amazon Redshift parameter group.

        Creating parameter groups is independent of creating clusters.
        You can associate a cluster with a parameter group when you
        create the cluster. You can also associate an existing cluster
        with a parameter group after the cluster is created by using
        ModifyCluster.

        Parameters in the parameter group define specific behavior
        that applies to the databases you create on the cluster. For
        more information about managing parameter groups, go to
        `Amazon Redshift Parameter Groups`_ in the Amazon Redshift
        Management Guide .

        :type parameter_group_name: string
        :param parameter_group_name:
        The name of the cluster parameter group.

        Constraints:


        + Must be 1 to 255 alphanumeric characters or hyphens
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.
        + Must be unique withing your AWS account.


        This value is stored as a lower-case string.

        :type parameter_group_family: string
        :param parameter_group_family: The Amazon Redshift engine version to
            which the cluster parameter group applies. The cluster engine
            version determines the set of parameters.
        To get a list of valid parameter group family names, you can call
            DescribeClusterParameterGroups. By default, Amazon Redshift returns
            a list of all the parameter groups that are owned by your AWS
            account, including the default parameter groups for each Amazon
            Redshift engine version. The parameter group family names
            associated with the default parameter groups provide you the valid
            values. For example, a valid family name is "redshift-1.0".

        :type description: string
        :param description: A description of the parameter group.

        """
        params = {
            'ParameterGroupName': parameter_group_name,
            'ParameterGroupFamily': parameter_group_family,
            'Description': description,
        }
        return self._make_request(
            action='CreateClusterParameterGroup',
            verb='POST',
            path='/', params=params)

    def create_cluster_security_group(self, cluster_security_group_name,
                                      description):
        """
        Creates a new Amazon Redshift security group. You use security
        groups to control access to non-VPC clusters.

        For information about managing security groups, go to`Amazon
        Redshift Cluster Security Groups`_ in the Amazon Redshift
        Management Guide .

        :type cluster_security_group_name: string
        :param cluster_security_group_name: The name for the security group.
            Amazon Redshift stores the value as a lowercase string.
        Constraints:


        + Must contain no more than 255 alphanumeric characters or hyphens.
        + Must not be "Default".
        + Must be unique for all security groups that are created by your AWS
              account.


        Example: `examplesecuritygroup`

        :type description: string
        :param description: A description for the security group.

        """
        params = {
            'ClusterSecurityGroupName': cluster_security_group_name,
            'Description': description,
        }
        return self._make_request(
            action='CreateClusterSecurityGroup',
            verb='POST',
            path='/', params=params)

    def create_cluster_snapshot(self, snapshot_identifier,
                                cluster_identifier):
        """
        Creates a manual snapshot of the specified cluster. The
        cluster must be in the "available" state.

        For more information about working with snapshots, go to
        `Amazon Redshift Snapshots`_ in the Amazon Redshift Management
        Guide .

        :type snapshot_identifier: string
        :param snapshot_identifier: A unique identifier for the snapshot that
            you are requesting. This identifier must be unique for all
            snapshots within the AWS account.
        Constraints:


        + Cannot be null, empty, or blank
        + Must contain from 1 to 255 alphanumeric characters or hyphens
        + First character must be a letter
        + Cannot end with a hyphen or contain two consecutive hyphens


        Example: `my-snapshot-id`

        :type cluster_identifier: string
        :param cluster_identifier: The cluster identifier for which you want a
            snapshot.

        """
        params = {
            'SnapshotIdentifier': snapshot_identifier,
            'ClusterIdentifier': cluster_identifier,
        }
        return self._make_request(
            action='CreateClusterSnapshot',
            verb='POST',
            path='/', params=params)

    def create_cluster_subnet_group(self, cluster_subnet_group_name,
                                    description, subnet_ids):
        """
        Creates a new Amazon Redshift subnet group. You must provide a
        list of one or more subnets in your existing Amazon Virtual
        Private Cloud (Amazon VPC) when creating Amazon Redshift
        subnet group.

        For information about subnet groups, go to`Amazon Redshift
        Cluster Subnet Groups`_ in the Amazon Redshift Management
        Guide .

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name for the subnet group. Amazon
            Redshift stores the value as a lowercase string.
        Constraints:


        + Must contain no more than 255 alphanumeric characters or hyphens.
        + Must not be "Default".
        + Must be unique for all subnet groups that are created by your AWS
              account.


        Example: `examplesubnetgroup`

        :type description: string
        :param description: A description for the subnet group.

        :type subnet_ids: list
        :param subnet_ids: An array of VPC subnet IDs. A maximum of 20 subnets
            can be modified in a single request.

        """
        params = {
            'ClusterSubnetGroupName': cluster_subnet_group_name,
            'Description': description,
        }
        self.build_list_params(params,
                               subnet_ids,
                               'SubnetIds.member')
        return self._make_request(
            action='CreateClusterSubnetGroup',
            verb='POST',
            path='/', params=params)

    def create_event_subscription(self, subscription_name, sns_topic_arn,
                                  source_type=None, source_ids=None,
                                  event_categories=None, severity=None,
                                  enabled=None):
        """
        Creates an Amazon Redshift event notification subscription.
        This action requires an ARN (Amazon Resource Name) of an
        Amazon SNS topic created by either the Amazon Redshift
        console, the Amazon SNS console, or the Amazon SNS API. To
        obtain an ARN with Amazon SNS, you must create a topic in
        Amazon SNS and subscribe to the topic. The ARN is displayed in
        the SNS console.

        You can specify the source type, and lists of Amazon Redshift
        source IDs, event categories, and event severities.
        Notifications will be sent for all events you want that match
        those criteria. For example, you can specify source type =
        cluster, source ID = my-cluster-1 and mycluster2, event
        categories = Availability, Backup, and severity = ERROR. The
        subsription will only send notifications for those ERROR
        events in the Availability and Backup categores for the
        specified clusters.

        If you specify both the source type and source IDs, such as
        source type = cluster and source identifier = my-cluster-1,
        notifiactions will be sent for all the cluster events for my-
        cluster-1. If you specify a source type but do not specify a
        source identifier, you will receive notice of the events for
        the objects of that type in your AWS account. If you do not
        specify either the SourceType nor the SourceIdentifier, you
        will be notified of events generated from all Amazon Redshift
        sources belonging to your AWS account. You must specify a
        source type if you specify a source ID.

        :type subscription_name: string
        :param subscription_name:
        The name of the event subscription to be created.

        Constraints:


        + Cannot be null, empty, or blank.
        + Must contain from 1 to 255 alphanumeric characters or hyphens.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.

        :type sns_topic_arn: string
        :param sns_topic_arn: The Amazon Resource Name (ARN) of the Amazon SNS
            topic used to transmit the event notifications. The ARN is created
            by Amazon SNS when you create a topic and subscribe to it.

        :type source_type: string
        :param source_type: The type of source that will be generating the
            events. For example, if you want to be notified of events generated
            by a cluster, you would set this parameter to cluster. If this
            value is not specified, events are returned for all Amazon Redshift
            objects in your AWS account. You must specify a source type in
            order to specify source IDs.
        Valid values: cluster, cluster-parameter-group, cluster-security-group,
            and cluster-snapshot.

        :type source_ids: list
        :param source_ids: A list of one or more identifiers of Amazon Redshift
            source objects. All of the objects must be of the same type as was
            specified in the source type parameter. The event subscription will
            return only events generated by the specified objects. If not
            specified, then events are returned for all objects within the
            source type specified.
        Example: my-cluster-1, my-cluster-2

        Example: my-snapshot-20131010

        :type event_categories: list
        :param event_categories: Specifies the Amazon Redshift event categories
            to be published by the event notification subscription.
        Values: Configuration, Management, Monitoring, Security

        :type severity: string
        :param severity: Specifies the Amazon Redshift event severity to be
            published by the event notification subscription.
        Values: ERROR, INFO

        :type enabled: boolean
        :param enabled: A Boolean value; set to `True` to activate the
            subscription, set to `False` to create the subscription but not
            active it.

        """
        params = {
            'SubscriptionName': subscription_name,
            'SnsTopicArn': sns_topic_arn,
        }
        if source_type is not None:
            params['SourceType'] = source_type
        if source_ids is not None:
            self.build_list_params(params,
                                   source_ids,
                                   'SourceIds.member')
        if event_categories is not None:
            self.build_list_params(params,
                                   event_categories,
                                   'EventCategories.member')
        if severity is not None:
            params['Severity'] = severity
        if enabled is not None:
            params['Enabled'] = str(
                enabled).lower()
        return self._make_request(
            action='CreateEventSubscription',
            verb='POST',
            path='/', params=params)

    def create_hsm_client_certificate(self,
                                      hsm_client_certificate_identifier):
        """
        Creates an HSM client certificate that an Amazon Redshift
        cluster will use to connect to the client's HSM in order to
        store and retrieve the keys used to encrypt the cluster
        databases.

        The command returns a public key, which you must store in the
        HSM. After creating the HSM certificate, you must create an
        Amazon Redshift HSM configuration that provides a cluster the
        information needed to store and retrieve database encryption
        keys in the HSM. For more information, go to aLinkToHSMTopic
        in the Amazon Redshift Management Guide.

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: The identifier to be assigned
            to the new HSM client certificate that the cluster will use to
            connect to the HSM to retrieve the database encryption keys.

        """
        params = {
            'HsmClientCertificateIdentifier': hsm_client_certificate_identifier,
        }
        return self._make_request(
            action='CreateHsmClientCertificate',
            verb='POST',
            path='/', params=params)

    def create_hsm_configuration(self, hsm_configuration_identifier,
                                 description, hsm_ip_address,
                                 hsm_partition_name, hsm_partition_password,
                                 hsm_server_public_certificate):
        """
        Creates an HSM configuration that contains the information
        required by an Amazon Redshift cluster to store and retrieve
        database encryption keys in a Hardware Storeage Module (HSM).
        After creating the HSM configuration, you can specify it as a
        parameter when creating a cluster. The cluster will then store
        its encryption keys in the HSM.

        Before creating an HSM configuration, you must have first
        created an HSM client certificate. For more information, go to
        aLinkToHSMTopic in the Amazon Redshift Management Guide.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: The identifier to be assigned to
            the new Amazon Redshift HSM configuration.

        :type description: string
        :param description: A text description of the HSM configuration to be
            created.

        :type hsm_ip_address: string
        :param hsm_ip_address: The IP address that the Amazon Redshift cluster
            must use to access the HSM.

        :type hsm_partition_name: string
        :param hsm_partition_name: The name of the partition in the HSM where
            the Amazon Redshift clusters will store their database encryption
            keys.

        :type hsm_partition_password: string
        :param hsm_partition_password: The password required to access the HSM
            partition.

        :type hsm_server_public_certificate: string
        :param hsm_server_public_certificate: The public key used to access the
            HSM client certificate, which was created by calling the Amazon
            Redshift create HSM certificate command.

        """
        params = {
            'HsmConfigurationIdentifier': hsm_configuration_identifier,
            'Description': description,
            'HsmIpAddress': hsm_ip_address,
            'HsmPartitionName': hsm_partition_name,
            'HsmPartitionPassword': hsm_partition_password,
            'HsmServerPublicCertificate': hsm_server_public_certificate,
        }
        return self._make_request(
            action='CreateHsmConfiguration',
            verb='POST',
            path='/', params=params)

    def delete_cluster(self, cluster_identifier,
                       skip_final_cluster_snapshot=None,
                       final_cluster_snapshot_identifier=None):
        """
        Deletes a previously provisioned cluster. A successful
        response from the web service indicates that the request was
        received correctly. If a final cluster snapshot is requested
        the status of the cluster will be "final-snapshot" while the
        snapshot is being taken, then it's "deleting" once Amazon
        Redshift begins deleting the cluster. Use DescribeClusters to
        monitor the status of the deletion. The delete operation
        cannot be canceled or reverted once submitted. For more
        information about managing clusters, go to `Amazon Redshift
        Clusters`_ in the Amazon Redshift Management Guide .

        :type cluster_identifier: string
        :param cluster_identifier:
        The identifier of the cluster to be deleted.

        Constraints:


        + Must contain lowercase characters.
        + Must contain from 1 to 63 alphanumeric characters or hyphens.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.

        :type skip_final_cluster_snapshot: boolean
        :param skip_final_cluster_snapshot: Determines whether a final snapshot
            of the cluster is created before Amazon Redshift deletes the
            cluster. If `True`, a final cluster snapshot is not created. If
            `False`, a final cluster snapshot is created before the cluster is
            deleted.
        The FinalClusterSnapshotIdentifier parameter must be specified if
            SkipFinalClusterSnapshot is `False`.

        Default: `False`

        :type final_cluster_snapshot_identifier: string
        :param final_cluster_snapshot_identifier:
        The identifier of the final snapshot that is to be created immediately
            before deleting the cluster. If this parameter is provided,
            SkipFinalClusterSnapshot must be `False`.

        Constraints:


        + Must be 1 to 255 alphanumeric characters.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        if skip_final_cluster_snapshot is not None:
            params['SkipFinalClusterSnapshot'] = str(
                skip_final_cluster_snapshot).lower()
        if final_cluster_snapshot_identifier is not None:
            params['FinalClusterSnapshotIdentifier'] = final_cluster_snapshot_identifier
        return self._make_request(
            action='DeleteCluster',
            verb='POST',
            path='/', params=params)

    def delete_cluster_parameter_group(self, parameter_group_name):
        """
        Deletes a specified Amazon Redshift parameter group. You
        cannot delete a parameter group if it is associated with a
        cluster.

        :type parameter_group_name: string
        :param parameter_group_name:
        The name of the parameter group to be deleted.

        Constraints:


        + Must be the name of an existing cluster parameter group.
        + Cannot delete a default cluster parameter group.

        """
        params = {'ParameterGroupName': parameter_group_name, }
        return self._make_request(
            action='DeleteClusterParameterGroup',
            verb='POST',
            path='/', params=params)

    def delete_cluster_security_group(self, cluster_security_group_name):
        """
        Deletes an Amazon Redshift security group.
        You cannot delete a security group that is associated with any
        clusters. You cannot delete the default security group.
        For information about managing security groups, go to`Amazon
        Redshift Cluster Security Groups`_ in the Amazon Redshift
        Management Guide .

        :type cluster_security_group_name: string
        :param cluster_security_group_name: The name of the cluster security
            group to be deleted.

        """
        params = {
            'ClusterSecurityGroupName': cluster_security_group_name,
        }
        return self._make_request(
            action='DeleteClusterSecurityGroup',
            verb='POST',
            path='/', params=params)

    def delete_cluster_snapshot(self, snapshot_identifier,
                                snapshot_cluster_identifier=None):
        """
        Deletes the specified manual snapshot. The snapshot must be in
        the "available" state, with no other users authorized to
        access the snapshot.

        Unlike automated snapshots, manual snapshots are retained even
        after you delete your cluster. Amazon Redshift does not delete
        your manual snapshots. You must delete manual snapshot
        explicitly to avoid getting charged. If other accounts are
        authorized to access the snapshot, you must revoke all of the
        authorizations before you can delete the snapshot.

        :type snapshot_identifier: string
        :param snapshot_identifier: The unique identifier of the manual
            snapshot to be deleted.
        Constraints: Must be the name of an existing snapshot that is in the
            `available` state.

        :type snapshot_cluster_identifier: string
        :param snapshot_cluster_identifier: The unique identifier of the
            cluster the snapshot was created from. This parameter is required
            if your IAM user has a policy containing a snapshot resource
            element that specifies anything other than * for the cluster name.
        Constraints: Must be the name of valid cluster.

        """
        params = {'SnapshotIdentifier': snapshot_identifier, }
        if snapshot_cluster_identifier is not None:
            params['SnapshotClusterIdentifier'] = snapshot_cluster_identifier
        return self._make_request(
            action='DeleteClusterSnapshot',
            verb='POST',
            path='/', params=params)

    def delete_cluster_subnet_group(self, cluster_subnet_group_name):
        """
        Deletes the specified cluster subnet group.

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name of the cluster subnet group
            name to be deleted.

        """
        params = {
            'ClusterSubnetGroupName': cluster_subnet_group_name,
        }
        return self._make_request(
            action='DeleteClusterSubnetGroup',
            verb='POST',
            path='/', params=params)

    def delete_event_subscription(self, subscription_name):
        """
        Deletes an Amazon Redshift event notification subscription.

        :type subscription_name: string
        :param subscription_name: The name of the Amazon Redshift event
            notification subscription to be deleted.

        """
        params = {'SubscriptionName': subscription_name, }
        return self._make_request(
            action='DeleteEventSubscription',
            verb='POST',
            path='/', params=params)

    def delete_hsm_client_certificate(self,
                                      hsm_client_certificate_identifier):
        """
        Deletes the specified HSM client certificate.

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: The identifier of the HSM
            client certificate to be deleted.

        """
        params = {
            'HsmClientCertificateIdentifier': hsm_client_certificate_identifier,
        }
        return self._make_request(
            action='DeleteHsmClientCertificate',
            verb='POST',
            path='/', params=params)

    def delete_hsm_configuration(self, hsm_configuration_identifier):
        """
        Deletes the specified Amazon Redshift HSM configuration.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: The identifier of the Amazon
            Redshift HSM configuration to be deleted.

        """
        params = {
            'HsmConfigurationIdentifier': hsm_configuration_identifier,
        }
        return self._make_request(
            action='DeleteHsmConfiguration',
            verb='POST',
            path='/', params=params)

    def describe_cluster_parameter_groups(self, parameter_group_name=None,
                                          max_records=None, marker=None):
        """
        Returns a list of Amazon Redshift parameter groups, including
        parameter groups you created and the default parameter group.
        For each parameter group, the response includes the parameter
        group name, description, and parameter group family name. You
        can optionally specify a name to retrieve the description of a
        specific parameter group.

        For more information about managing parameter groups, go to
        `Amazon Redshift Parameter Groups`_ in the Amazon Redshift
        Management Guide .

        :type parameter_group_name: string
        :param parameter_group_name: The name of a specific parameter group for
            which to return details. By default, details about all parameter
            groups and the default parameter group are returned.

        :type max_records: integer
        :param max_records: The maximum number of parameter group records to
            include in the response. If more records exist than the specified
            `MaxRecords` value, the response includes a marker that you can use
            in a subsequent DescribeClusterParameterGroups request to retrieve
            the next set of records.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeClusterParameterGroups request to indicate the first
            parameter group that the current request will return.

        """
        params = {}
        if parameter_group_name is not None:
            params['ParameterGroupName'] = parameter_group_name
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusterParameterGroups',
            verb='POST',
            path='/', params=params)

    def describe_cluster_parameters(self, parameter_group_name, source=None,
                                    max_records=None, marker=None):
        """
        Returns a detailed list of parameters contained within the
        specified Amazon Redshift parameter group. For each parameter
        the response includes information such as parameter name,
        description, data type, value, whether the parameter value is
        modifiable, and so on.

        You can specify source filter to retrieve parameters of only
        specific type. For example, to retrieve parameters that were
        modified by a user action such as from
        ModifyClusterParameterGroup, you can specify source equal to
        user .

        For more information about managing parameter groups, go to
        `Amazon Redshift Parameter Groups`_ in the Amazon Redshift
        Management Guide .

        :type parameter_group_name: string
        :param parameter_group_name: The name of a cluster parameter group for
            which to return details.

        :type source: string
        :param source: The parameter types to return. Specify `user` to show
            parameters that are different form the default. Similarly, specify
            `engine-default` to show parameters that are the same as the
            default parameter group.
        Default: All parameter types returned.

        Valid Values: `user` | `engine-default`

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, response includes a marker that you can specify in your
            subsequent request to retrieve remaining result.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeClusterParameters** request. If this parameter is
            specified, the response includes only records beyond the specified
            marker, up to the value specified by `MaxRecords`.

        """
        params = {'ParameterGroupName': parameter_group_name, }
        if source is not None:
            params['Source'] = source
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusterParameters',
            verb='POST',
            path='/', params=params)

    def describe_cluster_security_groups(self,
                                         cluster_security_group_name=None,
                                         max_records=None, marker=None):
        """
        Returns information about Amazon Redshift security groups. If
        the name of a security group is specified, the response will
        contain only information about only that security group.

        For information about managing security groups, go to`Amazon
        Redshift Cluster Security Groups`_ in the Amazon Redshift
        Management Guide .

        :type cluster_security_group_name: string
        :param cluster_security_group_name: The name of a cluster security
            group for which you are requesting details. You can specify either
            the **Marker** parameter or a **ClusterSecurityGroupName**
            parameter, but not both.
        Example: `securitygroup1`

        :type max_records: integer
        :param max_records: The maximum number of records to be included in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response, which you can use in a
            subsequent DescribeClusterSecurityGroups request.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeClusterSecurityGroups request to indicate the first
            security group that the current request will return. You can
            specify either the **Marker** parameter or a
            **ClusterSecurityGroupName** parameter, but not both.

        """
        params = {}
        if cluster_security_group_name is not None:
            params['ClusterSecurityGroupName'] = cluster_security_group_name
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusterSecurityGroups',
            verb='POST',
            path='/', params=params)

    def describe_cluster_snapshots(self, cluster_identifier=None,
                                   snapshot_identifier=None,
                                   snapshot_type=None, start_time=None,
                                   end_time=None, max_records=None,
                                   marker=None, owner_account=None):
        """
        Returns one or more snapshot objects, which contain metadata
        about your cluster snapshots. By default, this operation
        returns information about all snapshots of all clusters that
        are owned by you AWS customer account. No information is
        returned for snapshots owned by inactive AWS customer
        accounts.

        :type cluster_identifier: string
        :param cluster_identifier: The identifier of the cluster for which
            information about snapshots is requested.

        :type snapshot_identifier: string
        :param snapshot_identifier: The snapshot identifier of the snapshot
            about which to return information.

        :type snapshot_type: string
        :param snapshot_type: The type of snapshots for which you are
            requesting information. By default, snapshots of all types are
            returned.
        Valid Values: `automated` | `manual`

        :type start_time: timestamp
        :param start_time: A value that requests only snapshots created at or
            after the specified time. The time value is specified in ISO 8601
            format. For more information about ISO 8601, go to the `ISO8601
            Wikipedia page.`_
        Example: `2012-07-16T18:00:00Z`

        :type end_time: timestamp
        :param end_time: A time value that requests only snapshots created at
            or before the specified time. The time value is specified in ISO
            8601 format. For more information about ISO 8601, go to the
            `ISO8601 Wikipedia page.`_
        Example: `2012-07-16T18:00:00Z`

        :type max_records: integer
        :param max_records: The maximum number of snapshot records to include
            in the response. If more records exist than the specified
            `MaxRecords` value, the response returns a marker that you can use
            in a subsequent DescribeClusterSnapshots request in order to
            retrieve the next set of snapshot records.
        Default: `100`

        Constraints: Must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeClusterSnapshots request to indicate the first snapshot
            that the request will return.

        :type owner_account: string
        :param owner_account: The AWS customer account used to create or copy
            the snapshot. Use this field to filter the results to snapshots
            owned by a particular account. To describe snapshots you own,
            either specify your AWS customer account, or do not specify the
            parameter.

        """
        params = {}
        if cluster_identifier is not None:
            params['ClusterIdentifier'] = cluster_identifier
        if snapshot_identifier is not None:
            params['SnapshotIdentifier'] = snapshot_identifier
        if snapshot_type is not None:
            params['SnapshotType'] = snapshot_type
        if start_time is not None:
            params['StartTime'] = start_time
        if end_time is not None:
            params['EndTime'] = end_time
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        if owner_account is not None:
            params['OwnerAccount'] = owner_account
        return self._make_request(
            action='DescribeClusterSnapshots',
            verb='POST',
            path='/', params=params)

    def describe_cluster_subnet_groups(self, cluster_subnet_group_name=None,
                                       max_records=None, marker=None):
        """
        Returns one or more cluster subnet group objects, which
        contain metadata about your cluster subnet groups. By default,
        this operation returns information about all cluster subnet
        groups that are defined in you AWS account.

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name of the cluster subnet group
            for which information is requested.

        :type max_records: integer
        :param max_records: The maximum number of cluster subnet group records
            to include in the response. If more records exist than the
            specified `MaxRecords` value, the response returns a marker that
            you can use in a subsequent DescribeClusterSubnetGroups request in
            order to retrieve the next set of cluster subnet group records.
        Default: 100

        Constraints: Must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeClusterSubnetGroups request to indicate the first cluster
            subnet group that the current request will return.

        """
        params = {}
        if cluster_subnet_group_name is not None:
            params['ClusterSubnetGroupName'] = cluster_subnet_group_name
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusterSubnetGroups',
            verb='POST',
            path='/', params=params)

    def describe_cluster_versions(self, cluster_version=None,
                                  cluster_parameter_group_family=None,
                                  max_records=None, marker=None):
        """
        Returns descriptions of the available Amazon Redshift cluster
        versions. You can call this operation even before creating any
        clusters to learn more about the Amazon Redshift versions. For
        more information about managing clusters, go to `Amazon
        Redshift Clusters`_ in the Amazon Redshift Management Guide

        :type cluster_version: string
        :param cluster_version: The specific cluster version to return.
        Example: `1.0`

        :type cluster_parameter_group_family: string
        :param cluster_parameter_group_family:
        The name of a specific cluster parameter group family to return details
            for.

        Constraints:


        + Must be 1 to 255 alphanumeric characters
        + First character must be a letter
        + Cannot end with a hyphen or contain two consecutive hyphens

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more than the `MaxRecords` value is available, a
            marker is included in the response so that the following results
            can be retrieved.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: The marker returned from a previous request. If this
            parameter is specified, the response includes records beyond the
            marker only, up to `MaxRecords`.

        """
        params = {}
        if cluster_version is not None:
            params['ClusterVersion'] = cluster_version
        if cluster_parameter_group_family is not None:
            params['ClusterParameterGroupFamily'] = cluster_parameter_group_family
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusterVersions',
            verb='POST',
            path='/', params=params)

    def describe_clusters(self, cluster_identifier=None, max_records=None,
                          marker=None):
        """
        Returns properties of provisioned clusters including general
        cluster properties, cluster database properties, maintenance
        and backup properties, and security and access properties.
        This operation supports pagination. For more information about
        managing clusters, go to `Amazon Redshift Clusters`_ in the
        Amazon Redshift Management Guide .

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of a cluster whose
            properties you are requesting. This parameter isn't case sensitive.
        The default is that all clusters defined for an account are returned.

        :type max_records: integer
        :param max_records: The maximum number of records that the response can
            include. If more records exist than the specified `MaxRecords`
            value, a `marker` is included in the response that can be used in a
            new **DescribeClusters** request to continue listing results.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            **DescribeClusters** request to indicate the first cluster that the
            current **DescribeClusters** request will return.
        You can specify either a **Marker** parameter or a
            **ClusterIdentifier** parameter in a **DescribeClusters** request,
            but not both.

        """
        params = {}
        if cluster_identifier is not None:
            params['ClusterIdentifier'] = cluster_identifier
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeClusters',
            verb='POST',
            path='/', params=params)

    def describe_default_cluster_parameters(self, parameter_group_family,
                                            max_records=None, marker=None):
        """
        Returns a list of parameter settings for the specified
        parameter group family.

        For more information about managing parameter groups, go to
        `Amazon Redshift Parameter Groups`_ in the Amazon Redshift
        Management Guide .

        :type parameter_group_family: string
        :param parameter_group_family: The name of the cluster parameter group
            family.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeDefaultClusterParameters** request. If this parameter is
            specified, the response includes only records beyond the marker, up
            to the value specified by `MaxRecords`.

        """
        params = {'ParameterGroupFamily': parameter_group_family, }
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeDefaultClusterParameters',
            verb='POST',
            path='/', params=params)

    def describe_event_categories(self, source_type=None):
        """
        Displays a list of event categories for all event source
        types, or for a specified source type. For a list of the event
        categories and source types, go to `Amazon Redshift Event
        Notifications`_.

        :type source_type: string
        :param source_type: The source type, such as cluster or parameter
            group, to which the described event categories apply.
        Valid values: cluster, snapshot, parameter group, and security group.

        """
        params = {}
        if source_type is not None:
            params['SourceType'] = source_type
        return self._make_request(
            action='DescribeEventCategories',
            verb='POST',
            path='/', params=params)

    def describe_event_subscriptions(self, subscription_name=None,
                                     max_records=None, marker=None):
        """
        Lists descriptions of all the Amazon Redshift event
        notifications subscription for a customer account. If you
        specify a subscription name, lists the description for that
        subscription.

        :type subscription_name: string
        :param subscription_name: The name of the Amazon Redshift event
            notification subscription to be described.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified MaxRecords
            value, a pagination token called a marker is included in the
            response so that the remaining results can be retrieved.
        Default: 100

        Constraints: minimum 20, maximum 100

        :type marker: string
        :param marker: An optional pagination token provided by a previous
            DescribeOrderableClusterOptions request. If this parameter is
            specified, the response includes only records beyond the marker, up
            to the value specified by MaxRecords.

        """
        params = {}
        if subscription_name is not None:
            params['SubscriptionName'] = subscription_name
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeEventSubscriptions',
            verb='POST',
            path='/', params=params)

    def describe_events(self, source_identifier=None, source_type=None,
                        start_time=None, end_time=None, duration=None,
                        max_records=None, marker=None):
        """
        Returns events related to clusters, security groups,
        snapshots, and parameter groups for the past 14 days. Events
        specific to a particular cluster, security group, snapshot or
        parameter group can be obtained by providing the name as a
        parameter. By default, the past hour of events are returned.

        :type source_identifier: string
        :param source_identifier:
        The identifier of the event source for which events will be returned.
            If this parameter is not specified, then all sources are included
            in the response.

        Constraints:

        If SourceIdentifier is supplied, SourceType must also be provided.


        + Specify a cluster identifier when SourceType is `cluster`.
        + Specify a cluster security group name when SourceType is `cluster-
              security-group`.
        + Specify a cluster parameter group name when SourceType is `cluster-
              parameter-group`.
        + Specify a cluster snapshot identifier when SourceType is `cluster-
              snapshot`.

        :type source_type: string
        :param source_type:
        The event source to retrieve events for. If no value is specified, all
            events are returned.

        Constraints:

        If SourceType is supplied, SourceIdentifier must also be provided.


        + Specify `cluster` when SourceIdentifier is a cluster identifier.
        + Specify `cluster-security-group` when SourceIdentifier is a cluster
              security group name.
        + Specify `cluster-parameter-group` when SourceIdentifier is a cluster
              parameter group name.
        + Specify `cluster-snapshot` when SourceIdentifier is a cluster
              snapshot identifier.

        :type start_time: timestamp
        :param start_time: The beginning of the time interval to retrieve
            events for, specified in ISO 8601 format. For more information
            about ISO 8601, go to the `ISO8601 Wikipedia page.`_
        Example: `2009-07-08T18:00Z`

        :type end_time: timestamp
        :param end_time: The end of the time interval for which to retrieve
            events, specified in ISO 8601 format. For more information about
            ISO 8601, go to the `ISO8601 Wikipedia page.`_
        Example: `2009-07-08T18:00Z`

        :type duration: integer
        :param duration: The number of minutes prior to the time of the request
            for which to retrieve events. For example, if the request is sent
            at 18:00 and you specify a duration of 60, then only events which
            have occurred after 17:00 will be returned.
        Default: `60`

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: Value must be at least 20 and no more than 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeEvents** request. If this parameter is specified, the
            response includes only records beyond the marker, up to the value
            specified by `MaxRecords`.

        """
        params = {}
        if source_identifier is not None:
            params['SourceIdentifier'] = source_identifier
        if source_type is not None:
            params['SourceType'] = source_type
        if start_time is not None:
            params['StartTime'] = start_time
        if end_time is not None:
            params['EndTime'] = end_time
        if duration is not None:
            params['Duration'] = duration
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeEvents',
            verb='POST',
            path='/', params=params)

    def describe_hsm_client_certificates(self,
                                         hsm_client_certificate_identifier=None,
                                         max_records=None, marker=None):
        """
        Returns information about the specified HSM client
        certificate. If no certificate ID is specified, returns
        information about all the HSM certificates owned by your AWS
        customer account.

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: The identifier of a specific
            HSM client certificate for which you want information. If no
            identifier is specified, information is returned for all HSM client
            certificates associated with Amazon Redshift clusters owned by your
            AWS customer account.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: minimum 20, maximum 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeOrderableClusterOptions** request. If this parameter is
            specified, the response includes only records beyond the marker, up
            to the value specified by `MaxRecords`.

        """
        params = {}
        if hsm_client_certificate_identifier is not None:
            params['HsmClientCertificateIdentifier'] = hsm_client_certificate_identifier
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeHsmClientCertificates',
            verb='POST',
            path='/', params=params)

    def describe_hsm_configurations(self, hsm_configuration_identifier=None,
                                    max_records=None, marker=None):
        """
        Returns information about the specified Amazon Redshift HSM
        configuration. If no configuration ID is specified, returns
        information about all the HSM configurations owned by your AWS
        customer account.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: The identifier of a specific
            Amazon Redshift HSM configuration to be described. If no identifier
            is specified, information is returned for all HSM configurations
            owned by your AWS customer account.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: minimum 20, maximum 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeOrderableClusterOptions** request. If this parameter is
            specified, the response includes only records beyond the marker, up
            to the value specified by `MaxRecords`.

        """
        params = {}
        if hsm_configuration_identifier is not None:
            params['HsmConfigurationIdentifier'] = hsm_configuration_identifier
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeHsmConfigurations',
            verb='POST',
            path='/', params=params)

    def describe_logging_status(self, cluster_identifier):
        """
        Describes whether information, such as queries and connection
        attempts, is being logged for the specified Amazon Redshift
        cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The identifier of the cluster to get the
            logging status from.
        Example: `examplecluster`

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='DescribeLoggingStatus',
            verb='POST',
            path='/', params=params)

    def describe_orderable_cluster_options(self, cluster_version=None,
                                           node_type=None, max_records=None,
                                           marker=None):
        """
        Returns a list of orderable cluster options. Before you create
        a new cluster you can use this operation to find what options
        are available, such as the EC2 Availability Zones (AZ) in the
        specific AWS region that you can specify, and the node types
        you can request. The node types differ by available storage,
        memory, CPU and price. With the cost involved you might want
        to obtain a list of cluster options in the specific region and
        specify values when creating a cluster. For more information
        about managing clusters, go to `Amazon Redshift Clusters`_ in
        the Amazon Redshift Management Guide

        :type cluster_version: string
        :param cluster_version: The version filter value. Specify this
            parameter to show only the available offerings matching the
            specified version.
        Default: All versions.

        Constraints: Must be one of the version returned from
            DescribeClusterVersions.

        :type node_type: string
        :param node_type: The node type filter value. Specify this parameter to
            show only the available offerings matching the specified node type.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: minimum 20, maximum 100.

        :type marker: string
        :param marker: An optional marker returned from a previous
            **DescribeOrderableClusterOptions** request. If this parameter is
            specified, the response includes only records beyond the marker, up
            to the value specified by `MaxRecords`.

        """
        params = {}
        if cluster_version is not None:
            params['ClusterVersion'] = cluster_version
        if node_type is not None:
            params['NodeType'] = node_type
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeOrderableClusterOptions',
            verb='POST',
            path='/', params=params)

    def describe_reserved_node_offerings(self,
                                         reserved_node_offering_id=None,
                                         max_records=None, marker=None):
        """
        Returns a list of the available reserved node offerings by
        Amazon Redshift with their descriptions including the node
        type, the fixed and recurring costs of reserving the node and
        duration the node will be reserved for you. These descriptions
        help you determine which reserve node offering you want to
        purchase. You then use the unique offering ID in you call to
        PurchaseReservedNodeOffering to reserve one or more nodes for
        your Amazon Redshift cluster.

        For more information about managing parameter groups, go to
        `Purchasing Reserved Nodes`_ in the Amazon Redshift Management
        Guide .

        :type reserved_node_offering_id: string
        :param reserved_node_offering_id: The unique identifier for the
            offering.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: minimum 20, maximum 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeReservedNodeOfferings request to indicate the first
            offering that the request will return.
        You can specify either a **Marker** parameter or a
            **ClusterIdentifier** parameter in a DescribeClusters request, but
            not both.

        """
        params = {}
        if reserved_node_offering_id is not None:
            params['ReservedNodeOfferingId'] = reserved_node_offering_id
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeReservedNodeOfferings',
            verb='POST',
            path='/', params=params)

    def describe_reserved_nodes(self, reserved_node_id=None,
                                max_records=None, marker=None):
        """
        Returns the descriptions of the reserved nodes.

        :type reserved_node_id: string
        :param reserved_node_id: Identifier for the node reservation.

        :type max_records: integer
        :param max_records: The maximum number of records to include in the
            response. If more records exist than the specified `MaxRecords`
            value, a marker is included in the response so that the remaining
            results may be retrieved.
        Default: `100`

        Constraints: minimum 20, maximum 100.

        :type marker: string
        :param marker: An optional marker returned by a previous
            DescribeReservedNodes request to indicate the first parameter group
            that the current request will return.

        """
        params = {}
        if reserved_node_id is not None:
            params['ReservedNodeId'] = reserved_node_id
        if max_records is not None:
            params['MaxRecords'] = max_records
        if marker is not None:
            params['Marker'] = marker
        return self._make_request(
            action='DescribeReservedNodes',
            verb='POST',
            path='/', params=params)

    def describe_resize(self, cluster_identifier):
        """
        Returns information about the last resize operation for the
        specified cluster. If no resize operation has ever been
        initiated for the specified cluster, a `HTTP 404` error is
        returned. If a resize operation was initiated and completed,
        the status of the resize remains as `SUCCEEDED` until the next
        resize.

        A resize operation can be requested using ModifyCluster and
        specifying a different number or type of nodes for the
        cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of a cluster whose
            resize progress you are requesting. This parameter isn't case-
            sensitive.
        By default, resize operations for all clusters defined for an AWS
            account are returned.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='DescribeResize',
            verb='POST',
            path='/', params=params)

    def disable_logging(self, cluster_identifier):
        """
        Stops logging information, such as queries and connection
        attempts, for the specified Amazon Redshift cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The identifier of the cluster on which
            logging is to be stopped.
        Example: `examplecluster`

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='DisableLogging',
            verb='POST',
            path='/', params=params)

    def disable_snapshot_copy(self, cluster_identifier):
        """
        Disables the automatic copying of snapshots from one region to
        another region for a specified cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of the source cluster
            that you want to disable copying of snapshots to a destination
            region.
        Constraints: Must be the valid name of an existing cluster that has
            cross-region snapshot copy enabled.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='DisableSnapshotCopy',
            verb='POST',
            path='/', params=params)

    def enable_logging(self, cluster_identifier, bucket_name,
                       s3_key_prefix=None):
        """
        Starts logging information, such as queries and connection
        attempts, for the specified Amazon Redshift cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The identifier of the cluster on which
            logging is to be started.
        Example: `examplecluster`

        :type bucket_name: string
        :param bucket_name:
        The name of an existing S3 bucket where the log files are to be stored.

        Constraints:


        + Must be in the same region as the cluster
        + The cluster must have read bucket and put object permissions

        :type s3_key_prefix: string
        :param s3_key_prefix:
        The prefix applied to the log file names.

        Constraints:


        + Cannot exceed 512 characters
        + Cannot contain spaces( ), double quotes ("), single quotes ('), a
              backslash (\), or control characters. The hexadecimal codes for
              invalid characters are:

            + x00 to x20
            + x22
            + x27
            + x5c
            + x7f or larger

        """
        params = {
            'ClusterIdentifier': cluster_identifier,
            'BucketName': bucket_name,
        }
        if s3_key_prefix is not None:
            params['S3KeyPrefix'] = s3_key_prefix
        return self._make_request(
            action='EnableLogging',
            verb='POST',
            path='/', params=params)

    def enable_snapshot_copy(self, cluster_identifier, destination_region,
                             retention_period=None):
        """
        Enables the automatic copy of snapshots from one region to
        another region for a specified cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of the source cluster
            to copy snapshots from.
        Constraints: Must be the valid name of an existing cluster that does
            not already have cross-region snapshot copy enabled.

        :type destination_region: string
        :param destination_region: The destination region that you want to copy
            snapshots to.
        Constraints: Must be the name of a valid region. For more information,
            see `Regions and Endpoints`_ in the Amazon Web Services General
            Reference.

        :type retention_period: integer
        :param retention_period: The number of days to retain automated
            snapshots in the destination region after they are copied from the
            source region.
        Default: 7.

        Constraints: Must be at least 1 and no more than 35.

        """
        params = {
            'ClusterIdentifier': cluster_identifier,
            'DestinationRegion': destination_region,
        }
        if retention_period is not None:
            params['RetentionPeriod'] = retention_period
        return self._make_request(
            action='EnableSnapshotCopy',
            verb='POST',
            path='/', params=params)

    def modify_cluster(self, cluster_identifier, cluster_type=None,
                       node_type=None, number_of_nodes=None,
                       cluster_security_groups=None,
                       vpc_security_group_ids=None,
                       master_user_password=None,
                       cluster_parameter_group_name=None,
                       automated_snapshot_retention_period=None,
                       preferred_maintenance_window=None,
                       cluster_version=None, allow_version_upgrade=None,
                       hsm_client_certificate_identifier=None,
                       hsm_configuration_identifier=None):
        """
        Modifies the settings for a cluster. For example, you can add
        another security or parameter group, update the preferred
        maintenance window, or change the master user password.
        Resetting a cluster password or modifying the security groups
        associated with a cluster do not need a reboot. However,
        modifying parameter group requires a reboot for parameters to
        take effect. For more information about managing clusters, go
        to `Amazon Redshift Clusters`_ in the Amazon Redshift
        Management Guide

        You can also change node type and the number of nodes to scale
        up or down the cluster. When resizing a cluster, you must
        specify both the number of nodes and the node type even if one
        of the parameters does not change. If you specify the same
        number of nodes and node type that are already configured for
        the cluster, an error is returned.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of the cluster to be
            modified.
        Example: `examplecluster`

        :type cluster_type: string
        :param cluster_type: The new cluster type.
        When you submit your cluster resize request, your existing cluster goes
            into a read-only mode. After Amazon Redshift provisions a new
            cluster based on your resize requirements, there will be outage for
            a period while the old cluster is deleted and your connection is
            switched to the new cluster. You can use DescribeResize to track
            the progress of the resize request.

        Valid Values: ` multi-node | single-node `

        :type node_type: string
        :param node_type: The new node type of the cluster. If you specify a
            new node type, you must also specify the number of nodes parameter
            also.
        When you submit your request to resize a cluster, Amazon Redshift sets
            access permissions for the cluster to read-only. After Amazon
            Redshift provisions a new cluster according to your resize
            requirements, there will be a temporary outage while the old
            cluster is deleted and your connection is switched to the new
            cluster. When the new connection is complete, the original access
            permissions for the cluster are restored. You can use the
            DescribeResize to track the progress of the resize request.

        Valid Values: ` dw.hs1.xlarge` | `dw.hs1.8xlarge`

        :type number_of_nodes: integer
        :param number_of_nodes: The new number of nodes of the cluster. If you
            specify a new number of nodes, you must also specify the node type
            parameter also.
        When you submit your request to resize a cluster, Amazon Redshift sets
            access permissions for the cluster to read-only. After Amazon
            Redshift provisions a new cluster according to your resize
            requirements, there will be a temporary outage while the old
            cluster is deleted and your connection is switched to the new
            cluster. When the new connection is complete, the original access
            permissions for the cluster are restored. You can use
            DescribeResize to track the progress of the resize request.

        Valid Values: Integer greater than `0`.

        :type cluster_security_groups: list
        :param cluster_security_groups:
        A list of cluster security groups to be authorized on this cluster.
            This change is asynchronously applied as soon as possible.

        Security groups currently associated with the cluster and not in the
            list of groups to apply, will be revoked from the cluster.

        Constraints:


        + Must be 1 to 255 alphanumeric characters or hyphens
        + First character must be a letter
        + Cannot end with a hyphen or contain two consecutive hyphens

        :type vpc_security_group_ids: list
        :param vpc_security_group_ids: A list of Virtual Private Cloud (VPC)
            security groups to be associated with the cluster.

        :type master_user_password: string
        :param master_user_password:
        The new password for the cluster master user. This change is
            asynchronously applied as soon as possible. Between the time of the
            request and the completion of the request, the `MasterUserPassword`
            element exists in the `PendingModifiedValues` element of the
            operation response.
        Operations never return the password, so this operation provides a way
            to regain access to the master user account for a cluster if the
            password is lost.


        Default: Uses existing setting.

        Constraints:


        + Must be between 8 and 64 characters in length.
        + Must contain at least one uppercase letter.
        + Must contain at least one lowercase letter.
        + Must contain one number.
        + Can be any printable ASCII character (ASCII code 33 to 126) except '
              (single quote), " (double quote), \, /, @, or space.

        :type cluster_parameter_group_name: string
        :param cluster_parameter_group_name: The name of the cluster parameter
            group to apply to this cluster. This change is applied only after
            the cluster is rebooted. To reboot a cluster use RebootCluster.
        Default: Uses existing setting.

        Constraints: The cluster parameter group must be in the same parameter
            group family that matches the cluster version.

        :type automated_snapshot_retention_period: integer
        :param automated_snapshot_retention_period: The number of days that
            automated snapshots are retained. If the value is 0, automated
            snapshots are disabled. Even if automated snapshots are disabled,
            you can still create manual snapshots when you want with
            CreateClusterSnapshot.
        If you decrease the automated snapshot retention period from its
            current value, existing automated snapshots which fall outside of
            the new retention period will be immediately deleted.

        Default: Uses existing setting.

        Constraints: Must be a value from 0 to 35.

        :type preferred_maintenance_window: string
        :param preferred_maintenance_window: The weekly time range (in UTC)
            during which system maintenance can occur, if necessary. If system
            maintenance is necessary during the window, it may result in an
            outage.
        This maintenance window change is made immediately. If the new
            maintenance window indicates the current time, there must be at
            least 120 minutes between the current time and end of the window in
            order to ensure that pending changes are applied.

        Default: Uses existing setting.

        Format: ddd:hh24:mi-ddd:hh24:mi, for example `wed:07:30-wed:08:00`.

        Valid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun

        Constraints: Must be at least 30 minutes.

        :type cluster_version: string
        :param cluster_version: The new version number of the Amazon Redshift
            engine to upgrade to.
        For major version upgrades, if a non-default cluster parameter group is
            currently in use, a new cluster parameter group in the cluster
            parameter group family for the new version must be specified. The
            new cluster parameter group can be the default for that cluster
            parameter group family. For more information about managing
            parameter groups, go to `Amazon Redshift Parameter Groups`_ in the
            Amazon Redshift Management Guide .

        Example: `1.0`

        :type allow_version_upgrade: boolean
        :param allow_version_upgrade: If `True`, upgrades will be applied
            automatically to the cluster during the maintenance window.
        Default: `False`

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: Specifies the name of the HSM
            client certificate the Amazon Redshift cluster uses to retrieve the
            data encryption keys stored in an HSM.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: Specifies the name of the HSM
            configuration that contains the information the Amazon Redshift
            cluster can use to retrieve and store keys in an HSM.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        if cluster_type is not None:
            params['ClusterType'] = cluster_type
        if node_type is not None:
            params['NodeType'] = node_type
        if number_of_nodes is not None:
            params['NumberOfNodes'] = number_of_nodes
        if cluster_security_groups is not None:
            self.build_list_params(params,
                                   cluster_security_groups,
                                   'ClusterSecurityGroups.member')
        if vpc_security_group_ids is not None:
            self.build_list_params(params,
                                   vpc_security_group_ids,
                                   'VpcSecurityGroupIds.member')
        if master_user_password is not None:
            params['MasterUserPassword'] = master_user_password
        if cluster_parameter_group_name is not None:
            params['ClusterParameterGroupName'] = cluster_parameter_group_name
        if automated_snapshot_retention_period is not None:
            params['AutomatedSnapshotRetentionPeriod'] = automated_snapshot_retention_period
        if preferred_maintenance_window is not None:
            params['PreferredMaintenanceWindow'] = preferred_maintenance_window
        if cluster_version is not None:
            params['ClusterVersion'] = cluster_version
        if allow_version_upgrade is not None:
            params['AllowVersionUpgrade'] = str(
                allow_version_upgrade).lower()
        if hsm_client_certificate_identifier is not None:
            params['HsmClientCertificateIdentifier'] = hsm_client_certificate_identifier
        if hsm_configuration_identifier is not None:
            params['HsmConfigurationIdentifier'] = hsm_configuration_identifier
        return self._make_request(
            action='ModifyCluster',
            verb='POST',
            path='/', params=params)

    def modify_cluster_parameter_group(self, parameter_group_name,
                                       parameters):
        """
        Modifies the parameters of a parameter group.

        For more information about managing parameter groups, go to
        `Amazon Redshift Parameter Groups`_ in the Amazon Redshift
        Management Guide .

        :type parameter_group_name: string
        :param parameter_group_name: The name of the parameter group to be
            modified.

        :type parameters: list
        :param parameters: An array of parameters to be modified. A maximum of
            20 parameters can be modified in a single request.
        For each parameter to be modified, you must supply at least the
            parameter name and parameter value; other name-value pairs of the
            parameter are optional.

        """
        params = {'ParameterGroupName': parameter_group_name, }
        self.build_complex_list_params(
            params, parameters,
            'Parameters.member',
            ('ParameterName', 'ParameterValue', 'Description', 'Source', 'DataType', 'AllowedValues', 'IsModifiable', 'MinimumEngineVersion'))
        return self._make_request(
            action='ModifyClusterParameterGroup',
            verb='POST',
            path='/', params=params)

    def modify_cluster_subnet_group(self, cluster_subnet_group_name,
                                    subnet_ids, description=None):
        """
        Modifies a cluster subnet group to include the specified list
        of VPC subnets. The operation replaces the existing list of
        subnets with the new list of subnets.

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name of the subnet group to be
            modified.

        :type description: string
        :param description: A text description of the subnet group to be
            modified.

        :type subnet_ids: list
        :param subnet_ids: An array of VPC subnet IDs. A maximum of 20 subnets
            can be modified in a single request.

        """
        params = {
            'ClusterSubnetGroupName': cluster_subnet_group_name,
        }
        self.build_list_params(params,
                               subnet_ids,
                               'SubnetIds.member')
        if description is not None:
            params['Description'] = description
        return self._make_request(
            action='ModifyClusterSubnetGroup',
            verb='POST',
            path='/', params=params)

    def modify_event_subscription(self, subscription_name,
                                  sns_topic_arn=None, source_type=None,
                                  source_ids=None, event_categories=None,
                                  severity=None, enabled=None):
        """
        Modifies an existing Amazon Redshift event notification
        subscription.

        :type subscription_name: string
        :param subscription_name: The name of the modified Amazon Redshift
            event notification subscription.

        :type sns_topic_arn: string
        :param sns_topic_arn: The Amazon Resource Name (ARN) of the SNS topic
            to be used by the event notification subscription.

        :type source_type: string
        :param source_type: The type of source that will be generating the
            events. For example, if you want to be notified of events generated
            by a cluster, you would set this parameter to cluster. If this
            value is not specified, events are returned for all Amazon Redshift
            objects in your AWS account. You must specify a source type in
            order to specify source IDs.
        Valid values: cluster, cluster-parameter-group, cluster-security-group,
            and cluster-snapshot.

        :type source_ids: list
        :param source_ids: A list of one or more identifiers of Amazon Redshift
            source objects. All of the objects must be of the same type as was
            specified in the source type parameter. The event subscription will
            return only events generated by the specified objects. If not
            specified, then events are returned for all objects within the
            source type specified.
        Example: my-cluster-1, my-cluster-2

        Example: my-snapshot-20131010

        :type event_categories: list
        :param event_categories: Specifies the Amazon Redshift event categories
            to be published by the event notification subscription.
        Values: Configuration, Management, Monitoring, Security

        :type severity: string
        :param severity: Specifies the Amazon Redshift event severity to be
            published by the event notification subscription.
        Values: ERROR, INFO

        :type enabled: boolean
        :param enabled: A Boolean value indicating if the subscription is
            enabled. `True` indicates the subscription is enabled

        """
        params = {'SubscriptionName': subscription_name, }
        if sns_topic_arn is not None:
            params['SnsTopicArn'] = sns_topic_arn
        if source_type is not None:
            params['SourceType'] = source_type
        if source_ids is not None:
            self.build_list_params(params,
                                   source_ids,
                                   'SourceIds.member')
        if event_categories is not None:
            self.build_list_params(params,
                                   event_categories,
                                   'EventCategories.member')
        if severity is not None:
            params['Severity'] = severity
        if enabled is not None:
            params['Enabled'] = str(
                enabled).lower()
        return self._make_request(
            action='ModifyEventSubscription',
            verb='POST',
            path='/', params=params)

    def modify_snapshot_copy_retention_period(self, cluster_identifier,
                                              retention_period):
        """
        Modifies the number of days to retain automated snapshots in
        the destination region after they are copied from the source
        region.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of the cluster for
            which you want to change the retention period for automated
            snapshots that are copied to a destination region.
        Constraints: Must be the valid name of an existing cluster that has
            cross-region snapshot copy enabled.

        :type retention_period: integer
        :param retention_period: The number of days to retain automated
            snapshots in the destination region after they are copied from the
            source region.
        If you decrease the retention period for automated snapshots that are
            copied to a destination region, Amazon Redshift will delete any
            existing automated snapshots that were copied to the destination
            region and that fall outside of the new retention period.

        Constraints: Must be at least 1 and no more than 35.

        """
        params = {
            'ClusterIdentifier': cluster_identifier,
            'RetentionPeriod': retention_period,
        }
        return self._make_request(
            action='ModifySnapshotCopyRetentionPeriod',
            verb='POST',
            path='/', params=params)

    def purchase_reserved_node_offering(self, reserved_node_offering_id,
                                        node_count=None):
        """
        Allows you to purchase reserved nodes. Amazon Redshift offers
        a predefined set of reserved node offerings. You can purchase
        one of the offerings. You can call the
        DescribeReservedNodeOfferings API to obtain the available
        reserved node offerings. You can call this API by providing a
        specific reserved node offering and the number of nodes you
        want to reserve.

        For more information about managing parameter groups, go to
        `Purchasing Reserved Nodes`_ in the Amazon Redshift Management
        Guide .

        :type reserved_node_offering_id: string
        :param reserved_node_offering_id: The unique identifier of the reserved
            node offering you want to purchase.

        :type node_count: integer
        :param node_count: The number of reserved nodes you want to purchase.
        Default: `1`

        """
        params = {
            'ReservedNodeOfferingId': reserved_node_offering_id,
        }
        if node_count is not None:
            params['NodeCount'] = node_count
        return self._make_request(
            action='PurchaseReservedNodeOffering',
            verb='POST',
            path='/', params=params)

    def reboot_cluster(self, cluster_identifier):
        """
        Reboots a cluster. This action is taken as soon as possible.
        It results in a momentary outage to the cluster, during which
        the cluster status is set to `rebooting`. A cluster event is
        created when the reboot is completed. Any pending cluster
        modifications (see ModifyCluster) are applied at this reboot.
        For more information about managing clusters, go to `Amazon
        Redshift Clusters`_ in the Amazon Redshift Management Guide

        :type cluster_identifier: string
        :param cluster_identifier: The cluster identifier.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='RebootCluster',
            verb='POST',
            path='/', params=params)

    def reset_cluster_parameter_group(self, parameter_group_name,
                                      reset_all_parameters=None,
                                      parameters=None):
        """
        Sets one or more parameters of the specified parameter group
        to their default values and sets the source values of the
        parameters to "engine-default". To reset the entire parameter
        group specify the ResetAllParameters parameter. For parameter
        changes to take effect you must reboot any associated
        clusters.

        :type parameter_group_name: string
        :param parameter_group_name: The name of the cluster parameter group to
            be reset.

        :type reset_all_parameters: boolean
        :param reset_all_parameters: If `True`, all parameters in the specified
            parameter group will be reset to their default values.
        Default: `True`

        :type parameters: list
        :param parameters: An array of names of parameters to be reset. If
            ResetAllParameters option is not used, then at least one parameter
            name must be supplied.
        Constraints: A maximum of 20 parameters can be reset in a single
            request.

        """
        params = {'ParameterGroupName': parameter_group_name, }
        if reset_all_parameters is not None:
            params['ResetAllParameters'] = str(
                reset_all_parameters).lower()
        if parameters is not None:
            self.build_complex_list_params(
                params, parameters,
                'Parameters.member',
                ('ParameterName', 'ParameterValue', 'Description', 'Source', 'DataType', 'AllowedValues', 'IsModifiable', 'MinimumEngineVersion'))
        return self._make_request(
            action='ResetClusterParameterGroup',
            verb='POST',
            path='/', params=params)

    def restore_from_cluster_snapshot(self, cluster_identifier,
                                      snapshot_identifier,
                                      snapshot_cluster_identifier=None,
                                      port=None, availability_zone=None,
                                      allow_version_upgrade=None,
                                      cluster_subnet_group_name=None,
                                      publicly_accessible=None,
                                      owner_account=None,
                                      hsm_client_certificate_identifier=None,
                                      hsm_configuration_identifier=None,
                                      elastic_ip=None):
        """
        Creates a new cluster from a snapshot. Amazon Redshift creates
        the resulting cluster with the same configuration as the
        original cluster from which the snapshot was created, except
        that the new cluster is created with the default cluster
        security and parameter group. After Amazon Redshift creates
        the cluster you can use the ModifyCluster API to associate a
        different security group and different parameter group with
        the restored cluster.

        If a snapshot is taken of a cluster in VPC, you can restore it
        only in VPC. In this case, you must provide a cluster subnet
        group where you want the cluster restored. If snapshot is
        taken of a cluster outside VPC, then you can restore it only
        outside VPC.

        For more information about working with snapshots, go to
        `Amazon Redshift Snapshots`_ in the Amazon Redshift Management
        Guide .

        :type cluster_identifier: string
        :param cluster_identifier: The identifier of the cluster that will be
            created from restoring the snapshot.

        Constraints:


        + Must contain from 1 to 63 alphanumeric characters or hyphens.
        + Alphabetic characters must be lowercase.
        + First character must be a letter.
        + Cannot end with a hyphen or contain two consecutive hyphens.
        + Must be unique for all clusters within an AWS account.

        :type snapshot_identifier: string
        :param snapshot_identifier: The name of the snapshot from which to
            create the new cluster. This parameter isn't case sensitive.
        Example: `my-snapshot-id`

        :type snapshot_cluster_identifier: string
        :param snapshot_cluster_identifier: The name of the cluster the source
            snapshot was created from. This parameter is required if your IAM
            user has a policy containing a snapshot resource element that
            specifies anything other than * for the cluster name.

        :type port: integer
        :param port: The port number on which the cluster accepts connections.
        Default: The same port as the original cluster.

        Constraints: Must be between `1115` and `65535`.

        :type availability_zone: string
        :param availability_zone: The Amazon EC2 Availability Zone in which to
            restore the cluster.
        Default: A random, system-chosen Availability Zone.

        Example: `us-east-1a`

        :type allow_version_upgrade: boolean
        :param allow_version_upgrade: If `True`, upgrades can be applied during
            the maintenance window to the Amazon Redshift engine that is
            running on the cluster.
        Default: `True`

        :type cluster_subnet_group_name: string
        :param cluster_subnet_group_name: The name of the subnet group where
            you want to cluster restored.
        A snapshot of cluster in VPC can be restored only in VPC. Therefore,
            you must provide subnet group name where you want the cluster
            restored.

        :type publicly_accessible: boolean
        :param publicly_accessible: If `True`, the cluster can be accessed from
            a public network.

        :type owner_account: string
        :param owner_account: The AWS customer account used to create or copy
            the snapshot. Required if you are restoring a snapshot you do not
            own, optional if you own the snapshot.

        :type hsm_client_certificate_identifier: string
        :param hsm_client_certificate_identifier: Specifies the name of the HSM
            client certificate the Amazon Redshift cluster uses to retrieve the
            data encryption keys stored in an HSM.

        :type hsm_configuration_identifier: string
        :param hsm_configuration_identifier: Specifies the name of the HSM
            configuration that contains the information the Amazon Redshift
            cluster can use to retrieve and store keys in an HSM.

        :type elastic_ip: string
        :param elastic_ip: The elastic IP (EIP) address for the cluster.

        """
        params = {
            'ClusterIdentifier': cluster_identifier,
            'SnapshotIdentifier': snapshot_identifier,
        }
        if snapshot_cluster_identifier is not None:
            params['SnapshotClusterIdentifier'] = snapshot_cluster_identifier
        if port is not None:
            params['Port'] = port
        if availability_zone is not None:
            params['AvailabilityZone'] = availability_zone
        if allow_version_upgrade is not None:
            params['AllowVersionUpgrade'] = str(
                allow_version_upgrade).lower()
        if cluster_subnet_group_name is not None:
            params['ClusterSubnetGroupName'] = cluster_subnet_group_name
        if publicly_accessible is not None:
            params['PubliclyAccessible'] = str(
                publicly_accessible).lower()
        if owner_account is not None:
            params['OwnerAccount'] = owner_account
        if hsm_client_certificate_identifier is not None:
            params['HsmClientCertificateIdentifier'] = hsm_client_certificate_identifier
        if hsm_configuration_identifier is not None:
            params['HsmConfigurationIdentifier'] = hsm_configuration_identifier
        if elastic_ip is not None:
            params['ElasticIp'] = elastic_ip
        return self._make_request(
            action='RestoreFromClusterSnapshot',
            verb='POST',
            path='/', params=params)

    def revoke_cluster_security_group_ingress(self,
                                              cluster_security_group_name,
                                              cidrip=None,
                                              ec2_security_group_name=None,
                                              ec2_security_group_owner_id=None):
        """
        Revokes an ingress rule in an Amazon Redshift security group
        for a previously authorized IP range or Amazon EC2 security
        group. To add an ingress rule, see
        AuthorizeClusterSecurityGroupIngress. For information about
        managing security groups, go to`Amazon Redshift Cluster
        Security Groups`_ in the Amazon Redshift Management Guide .

        :type cluster_security_group_name: string
        :param cluster_security_group_name: The name of the security Group from
            which to revoke the ingress rule.

        :type cidrip: string
        :param cidrip: The IP range for which to revoke access. This range must
            be a valid Classless Inter-Domain Routing (CIDR) block of IP
            addresses. If `CIDRIP` is specified, `EC2SecurityGroupName` and
            `EC2SecurityGroupOwnerId` cannot be provided.

        :type ec2_security_group_name: string
        :param ec2_security_group_name: The name of the EC2 Security Group
            whose access is to be revoked. If `EC2SecurityGroupName` is
            specified, `EC2SecurityGroupOwnerId` must also be provided and
            `CIDRIP` cannot be provided.

        :type ec2_security_group_owner_id: string
        :param ec2_security_group_owner_id: The AWS account number of the owner
            of the security group specified in the `EC2SecurityGroupName`
            parameter. The AWS access key ID is not an acceptable value. If
            `EC2SecurityGroupOwnerId` is specified, `EC2SecurityGroupName` must
            also be provided. and `CIDRIP` cannot be provided.
        Example: `111122223333`

        """
        params = {
            'ClusterSecurityGroupName': cluster_security_group_name,
        }
        if cidrip is not None:
            params['CIDRIP'] = cidrip
        if ec2_security_group_name is not None:
            params['EC2SecurityGroupName'] = ec2_security_group_name
        if ec2_security_group_owner_id is not None:
            params['EC2SecurityGroupOwnerId'] = ec2_security_group_owner_id
        return self._make_request(
            action='RevokeClusterSecurityGroupIngress',
            verb='POST',
            path='/', params=params)

    def revoke_snapshot_access(self, snapshot_identifier,
                               account_with_restore_access,
                               snapshot_cluster_identifier=None):
        """
        Removes the ability of the specified AWS customer account to
        restore the specified snapshot. If the account is currently
        restoring the snapshot, the restore will run to completion.

        For more information about working with snapshots, go to
        `Amazon Redshift Snapshots`_ in the Amazon Redshift Management
        Guide .

        :type snapshot_identifier: string
        :param snapshot_identifier: The identifier of the snapshot that the
            account can no longer access.

        :type snapshot_cluster_identifier: string
        :param snapshot_cluster_identifier: The identifier of the cluster the
            snapshot was created from. This parameter is required if your IAM
            user has a policy containing a snapshot resource element that
            specifies anything other than * for the cluster name.

        :type account_with_restore_access: string
        :param account_with_restore_access: The identifier of the AWS customer
            account that can no longer restore the specified snapshot.

        """
        params = {
            'SnapshotIdentifier': snapshot_identifier,
            'AccountWithRestoreAccess': account_with_restore_access,
        }
        if snapshot_cluster_identifier is not None:
            params['SnapshotClusterIdentifier'] = snapshot_cluster_identifier
        return self._make_request(
            action='RevokeSnapshotAccess',
            verb='POST',
            path='/', params=params)

    def rotate_encryption_key(self, cluster_identifier):
        """
        Rotates the encryption keys for a cluster.

        :type cluster_identifier: string
        :param cluster_identifier: The unique identifier of the cluster that
            you want to rotate the encryption keys for.
        Constraints: Must be the name of valid cluster that has encryption
            enabled.

        """
        params = {'ClusterIdentifier': cluster_identifier, }
        return self._make_request(
            action='RotateEncryptionKey',
            verb='POST',
            path='/', params=params)

    def _make_request(self, action, verb, path, params):
        params['ContentType'] = 'JSON'
        response = self.make_request(action=action, verb='POST',
                                     path='/', params=params)
        body = response.read().decode('utf-8')
        boto.log.debug(body)
        if response.status == 200:
            return json.loads(body)
        else:
            json_body = json.loads(body)
            fault_name = json_body.get('Error', {}).get('Code', None)
            exception_class = self._faults.get(fault_name, self.ResponseError)
            raise exception_class(response.status, response.reason,
                                  body=json_body)