def test_any_enabled_false_if_all_of_three_disabled(self): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add('1', {'Type': 'Linear', 'Enabled': False}) deployment_preference_collection.add('2', {'Type': 'LINEAR', 'Enabled': False}) deployment_preference_collection.add('3', {'Type': 'CANARY', 'Enabled': False}) self.assertFalse(deployment_preference_collection.any_enabled())
def test_deployment_preference_with_conditional_custom_configuration(self): deployment_type = { "Fn::If": [ "IsDevEnv", {"Fn::If": ["IsDevEnv1", "AllAtOnce", "TestDeploymentConfiguration"]}, "Canary10Percent15Minutes", ] } expected_deployment_config_name = { "Fn::If": [ "IsDevEnv", { "Fn::If": [ "IsDevEnv1", {"Fn::Sub": ["CodeDeployDefault.Lambda${ConfigName}", {"ConfigName": "AllAtOnce"}]}, "TestDeploymentConfiguration", ] }, {"Fn::Sub": ["CodeDeployDefault.Lambda${ConfigName}", {"ConfigName": "Canary10Percent15Minutes"}]}, ] } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {"Type": deployment_type}) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) print(deployment_group.DeploymentConfigName) self.assertEqual(expected_deployment_config_name, deployment_group.DeploymentConfigName)
def test_deployment_preference_with_conditional_custom_configuration(self): deployment_type = {'Fn::If': ['IsDevEnv', {'Fn::If': ['IsDevEnv1', 'AllAtOnce', 'TestDeploymentConfiguration']}, 'Canary10Percent15Minutes']} expected_deployment_config_name = {'Fn::If': ['IsDevEnv', {'Fn::If': ['IsDevEnv1', {'Fn::Sub': [ 'CodeDeployDefault.Lambda${ConfigName}', { 'ConfigName': 'AllAtOnce' } ] }, 'TestDeploymentConfiguration']}, {'Fn::Sub': [ 'CodeDeployDefault.Lambda${ConfigName}', { 'ConfigName': 'Canary10Percent15Minutes' } ] } ] } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {'Type': deployment_type}) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) print(deployment_group.DeploymentConfigName) self.assertEqual(expected_deployment_config_name, deployment_group.DeploymentConfigName)
def test_any_enabled_true_if_all_of_three_enabled(self): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add('1', {'Type': 'LINEAR'}) deployment_preference_collection.add('2', {'Type': 'LINEAR', 'Enabled': True}) deployment_preference_collection.add('3', {'Type': 'CANARY', 'Enabled': True}) self.assertTrue(deployment_preference_collection.any_enabled())
def test_deployment_group_with_all_parameters(self): expected_deployment_group = CodeDeployDeploymentGroup(self.function_logical_id + "DeploymentGroup") expected_deployment_group.AlarmConfiguration = { "Enabled": True, "Alarms": [{"Name": {"Ref": "alarm1"}}, {"Name": {"Ref": "alarm2"}}], } expected_deployment_group.ApplicationName = {"Ref": CODEDEPLOY_APPLICATION_LOGICAL_ID} expected_deployment_group.AutoRollbackConfiguration = { "Enabled": True, "Events": ["DEPLOYMENT_FAILURE", "DEPLOYMENT_STOP_ON_ALARM", "DEPLOYMENT_STOP_ON_REQUEST"], } expected_deployment_group.DeploymentConfigName = { "Fn::Sub": ["CodeDeployDefault.Lambda${ConfigName}", {"ConfigName": self.deployment_type_global}] } expected_deployment_group.DeploymentStyle = { "DeploymentType": "BLUE_GREEN", "DeploymentOption": "WITH_TRAFFIC_CONTROL", } expected_deployment_group.ServiceRoleArn = {"Fn::GetAtt": [CODE_DEPLOY_SERVICE_ROLE_LOGICAL_ID, "Arn"]} deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, self.global_deployment_preference_yaml_dict()) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) self.assertEqual(deployment_group.to_dict(), expected_deployment_group.to_dict())
def test_deployment_group_with_minimal_parameters(self): expected_deployment_group = CodeDeployDeploymentGroup(self.function_logical_id + 'DeploymentGroup') expected_deployment_group.ApplicationName = {'Ref': CODEDEPLOY_APPLICATION_LOGICAL_ID} expected_deployment_group.AutoRollbackConfiguration = {'Enabled': True, 'Events': ['DEPLOYMENT_FAILURE', 'DEPLOYMENT_STOP_ON_ALARM', 'DEPLOYMENT_STOP_ON_REQUEST']} expected_deployment_group.DeploymentConfigName = { 'Fn::Sub': [ 'CodeDeployDefault.Lambda${ConfigName}', { 'ConfigName': self.deployment_type_global } ] } expected_deployment_group.DeploymentStyle = {'DeploymentType': 'BLUE_GREEN', 'DeploymentOption': 'WITH_TRAFFIC_CONTROL'} expected_deployment_group.ServiceRoleArn = {'Fn::GetAtt': [CODE_DEPLOY_SERVICE_ROLE_LOGICAL_ID, 'Arn']} deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {'Type': self.deployment_type_global}) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) self.assertEqual(deployment_group.to_dict(), expected_deployment_group.to_dict())
def test_deployment_preference_with_codedeploy_custom_configuration(self): deployment_type = "TestDeploymentConfiguration" deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {'Type': deployment_type}) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) self.assertEqual(deployment_type, deployment_group.DeploymentConfigName)
def test_deployment_preference_with_alarms_intrinsic_if_noref_else(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": { "Fn::If": [ "MyCondition", ["Alarm1", "Alarm2"], [{ "Ref": "AWS::NoValue" }] ] }, } expected_alarm_configuration = { "Fn::If": [ "MyCondition", { "Enabled": True, "Alarms": [{ "Name": "Alarm1" }, { "Name": "Alarm2" }] }, {} ], } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) deployment_group = deployment_preference_collection.deployment_group( self.function_logical_id) self.assertEqual(expected_alarm_configuration, deployment_group.AlarmConfiguration)
def test_any_enabled_false_if_all_of_three_disabled(self): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add("1", {"Type": "Linear", "Enabled": False}) deployment_preference_collection.add("2", {"Type": "LINEAR", "Enabled": False}) deployment_preference_collection.add("3", {"Type": "CANARY", "Enabled": False}) self.assertFalse(deployment_preference_collection.any_enabled())
def test_any_enabled_true_if_all_of_three_enabled(self): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add("1", {"Type": "LINEAR"}) deployment_preference_collection.add("2", {"Type": "LINEAR", "Enabled": True}) deployment_preference_collection.add("3", {"Type": "CANARY", "Enabled": True}) self.assertTrue(deployment_preference_collection.any_enabled())
def test_enabled_logical_ids_returns_one_if_one_of_three_enabled(self): deployment_preference_collection = DeploymentPreferenceCollection() enabled_logical_id = "1" deployment_preference_collection.add(enabled_logical_id, {"Type": "LINEAR"}) deployment_preference_collection.add("2", {"Type": "LINEAR", "Enabled": False}) deployment_preference_collection.add("3", {"Type": "CANARY", "Enabled": False}) enabled_logical_ids = deployment_preference_collection.enabled_logical_ids() self.assertEqual(1, len(enabled_logical_ids)) self.assertEqual(enabled_logical_id, enabled_logical_ids[0])
def test_enabled_logical_ids_returns_one_if_one_of_three_enabled(self): deployment_preference_collection = DeploymentPreferenceCollection() enabled_logical_id = '1' deployment_preference_collection.add(enabled_logical_id, {'Type': 'LINEAR'}) deployment_preference_collection.add('2', {'Type': 'LINEAR', 'Enabled': False}) deployment_preference_collection.add('3', {'Type': 'CANARY', 'Enabled': False}) enabled_logical_ids = deployment_preference_collection.enabled_logical_ids() self.assertEqual(1, len(enabled_logical_ids)) self.assertEqual(enabled_logical_id, enabled_logical_ids[0])
def test_deployment_preference_with_codedeploy_predifined_configuration(self): deployment_type = "Canary10Percent5Minutes" expected_deployment_config_name = { "Fn::Sub": ["CodeDeployDefault.Lambda${ConfigName}", {"ConfigName": deployment_type}] } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {"Type": deployment_type}) deployment_group = deployment_preference_collection.deployment_group(self.function_logical_id) print(deployment_group.DeploymentConfigName) self.assertEqual(expected_deployment_config_name, deployment_group.DeploymentConfigName)
def test_deployment_preference_with_alarms_empty(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": [], } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) deployment_group = deployment_preference_collection.deployment_group( self.function_logical_id) self.assertIsNone(deployment_group.AlarmConfiguration)
def test_update_policy_with_minimal_parameters(self): expected_update_policy = { 'CodeDeployLambdaAliasUpdate': { 'ApplicationName': {'Ref': CODEDEPLOY_APPLICATION_LOGICAL_ID}, 'DeploymentGroupName': {'Ref': self.function_logical_id + 'DeploymentGroup'}, } } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {'Type': 'CANARY'}) update_policy = deployment_preference_collection.update_policy(self.function_logical_id) self.assertEqual(expected_update_policy, update_policy.to_dict())
def test_update_policy_with_minimal_parameters(self): expected_update_policy = { "CodeDeployLambdaAliasUpdate": { "ApplicationName": {"Ref": CODEDEPLOY_APPLICATION_LOGICAL_ID}, "DeploymentGroupName": {"Ref": self.function_logical_id + "DeploymentGroup"}, } } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, {"Type": "CANARY"}) update_policy = deployment_preference_collection.update_policy(self.function_logical_id) self.assertEqual(expected_update_policy, update_policy.to_dict())
def test_deployment_preference_with_alarms_ref_novalue(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": { "Ref": "AWS::NoValue" }, } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) deployment_group = deployment_preference_collection.deployment_group( self.function_logical_id) self.assertIsNone(deployment_group.AlarmConfiguration)
def test_update_policy_with_all_parameters(self): expected_update_polcy = { 'CodeDeployLambdaAliasUpdate': { 'ApplicationName': {'Ref': CODEDEPLOY_APPLICATION_LOGICAL_ID}, 'DeploymentGroupName': {'Ref': self.function_logical_id + 'DeploymentGroup'}, 'BeforeAllowTrafficHook': self.pre_traffic_hook_global, 'AfterAllowTrafficHook': self.post_traffic_host_global, } } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, self.global_deployment_preference_yaml_dict()) update_policy = deployment_preference_collection.update_policy(self.function_logical_id) self.assertEqual(expected_update_polcy, update_policy.to_dict())
def test_deployment_preference_with_alarms_not_list(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": "Alarm1", } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) with self.assertRaises(InvalidResourceException) as e: deployment_preference_collection.deployment_group( self.function_logical_id) self.assertEqual( e.exception.message, "Resource with id [{}] is invalid. Alarms must be a list".format( self.function_logical_id), )
def test_deployment_preference_with_alarms_intrinsic_if_missing_arg(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": { "Fn::If": ["MyCondition", ["Alarm1", "Alarm2"]] }, } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) with self.assertRaises(InvalidResourceException) as e: deployment_preference_collection.deployment_group( self.function_logical_id) self.assertEqual( e.exception.message, "Resource with id [{}] is invalid. Fn::If requires 3 arguments". format(self.function_logical_id), )
def test_deployment_preference_with_alarms(self): deployment_preference = { "Type": "TestDeploymentConfiguration", "Alarms": ["Alarm1", "Alarm2", "Alarm3"], } expected_alarm_configuration = { "Enabled": True, "Alarms": [{ "Name": "Alarm1" }, { "Name": "Alarm2" }, { "Name": "Alarm3" }], } deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add(self.function_logical_id, deployment_preference) deployment_group = deployment_preference_collection.deployment_group( self.function_logical_id) self.assertEqual(expected_alarm_configuration, deployment_group.AlarmConfiguration)
def test_add_when_logical_id_previously_added_raises_value_error(self): with self.assertRaises(ValueError): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add("1", {"Type": "Canary"}) deployment_preference_collection.add("1", {"Type": "Linear"})
def test_add_when_logical_id_previously_added_raises_value_error(self): with self.assertRaises(ValueError): deployment_preference_collection = DeploymentPreferenceCollection() deployment_preference_collection.add('1', {'Type': 'Canary'}) deployment_preference_collection.add('1', {'Type': 'Linear'})