示例#1
0
def allocate_floating_task(floating=None):
    rc = create_rc_by_floating(floating)
    LOG.info("Begin to allocate floating, [%s]" % floating.id);
    pools = network.floating_ip_pools_list(rc)
    ext_net = filter(lambda n: n.name.lower() == \
                    floating.user_data_center.data_center.ext_net, pools)
    ext_net_id = None
    if ext_net and len(ext_net) > 0:
        ext_net_id = ext_net[0].id
    if ext_net_id: 
        try:
            fip = network.tenant_floating_ip_allocate(rc, pool=ext_net_id)
            floating.ip = fip.ip
            floating.status = FLOATING_AVAILABLE
            floating.uuid = fip.id
            floating.save()
            billing_task.charge_resource(floating.id, Floating)
            LOG.info("End to allocate floating, [%s][%s]" % (floating.id, fip.ip));
        except Exception as e:
            floating.status = FLOATING_ERROR
            floating.save()
            LOG.exception(e)
            LOG.info("End to allocate floating, [%s][exception]" % floating.id);
    else:
        floating.status = FLOATING_ERROR
        floating.save()
        LOG.info("End to allocate floating, [%s][---]" % floating.id);
示例#2
0
def floating_disassociate(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    LOG.info("floating action, [%s][disassociate][port:%s]" %
             (floating.id, floating.port_id))
    try:
        if floating.uuid and floating.port_id:
            network.floating_ip_disassociate(rc, floating.uuid,
                                             floating.port_id)

        if floating.resource_type == 'INSTANCE':
            ins = Instance.objects.get(pk=floating.resource)
            ins.public_ip = None
            ins.save()
        elif floating.resource_type == 'LOADBALANCER':
            pool = BalancerPool.objects.get(pk=floating.resource)
            vip = BalancerVIP.objects.get(pk=pool.vip.id)
            vip.public_address = None
            vip.save()
        #floating.instance = None
        floating.resource = None
        floating.resource_type = None
        floating.status = FLOATING_AVAILABLE
        floating.fixed_ip = None
        floating.port_id = None
        floating.save()
    except Exception as e:
        return False
示例#3
0
def floating_disassociate(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    LOG.info("floating action, [%s][disassociate][port:%s]" % (floating.id, floating.port_id));
    try:
        if floating.uuid and floating.port_id:
            network.floating_ip_disassociate(rc, floating.uuid, floating.port_id)

        if floating.resource_type == 'INSTANCE':
            ins = Instance.objects.get(pk=floating.resource)
            ins.public_ip = None
            ins.save()
        elif floating.resource_type == 'LOADBALANCER':
            pool = BalancerPool.objects.get(pk=floating.resource)
            vip = BalancerVIP.objects.get(pk=pool.vip.id)
            vip.public_address = None
            vip.save()
        #floating.instance = None
        floating.resource = None
        floating.resource_type = None
        floating.status = FLOATING_AVAILABLE
        floating.fixed_ip = None
        floating.port_id = None
        floating.save()
    except Exception as e:
        return False
示例#4
0
def floating_associate(floating, **kwargs):
    resource_type_dict = dict(RESOURCE_TYPE)
    resource_type = kwargs.get('resource_type')[0]
    resource = kwargs.get('resource')[0]
    if resource:
        rc = create_rc_by_floating(floating)
        ports = None
        resource_obj = None

        if resource_type_dict[str(resource_type)] == 'INSTANCE':
            ins = Instance.objects.get(pk=resource)
            resource_obj = ins
            if neutron.is_neutron_enabled(rc):
                ports = network.floating_ip_target_get_by_instance(rc, ins.uuid)
            else:
                ports = ins.uuid
        elif resource_type_dict[resource_type] == 'LOADBALANCER':
            pool = BalancerPool.objects.get(pk=resource)
            if not pool or not pool.vip:
                floating.status = FLOATING_AVAILABLE
                floating.save()
                return None
            resource_obj = pool
            ports = pool.vip.port_id+"_"+pool.vip.address

        if not ports:
            LOG.info("floating action, resourceType[%s],[%s][associate][ins:%s] ports is None" % (resource_type_dict[resource_type], floating.id, resource));
            floating.status = FLOATING_AVAILABLE
            floating.save()
            return

        LOG.info("floating action, [%s][associate][ins:%s][ports:%s]" % (
                            floating.id, resource, ports))
        try:
            network.floating_ip_associate(rc, floating.uuid, ports)
            if len(ports.split('_')) > 1:
                port, fixed_ip = ports.split('_')
            else:
                port, fixed_ip = ports, ports
            floating.resource = resource
            floating.resource_type = resource_type
            floating.status = FLOATING_BINDED
            floating.fixed_ip = fixed_ip
            floating.port_id = port
            floating.save()
            if resource_type_dict[str(resource_type)] == 'INSTANCE':
                resource_obj.public_ip = floating.ip
                resource_obj.save()
            elif resource_type_dict[resource_type] == 'LOADBALANCER':
                vip = BalancerVIP.objects.get(pk=resource_obj.vip.id)
                vip.public_address = floating.ip
                vip.save()
        except Exception as e:
            LOG.exception(e)
            floating.status = FLOATING_AVAILABLE
            floating.save()
    else:
        LOG.info("floating action, [%s][associate] no ins_id" % floating.id);
示例#5
0
def floating_release(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    result = True
    if floating.uuid:
        result = network.tenant_floating_ip_release(rc, floating.uuid)
    floating.status = FLOATING_RELEASED
    floating.deleted = 1
    floating.delete_date = datetime.datetime.now()
    floating.save()
    LOG.info("floating action, [%s][relese][%s]" % (floating.id, result));
示例#6
0
def floating_disassociate(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    LOG.info("floating action, [%s][disassociate][port:%s]" % (floating.id, floating.port_id))
    if floating.uuid and floating.port_id:
        network.floating_ip_disassociate(rc, floating.uuid, floating.port_id)
    floating.instance = None
    floating.status = FLOATING_AVAILABLE
    floating.fixed_ip = None
    floating.port_id = None
    floating.save()
示例#7
0
def floating_disassociate(floating, **kwargs):
    LOG.info("Begin to disassociate floating [%s]", floating)
    try:
        if floating.uuid and floating.port_id:
            rc = create_rc_by_floating(floating)
            network.floating_ip_disassociate(rc, floating.uuid,
                                             floating.port_id)
    except Exception:
        LOG.exception("Failed to disassociate floating[%s]", floating)
        floating.status = FLOATING_BINDED
        floating.save()
        return False
    else:
        floating.unbind_resource()
        LOG.info("Floating IP[%s] is disassociated.", floating)
        return True
示例#8
0
def floating_release(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    result = True
    if floating.uuid:
        result = network.tenant_floating_ip_release(rc, floating.uuid)
        LOG.info("release floating associate instance, [%s]" % result)

    floating.status = FLOATING_RELEASED
    floating.deleted = 1
    floating.delete_date = datetime.datetime.now()
    floating.save()

    if floating.ip:
        ins = Instance.objects.filter(public_ip=floating.ip)
        ins.update(public_ip=None)

    LOG.info("floating action, [%s][relese][%s]" % (floating.id, result))
示例#9
0
def floating_release(floating, **kwargs):
    rc = create_rc_by_floating(floating)
    result = True
    if floating.uuid:
        result = network.tenant_floating_ip_release(rc, floating.uuid)
        LOG.info("release floating associate instance, [%s]" % result)
    
    floating.status = FLOATING_RELEASED
    floating.deleted = 1
    floating.delete_date = datetime.datetime.now()
    floating.save()

    if floating.ip:
        ins = Instance.objects.filter(public_ip=floating.ip)
        ins.update(public_ip=None)

    LOG.info("floating action, [%s][relese][%s]" % (floating.id, result));
示例#10
0
def floating_associate(floating, **kwargs):
    ins_id = kwargs.get("instance_id")[0]
    if ins_id:
        rc = create_rc_by_floating(floating)
        ins = Instance.objects.get(pk=ins_id)
        ports = network.floating_ip_target_get_by_instance(rc, ins.uuid)
        if not ports:
            LOG.info("floating action, [%s][associate][ins:%s] ports is None" % (floating.id, ins_id))
            floating.status = FLOATING_AVAILABLE
            floating.save()
            return
        LOG.info("floating action, [%s][associate][ins:%s][ports:%s]" % (floating.id, ins.id, ports))
        network.floating_ip_associate(rc, floating.uuid, ports)
        port, fixed_ip = ports.split("_")
        floating.instance = ins
        floating.status = FLOATING_BINDED
        floating.fixed_ip = fixed_ip
        floating.port_id = port
        floating.save()
    else:
        LOG.info("floating action, [%s][associate] no ins_id" % floating.id)
示例#11
0
def allocate_floating_task(floating=None):
    rc = create_rc_by_floating(floating)
    LOG.info("Begin to allocate floating, [%s]" % floating.id);
    search_opts = {'router:external': True}
    networks = neutron.network_list(rc, **search_opts)
    ext_net = filter(lambda n: n.name.lower() == floating.user_data_center.data_center.ext_net, networks)
    ext_net_id = None
    if ext_net and len(ext_net) > 0:
        ext_net_id = ext_net[0].id
    if ext_net_id: 
        try:
            fip = network.tenant_floating_ip_allocate(rc, pool=ext_net_id)
            floating.ip = fip.ip
            floating.status = FLOATING_AVAILABLE
            floating.uuid = fip.id
            floating.save();
            LOG.info("End to allocate floating, [%s][%s]" % (floating.id, fip.ip));
        except Exception as e:
            floating.status = FLOATING_ERROR
            floating.save();
            LOG.exception(e);
            LOG.info("End to allocate floating, [%s][exception]" % floating.id);
    else:
        LOG.info("End to allocate floating, [%s][---]" % floating.id);
示例#12
0
def floating_associate(floating, **kwargs):
    resource_type_dict = dict(RESOURCE_TYPE)
    resource_type = kwargs.get('resource_type')[0]
    resource = kwargs.get('resource')[0]
    if resource:
        rc = create_rc_by_floating(floating)
        ports = None
        resource_obj = None

        if resource_type_dict[str(resource_type)] == 'INSTANCE':
            ins = Instance.objects.get(pk=resource)
            resource_obj = ins
            if neutron.is_neutron_enabled(rc):
                ports = network.floating_ip_target_get_by_instance(rc, ins.uuid)
            else:
                ports = ins.uuid
        elif resource_type_dict[resource_type] == 'LOADBALANCER':
            pool = BalancerPool.objects.get(pk=resource)
            if not pool or not pool.vip:
                floating.status = FLOATING_AVAILABLE
                floating.save()
                return None
            resource_obj = pool
            ports = pool.vip.port_id+"_"+pool.vip.address

        if not ports:
            LOG.info("floating action, resourceType[%s],[%s][associate][ins:%s] ports is None" % (resource_type_dict[resource_type], floating.id, resource));
            floating.status = FLOATING_AVAILABLE
            floating.resource = None
            floating.resource_type = None
            floating.save()
            return

        LOG.info("floating action, [%s][associate][ins:%s][ports:%s]" % (
                            floating.id, resource, ports))
        try:
            network.floating_ip_associate(rc, floating.uuid, ports)
            if len(ports.split('_')) > 1:
                port, fixed_ip = ports.split('_')
            else:
                port, fixed_ip = ports, ports
            floating.resource = resource
            floating.resource_type = resource_type
            floating.status = FLOATING_BINDED
            floating.fixed_ip = fixed_ip
            floating.port_id = port
            floating.save()
            if resource_type_dict[str(resource_type)] == 'INSTANCE':
                resource_obj.public_ip = floating.ip
                resource_obj.save()
            elif resource_type_dict[resource_type] == 'LOADBALANCER':
                vip = BalancerVIP.objects.get(pk=resource_obj.vip.id)
                vip.public_address = floating.ip
                vip.save()
        except Exception as e:
            LOG.exception(e)
            floating.status = FLOATING_AVAILABLE
            floating.resource = None
            floating.resource_type = None
            floating.save()
    else:
        LOG.info("floating action, [%s][associate] no ins_id" % floating.id);