def test_load_from_cache(impl):
    openstack.kv().get.return_value = cached_info = {
        "app_name": "app", "port": "80", "subnet": "subnet",
        "algorithm": "alg", "fip_net": "net", "manage_secgrps": False,
        "sg_id": None, "fip": "4.4.4.4", "address": "1.1.1.1", "members": []
    }
    lb = openstack.LoadBalancer.load_from_cached(cached_info)
    assert lb.name == "openstack-integrator-1234-app"
    assert lb.key == "created_lbs.openstack-integrator-1234-app"
    assert lb.app_name == "app"
    assert lb.port == "80"
    assert lb.subnet == "subnet"
    assert lb.algorithm == "alg"
    assert lb.fip_net == "net"
    assert lb.manage_secgrps is False
    assert lb.sg_id is None
    assert lb.fip == "4.4.4.4"
    assert lb.address == "1.1.1.1"
    assert lb.members == set()
    assert lb.is_created

    impl.get_port_sec_enabled.assert_called_once()
    impl.find_secgrp.assert_called_with(
        "openstack-integrator-1234-app-members")

    openstack.kv().get.reset_mock()
def test_delete_loadbalancer(impl, kv):
    kv().get.return_value = None
    lb = openstack.LoadBalancer('app', '80', 'subnet', 'alg', 'net', True)
    lb.delete()

    impl.get_port_sec_enabled.assert_called_once()
    impl.delete_loadbalancer.assert_called_once()
    openstack.kv().unset.assert_called_with(
        "created_lbs.openstack-integrator-1234-app")
def test_create_recover(impl):
    openstack.kv().get.return_value = None
    lb = openstack.LoadBalancer('app', '80', 'subnet', 'alg', 'net', True)
    impl.list_loadbalancers.return_value = [
        {'name': 'openstack-integrator-1234-app'}]
    impl.show_loadbalancer.return_value = {'id': '2345',
                                           'provisioning_status': 'ACTIVE',
                                           'vip_address': '1.1.1.1',
                                           'vip_port_id': '4321'}
    impl.find_secgrp.return_value = 'sg_id'
    impl.list_sg_rules.return_value = [{'Port Range': '', 'IP Range': ''}]
    impl.get_port_sec_enabled.return_value = False
    impl.list_listeners.return_value = [
        {'name': 'openstack-integrator-1234-app'}]
    impl.list_pools.return_value = [
        {'name': 'openstack-integrator-1234-app'}]
    impl.list_fips.return_value = [
        {'Fixed IP Address': '2.2.2.2', 'Floating IP Address': '3.3.3.3'},
        {'Fixed IP Address': '1.1.1.1', 'Floating IP Address': '4.4.4.4'},
    ]
    impl.list_members.return_value = ['members']
    lb.create()
    assert lb.sg_id is None
    assert lb.fip == '4.4.4.4'
    assert lb.address == '1.1.1.1'
    assert lb.members == ['members']
    assert lb.is_created
    assert not impl.create_loadbalancer.called
    assert not impl.create_secgrp.called
    assert not impl.create_listener.called
    assert not impl.create_pool.called
    assert not impl.create_fip.called
def test_create_new(impl, log_err):
    openstack.kv().get.return_value = None
    lb = openstack.LoadBalancer('app', '80', 'subnet', 'alg', None, False)
    assert not lb.is_created
    lb.name = 'name'
    impl.list_loadbalancers.return_value = []
    impl.create_loadbalancer.return_value = {
        'id': '1234',
        'vip_address': '1.1.1.1',
        'vip_port_id': '4321'
    }
    impl.show_loadbalancer.return_value = {'provisioning_status': 'ACTIVE'}
    impl.show_pool.return_value = {'provisioning_status': 'ACTIVE'}
    impl.find_secgrp.side_effect = ['sg_id', 'member_sg_id']
    impl.list_listeners.return_value = []
    impl.list_pools.return_value = []
    impl.list_members.return_value = [('member', '6443')]
    impl.list_sg_rules.return_value = []
    impl.get_port_sec_enabled.return_value = True
    impl.get_subnet_cidr.return_value = '1.1.1.1/32'
    impl.create_secgrp.return_value = 'member_sg_id'
    lb.create()
    assert lb.sg_id is None
    assert lb.member_sg_id == 'member_sg_id'
    assert lb.fip is None
    assert lb.address == '1.1.1.1'
    assert lb.members == [('member', '6443')]
    assert lb.is_created
    assert impl.create_loadbalancer.called
    assert not impl.create_secgrp.called
    assert not impl.set_port_secgrp.called
    assert impl.create_listener.called
    assert impl.create_pool.called
    assert not impl.list_fips.called
    assert not impl.create_fip.called

    impl.find_secgrp.side_effect = ['sg_id', None]
    lb.create()
    impl.create_secgrp.assert_called_with('name-members')

    impl.find_secgrp.side_effect = None
    impl.find_secgrp.return_value = None
    with pytest.raises(openstack.OpenStackLBError):
        lb.create()
    openstack.log_err.assert_called_with('Unable to find default '
                                         'security group')

    lb.fip_net = 'net'
    lb.manage_secgrps = True
    impl.create_secgrp.return_value = 'sg_id'
    impl.list_fips.return_value = []
    lb.create()
    assert lb.sg_id == 'sg_id'
    impl.create_secgrp.assert_has_calls(
        [mock.call('name'), mock.call('name-members')])
    impl.set_port_secgrp.assert_called_with('4321', 'sg_id')
    impl.create_fip.assert_called_with('1.1.1.1', '4321')