def test_should_return_empty_running_environment_if_nothing_is_running(self):
        fake_boto_instance = mock()

        tags = {
            'services' : """
                apache :
                80: 80""",
            'credentials_name': 'test',
            'env_name' : 'my_environment',
            'env_def_name' : 'Single-AZ Deployment',
            }
        fake_boto_instance.tags = tags
        stub_region = mock()
        stub_region.name = 'eu-west'
        fake_boto_instance.region = stub_region
        fake_boto_instance.image_id = '1234'
        fake_boto_instance.instance_type = 'large'

        mock_connection_provider = mock()
        when(mock_connection_provider).ec2_connection_for_region("eu-west", None, None).thenReturn(None)
        when(mock_connection_provider).get_all_boto_instances(None, None).thenReturn([fake_boto_instance])

        provider = AWSNodeProvider(None, None, mock_connection_provider)

        environment = provider.get_running_environment("test","test", all_credentials)
        self.assertIsNotNone(environment)
        self.assertEqual(0, len(environment.get_locations()))
    def test_will_parse_AWS_node_environment_configuration(self):
        single_service_yaml = """
            prod:
                services:
                    hello_world: [ web_node, web_node ]
                    mongo: [ db_node ]

                node_provider:
                    class_name: AWSNodeProvider
                    public_api_key: AKIAIGBFGAGVPGKLVX4Q
                    private_api_key: NAOcwcX3an5hcyLCz3Y4xucwr4Fqxs9ijLn6biqk
            """

        aws_node_provider = AWSNodeProvider()
        error_list = []
        aws_node_provider.validate('prod', yaml.load(single_service_yaml)['prod']['node_provider'], error_list, all_credentials)
        self.assertEqual(len(error_list), 0)
    def test_should_add_error_if_public_api_key_is_empty(self):
        single_service_yaml = """
                prod:
                  nodes:
                    - ami_id: ami-4dad7424
                      size:   t1.micro
                      credentials_name: test
                      services: [mongo, hello_world]
                      type: phoenix.providers.aws_provider.AWSNodeDefinition

                  node_provider:
                    class_name: AWSNodeProvider
                    public_api_key:
                    private_api_key: NAOcwcX3an5hcyLCz3Y4xucwr4Fqxs9ijLn6biqk
            """
        aws_node_provider = AWSNodeProvider()
        error_list = []
        aws_node_provider.validate('prod', yaml.load(single_service_yaml)['prod']['node_provider'], error_list, all_credentials)
        self.assertEqual(len(error_list), 1)
        self.assertEqual("Key 'public_api_key' not defined for AWS in 'prod' environment", error_list[0])
    def test_should_add_error_if_private_api_key_contains_only_spaces(self):
        single_service_yaml = """
                prod:
                  nodes:
                    - ami_id: ami-4dad7424
                      size:   t1.micro
                      credentials_name: test
                      services: [mongo, hello_world]
                      type: phoenix.providers.aws_provider.AWSNodeDefinition

                  node_provider:
                    class_name: AWSNodeProvider
                    public_api_key: AKIAIGBFGAGVPGKLVX4Q
                    private_api_key:
                """
        aws_node_provider = AWSNodeProvider()
        error_list = []
        aws_node_provider.validate('prod', yaml.load(single_service_yaml)['prod']['node_provider'], error_list, all_credentials)
        self.assertEqual(len(error_list), 1)
        self.assertEqual("Key 'private_api_key' not defined for AWS in 'prod' environment", error_list[0])
    def test_should_return_a_list_of_nodes_with_same_location_from_a_running_environment(self):
        fake_boto_instance1 = mock()

        tags = {
            'services' : """
                'apache' :
                     80: 80""",
            'credentials_name': 'test',
            'env_name' : 'test',
            'env_def_name' : 'Single-AZ Deployment',
            }
        fake_boto_instance1.tags = tags
        stub_region = mock()
        stub_region.name = 'eu-west'
        fake_boto_instance1.region = stub_region
        fake_boto_instance1.image_id = '1234'
        fake_boto_instance1.id = 'id1234'
        fake_boto_instance1.public_dns_name = 'test_dns'
        fake_boto_instance1.instance_type = 'large'
        fake_boto_instance1.state = 'running'
        fake_boto_instance1.placement='us-east-1'
        fake_boto_instance2 = mock()

        tags = {
            'services' : """
                'mongo' :
                     81: 81""",
            'credentials_name': 'test',
            'env_name' : 'test',
            'env_def_name' : 'Single-AZ Deployment',
            }
        fake_boto_instance2.tags = tags
        stub_region1 = mock()
        stub_region1.name = 'eu-west'
        fake_boto_instance2.region = stub_region1
        fake_boto_instance2.image_id = '1234'
        fake_boto_instance2.id = 'id1235'
        fake_boto_instance2.public_dns_name = 'test_dns'
        fake_boto_instance2.instance_type = 'large'
        fake_boto_instance2.state = 'running'
        fake_boto_instance2.placement='us-east-1'
        mock_connection_provider = mock()
        when(mock_connection_provider).ec2_connection_for_region("eu-west-1", None, None).thenReturn(None)
        when(mock_connection_provider).get_all_boto_instances(None, None).thenReturn([fake_boto_instance1, fake_boto_instance2])

        provider = AWSNodeProvider(None, None, mock_connection_provider)

        environment = provider.get_running_environment("test", "Single-AZ Deployment", all_credentials)

        self.assertIsNotNone(environment)
        self.assertEquals(1, len(environment.get_locations()))
        self.assertIsNotNone(environment.get_locations()[0].get_nodes())
        self.assertEquals('eu-west', environment.get_locations()[0].get_name())
        self.assertEquals(2, len(environment.get_locations()[0].get_nodes()))
        node1 = environment.get_locations()[0].get_nodes()[0]
        self.assertIsNotNone(node1.get_services())
        self.assertEquals({'apache' : {80 : 80}}, node1.get_services())

        node2 = environment.get_locations()[0].get_nodes()[1]
        self.assertIsNotNone(node2.get_services())
        self.assertEquals({'mongo' : {81 : 81}}, node2.get_services())