From dfb33aaad31f632bcdfd4e17ad2b0b1cf34fee37 Mon Sep 17 00:00:00 2001 From: Mike Fuller Date: Tue, 20 Jan 2015 21:01:34 +1100 Subject: [PATCH] Started implementing modify_option_group. --- moto/rds2/models.py | 23 ++++++++++++++++++++++- moto/rds2/responses.py | 26 ++++++++++++++++++++++++++ tests/test_rds2/test_rds2.py | 27 +++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/moto/rds2/models.py b/moto/rds2/models.py index fd3307cfa..63d313241 100644 --- a/moto/rds2/models.py +++ b/moto/rds2/models.py @@ -452,7 +452,9 @@ class RDS2Backend(BaseBackend): 'sqlserver-se': ['10.50', '11.00'], 'sqlserver-ee': ['10.50', '11.00'] } - + if option_group_kwargs['name'] in self.option_groups: + raise RDSClientError('OptionGroupAlreadyExistsFault', + 'An option group named {} already exists.'.format(option_group_kwargs['name'])) if 'description' not in option_group_kwargs or not option_group_kwargs['description']: raise RDSClientError('InvalidParameterValue', 'The parameter OptionGroupDescription must be provided and must not be blank.') @@ -535,6 +537,19 @@ class RDS2Backend(BaseBackend): return default_option_group_options[engine_name][major_engine_version] return default_option_group_options[engine_name]['all'] + def modify_option_group(self, option_group_name, options_to_include=None, options_to_remove=None, apply_immediately=None): + if option_group_name not in self.option_groups: + raise RDSClientError('OptionGroupNotFoundFault', + 'Specified OptionGroupName: {} not found.'.format(option_group_name)) + if not options_to_include and not options_to_remove: + raise RDSClientError('InvalidParameterValue', + 'At least one option must be added, modified, or removed.') + if options_to_remove: + self.option_groups[option_group_name].remove_options(options_to_remove) + if options_to_include: + self.option_groups[option_group_name].add_options(options_to_include) + return ['a'] + class OptionGroup(object): def __init__(self, name, engine_name, major_engine_version, description=None): @@ -558,6 +573,12 @@ class OptionGroup(object): }""") return template.render(option_group=self) + def remove_options(self, options_to_remove): + return + + def add_options(self, options_to_add): + return + class OptionGroupOption(object): def __init__(self, engine_name, major_engine_version): diff --git a/moto/rds2/responses.py b/moto/rds2/responses.py index 471946772..35fccd714 100644 --- a/moto/rds2/responses.py +++ b/moto/rds2/responses.py @@ -185,6 +185,32 @@ class RDS2Response(BaseResponse): option_group_options = self.backend.describe_option_group_options(engine_name, major_engine_version) return option_group_options + def modify_option_group(self): + option_group_name = self._get_param('OptionGroupName') + count = 1 + options_to_include = [] + while self._get_param('OptionsToInclude.member.{}.OptionName'.format(count)): + options_to_include.append({ + 'Port': self._get_param('OptionsToInclude.member.{}.Port'.format(count)), + 'OptionName': self._get_param('OptionsToInclude.member.{}.OptionName'.format(count)), + 'DBSecurityGroupMemberships': self._get_param('OptionsToInclude.member.{}.DBSecurityGroupMemberships'.format(count)), + 'OptionSettings': self._get_param('OptionsToInclude.member.{}.OptionSettings'.format(count)), + 'VpcSecurityGroupMemberships': self._get_param('OptionsToInclude.member.{}.VpcSecurityGroupMemberships'.format(count)) + }) + count += 1 + count = 1 + options_to_remove = [] + while self._get_param('OptionsToRemove.member.{}'.format(count)): + options_to_remove.append(self._get_param('OptionsToRemove.member.{}'.format(count))) + count += 1 + apply_immediately = self._get_param('ApplyImmediately') + result = self.backend.modify_option_group(option_group_name, + options_to_include, + options_to_remove, + apply_immediately) + return json.dumps('{"DescribeOptionGroupOptionsResponse": {"DescribeOptionGroupOptionsResult": {"Marker": null, "OptionGroupOptions": [{"MinimumRequiredMinorEngineVersion": "2789.0.v1", "OptionsDependedOn": [], "MajorEngineVersion": "10.50", "Persistent": false, "DefaultPort": null, "Permanent": false, "OptionGroupOptionSettings": [], "EngineName": "sqlserver-ee", "Name": "Mirroring", "PortRequired": false, "Description": "SQLServer Database Mirroring"}, {"MinimumRequiredMinorEngineVersion": "2789.0.v1", "OptionsDependedOn": [], "MajorEngineVersion": "10.50", "Persistent": true, "DefaultPort": null, "Permanent": false, "OptionGroupOptionSettings": [], "EngineName": "sqlserver-ee", "Name": "TDE", "PortRequired": false, "Description": "SQL Server - Transparent Data Encryption"}, {"MinimumRequiredMinorEngineVersion": "2100.60.v1", "OptionsDependedOn": [], "MajorEngineVersion": "11.00", "Persistent": false, "DefaultPort": null, "Permanent": false, "OptionGroupOptionSettings": [], "EngineName": "sqlserver-ee", "Name": "Mirroring", "PortRequired": false, "Description": "SQLServer Database Mirroring"}, {"MinimumRequiredMinorEngineVersion": "2100.60.v1", "OptionsDependedOn": [], "MajorEngineVersion": "11.00", "Persistent": true, "DefaultPort": null, "Permanent": false, "OptionGroupOptionSettings": [], "EngineName": "sqlserver-ee", "Name": "TDE", "PortRequired": false, "Description": "SQL Server - Transparent Data Encryption"}]}, "ResponseMetadata": {"RequestId": "c9f2fd9b-9fcb-11e4-8add-31b6fe33145f"}}}') + + CREATE_DATABASE_TEMPLATE = """{ "CreateDBInstanceResponse": { "CreateDBInstanceResult": { diff --git a/tests/test_rds2/test_rds2.py b/tests/test_rds2/test_rds2.py index 4c5657178..44c684721 100644 --- a/tests/test_rds2/test_rds2.py +++ b/tests/test_rds2/test_rds2.py @@ -91,6 +91,13 @@ def test_create_option_group_empty_description(): conn.create_option_group.when.called_with('test', 'mysql', '5.6', '').should.throw(BotoServerError) +@mock_rds2 +def test_create_option_group_duplicate(): + conn = boto.rds2.connect_to_region("us-west-2") + conn.create_option_group('test', 'mysql', '5.6', 'test option group') + conn.create_option_group.when.called_with('test', 'mysql', '5.6', 'foo').should.throw(BotoServerError) + + @mock_rds2 def test_describe_option_group(): conn = boto.rds2.connect_to_region("us-west-2") @@ -133,6 +140,26 @@ def test_describe_option_group_options(): conn.describe_option_group_options.when.called_with('non-existent').should.throw(BotoServerError) conn.describe_option_group_options.when.called_with('mysql', 'non-existent').should.throw(BotoServerError) + +@mock_rds2 +def test_modify_option_group(): + conn = boto.rds2.connect_to_region("us-west-2") + # if Someone can tell me how the hell to use this function I can finish coding this. + + +@mock_rds2 +def test_modify_option_group_no_options(): + conn = boto.rds2.connect_to_region("us-west-2") + conn.create_option_group('test', 'mysql', '5.6', 'test option group') + conn.modify_option_group.when.called_with('test').should.throw(BotoServerError) + + +@mock_rds2 +def test_modify_non_existant_option_group(): + conn = boto.rds2.connect_to_region("us-west-2") + conn.modify_option_group.when.called_with('non-existant', [('OptionName', 'Port', 'DBSecurityGroupMemberships', 'VpcSecurityGroupMemberships', 'OptionSettings')]).should.throw(BotoServerError) + + #@disable_on_py3() #@mock_rds2 #def test_delete_database():