def test_servers_to_create(self):
        apply_resources = ApplyResources()
        with mock.patch.multiple(apply_resources,
                                 get_nova_client=mock.DEFAULT,
                                 read_resources=mock.DEFAULT) as mocks:
            get_nova_client = mocks['get_nova_client']
            read_resources = mocks['read_resources']
            read_resources.return_value = {
                'foo': {
                    'number': 1
                },
                'bar': {
                    'number': 2
                }
            }

            nova_client = get_nova_client.return_value
            self.fake_server_data(nova_client)

            self.assertEquals(apply_resources.servers_to_create('fake_path'),
                              [{
                                  'name': 'foo1'
                              }, {
                                  'name': 'bar1'
                              }])
 def test_generate_desired_servers(self):
     apply_resources = ApplyResources()
     self.assertEquals(apply_resources.generate_desired_servers({'foo': {'number': 5 }}, project_tag='foo'),
                       [{'name': 'foo1_foo'},
                        {'name': 'foo2_foo'},
                        {'name': 'foo3_foo'},
                        {'name': 'foo4_foo'},
                        {'name': 'foo5_foo'},
                       ])
     self.assertEquals(apply_resources.generate_desired_servers({'foo': {'number': 5,
                                                                         'network': 'public'},
                                                                 'bar': {'number': 2,
                                                                         'network': 'private',
                                                                         'other': 'something'}},
                                                                 mappings={'network': {'private': 'mappedprivate'}},
                                                                 project_tag='foo'),
                       [{'name': 'foo1_foo', 'network': 'public'},
                        {'name': 'foo2_foo', 'network': 'public'},
                        {'name': 'foo3_foo', 'network': 'public'},
                        {'name': 'foo4_foo', 'network': 'public'},
                        {'name': 'foo5_foo', 'network': 'public'},
                        {'name': 'bar1_foo', 'network': 'mappedprivate', 'other': 'something'},
                        {'name': 'bar2_foo', 'network': 'mappedprivate', 'other': 'something'},
                        ])
     self.assertEquals(apply_resources.generate_desired_servers({'foo': {'number': 0},
                                                                 'bar': {'number': 2}}),
                       [{'name': 'bar1'},
                        {'name': 'bar2'}])
     self.assertEquals(apply_resources.generate_desired_servers({'foo': {'number': 0},
                                                                 'bar': {'number': 2}},
                                                                number_overrides={'bar': 4}),
                       [{'name': 'bar1'},
                        {'name': 'bar2'},
                        {'name': 'bar3'},
                        {'name': 'bar4'}])
    def test_create_servers(self):
        apply_resources = ApplyResources()
        with nested(
               mock.patch('__builtin__.file'),
               mock.patch('time.sleep'),
               mock.patch.object(apply_resources, 'create_server'),
               mock.patch.object(apply_resources, 'get_nova_client')
            ) as (file_mock, sleep, create_server, get_nova_client):
            ids = [10,11,12]
            status = {10: ['ACTIVE', 'BUILD', 'BUILD'], 11: ['ACTIVE', 'BUILD'], 12: ['ACTIVE', 'BUILD']}

            servers = {}
            def fake_create_server(*args, **kwargs):
                server_id = ids.pop()
                servers[kwargs['name']] = server_id
                return server_id

            create_server.side_effect = fake_create_server
            self.add_floating_ip_called = False

            def server_get(id):
                mm = mock.MagicMock()
                if status[id]:
                    mm.status = status[id].pop()
                    mm.add_floating_ip.side_effect = Exception
                else:
                    def add_floating_ip(ip):
                        self.assertEquals(ip, '1.2.3.4')
                        self.add_floating_ip_called = True

                    mm.add_floating_ip.side_effect = add_floating_ip
                return mm

            get_nova_client.return_value.servers.get.side_effect = server_get
            get_nova_client.return_value.floating_ips.create.return_value.ip = '1.2.3.4'

            file_mock.side_effect = lambda f: StringIO.StringIO('test user data')

            apply_resources.create_servers([{'name': 'foo1', 'networks':  ['someid']},
                                            {'name': 'foo2', 'networks':  ['someid']},
                                            {'name': 'foo3', 'assign_floating_ip': True}
                                            ], 'somefile', 'somekey',0)

            create_server.assert_any_call(mock.ANY, 'somekey', retry=0, name='foo1', networks=['someid'])
            create_server.assert_any_call(mock.ANY, 'somekey', retry=0, name='foo2', networks=['someid'])
            create_server.assert_any_call(mock.ANY, 'somekey', retry=0, name='foo3', assign_floating_ip=True)

            for call in create_server.call_args_list:
                self.assertEquals(call[0][0].read(), 'test user data')

            for s in status.values():
                self.assertEquals(s, [], 'create_servers stopped polling before server left BUILD state')
            self.assertTrue(self.add_floating_ip_called)
    def test_servers_to_create(self):
        apply_resources = ApplyResources()
        with mock.patch.multiple(apply_resources,
                                 get_nova_client=mock.DEFAULT,
                                 read_resources=mock.DEFAULT) as mocks:
            get_nova_client = mocks['get_nova_client']
            read_resources = mocks['read_resources']
            read_resources.return_value = {'foo': {'number': 1},
                                           'bar': {'number': 2}}

            nova_client = get_nova_client.return_value
            self.fake_server_data(nova_client)

            self.assertEquals(apply_resources.servers_to_create('fake_path'),
                              [{'name': 'foo1'},
                               {'name': 'bar1'}])
 def test_get_existing_servers(self):
     apply_resources = ApplyResources()
     with mock.patch.object(apply_resources, 'get_nova_client') as get_nova_client:
         nova_client = get_nova_client.return_value
         self.fake_server_data(nova_client)
         self.assertEquals(apply_resources.get_existing_servers(), [s[0] for s in self.server_data])
         self.assertEquals(apply_resources.get_existing_servers(project_tag='abc123'),
                           ['foo1_abc123'])
         self.assertEquals(apply_resources.get_existing_servers(project_tag='abc124'),
                           ['foo2_abc124'])
         self.assertEquals(apply_resources.get_existing_servers(project_tag='bc124'),
                           ['foo4_bc124'])
         self.assertEquals(apply_resources.get_existing_servers(project_tag='bc124', attr_name='id'),
                           ['677388b7-b5ac-418b-b671-6b930dc8003a'])
 def test_get_existing_servers(self):
     apply_resources = ApplyResources()
     with mock.patch.object(apply_resources,
                            'get_nova_client') as get_nova_client:
         nova_client = get_nova_client.return_value
         self.fake_server_data(nova_client)
         self.assertEquals(apply_resources.get_existing_servers(),
                           [s[0] for s in self.server_data])
         self.assertEquals(
             apply_resources.get_existing_servers(project_tag='abc123'),
             ['foo1_abc123'])
         self.assertEquals(
             apply_resources.get_existing_servers(project_tag='abc124'),
             ['foo2_abc124'])
         self.assertEquals(
             apply_resources.get_existing_servers(project_tag='bc124'),
             ['foo4_bc124'])
         self.assertEquals(
             apply_resources.get_existing_servers(project_tag='bc124',
                                                  attr_name='id'),
             ['677388b7-b5ac-418b-b671-6b930dc8003a'])
 def test_generate_desired_servers(self):
     apply_resources = ApplyResources()
     self.assertEquals(
         apply_resources.generate_desired_servers({'foo': {
             'number': 5
         }},
                                                  project_tag='foo'), [
                                                      {
                                                          'name': 'foo1_foo'
                                                      },
                                                      {
                                                          'name': 'foo2_foo'
                                                      },
                                                      {
                                                          'name': 'foo3_foo'
                                                      },
                                                      {
                                                          'name': 'foo4_foo'
                                                      },
                                                      {
                                                          'name': 'foo5_foo'
                                                      },
                                                  ])
     self.assertEquals(
         apply_resources.generate_desired_servers(
             {
                 'foo': {
                     'number': 5,
                     'network': 'public'
                 },
                 'bar': {
                     'number': 2,
                     'network': 'private',
                     'other': 'something'
                 }
             },
             mappings={'network': {
                 'private': 'mappedprivate'
             }},
             project_tag='foo'), [
                 {
                     'name': 'foo1_foo',
                     'network': 'public'
                 },
                 {
                     'name': 'foo2_foo',
                     'network': 'public'
                 },
                 {
                     'name': 'foo3_foo',
                     'network': 'public'
                 },
                 {
                     'name': 'foo4_foo',
                     'network': 'public'
                 },
                 {
                     'name': 'foo5_foo',
                     'network': 'public'
                 },
                 {
                     'name': 'bar1_foo',
                     'network': 'mappedprivate',
                     'other': 'something'
                 },
                 {
                     'name': 'bar2_foo',
                     'network': 'mappedprivate',
                     'other': 'something'
                 },
             ])
     self.assertEquals(
         apply_resources.generate_desired_servers({
             'foo': {
                 'number': 0
             },
             'bar': {
                 'number': 2
             }
         }), [{
             'name': 'bar1'
         }, {
             'name': 'bar2'
         }])
     self.assertEquals(
         apply_resources.generate_desired_servers(
             {
                 'foo': {
                     'number': 0
                 },
                 'bar': {
                     'number': 2
                 }
             },
             number_overrides={'bar': 4}), [{
                 'name': 'bar1'
             }, {
                 'name': 'bar2'
             }, {
                 'name': 'bar3'
             }, {
                 'name': 'bar4'
             }])
    def test_create_servers(self):
        apply_resources = ApplyResources()
        with nested(mock.patch('__builtin__.file'), mock.patch('time.sleep'),
                    mock.patch.object(apply_resources, 'create_server'),
                    mock.patch.object(apply_resources,
                                      'get_nova_client')) as (file_mock, sleep,
                                                              create_server,
                                                              get_nova_client):
            ids = [10, 11, 12]
            status = {
                10: ['ACTIVE', 'BUILD', 'BUILD'],
                11: ['ACTIVE', 'BUILD'],
                12: ['ACTIVE', 'BUILD']
            }

            servers = {}

            def fake_create_server(*args, **kwargs):
                server_id = ids.pop()
                servers[kwargs['name']] = server_id
                return server_id

            create_server.side_effect = fake_create_server
            self.add_floating_ip_called = False

            def server_get(id):
                mm = mock.MagicMock()
                if status[id]:
                    mm.status = status[id].pop()
                    mm.add_floating_ip.side_effect = Exception
                else:

                    def add_floating_ip(ip):
                        self.assertEquals(ip, '1.2.3.4')
                        self.add_floating_ip_called = True

                    mm.add_floating_ip.side_effect = add_floating_ip
                return mm

            get_nova_client.return_value.servers.get.side_effect = server_get
            get_nova_client.return_value.floating_ips.create.return_value.ip = '1.2.3.4'

            file_mock.side_effect = lambda f: StringIO.StringIO(
                'test user data')

            apply_resources.create_servers([{
                'name': 'foo1',
                'networks': ['someid']
            }, {
                'name': 'foo2',
                'networks': ['someid']
            }, {
                'name': 'foo3',
                'assign_floating_ip': True
            }], 'somefile', 'somekey', 0)

            create_server.assert_any_call(mock.ANY,
                                          'somekey',
                                          retry=0,
                                          name='foo1',
                                          networks=['someid'])
            create_server.assert_any_call(mock.ANY,
                                          'somekey',
                                          retry=0,
                                          name='foo2',
                                          networks=['someid'])
            create_server.assert_any_call(mock.ANY,
                                          'somekey',
                                          retry=0,
                                          name='foo3',
                                          assign_floating_ip=True)

            for call in create_server.call_args_list:
                self.assertEquals(call[0][0].read(), 'test user data')

            for s in status.values():
                self.assertEquals(
                    s, [],
                    'create_servers stopped polling before server left BUILD state'
                )
            self.assertTrue(self.add_floating_ip_called)