Esempio n. 1
0
def detach_network_from_router(network_id):

    network = Network.objects.get(pk=network_id)
    subnet = network.subnet_set.filter(deleted=False)[0]
    rc = create_rc_by_network(network)
    interface_set = RouterInterface.objects.filter(network_id=network.id,
                                                   subnet=subnet, deleted=False)

    LOG.info("Start to detach network[%s]", network.name)

    try:
        for router_interface in interface_set:

            LOG.info("Start to delete router interface, router:[%s], "
                     "subnet[%s], id:[%s], port_id:[%s]",
                     router_interface.router.name, router_interface.subnet.name,
                     router_interface.id, router_interface.os_port_id)
            neutron.router_remove_interface(rc,
                                            router_interface.router.router_id,
                                            subnet.subnet_id,
                                            router_interface.os_port_id)

            router_interface.fake_delete()
    except Exception as e:
        LOG.exception("Failed to delete router interface, router:[%s], "
                      "subnet[%s], id:[%s], port_id:[%s], exception:%s",
                      router_interface.router.name,
                      router_interface.subnet.name,
                      router_interface.id, router_interface.os_port_id, e)
        network.change_status(NETWORK_STATE_ERROR)
        raise e
    else:
        network.change_status(NETWORK_STATE_ACTIVE)
Esempio n. 2
0
def create_network(network):
    rc = create_rc_by_network(network)
    network_params = {'name': "network-%s" % network.id, "admin_state_up": True}
    LOG.info("Start to create network, id:[%s], name[%s]",
             network.id, network.name)
    begin = datetime.datetime.now()
    try:
        net = neutron.network_create(rc, **network_params)
        end = datetime.datetime.now()
        LOG.info("Create network api apply [%s] seconds", \
                    (end-begin).seconds) 
        network.network_id = net.id
        network.status = NETWORK_STATE_ACTIVE
        network.save()
    except Exception as ex:
        end = datetime.datetime.now()
        LOG.info("Create network api apply [%s] seconds", \
                            (end-begin).seconds) 
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.exception("Failed to create network, id:[%s], name[%s], "
                      "exception:[%s]",
                      network.id, network.name, ex)
        raise ex

    return network
Esempio n. 3
0
def network_and_subnet_create_task(network,subnet):
    rc = create_rc_by_network(network)
    LOG.info("Begin create network,id[%s], name[%s]" % (network.id, network.name))
    try:
        net = network_create_task(network)
        LOG.info("Begin create subnet,id[%s], name[%s]" % (subnet.id, subnet.name))
        subnet_create_task(subnet)
    except Exception as e:
        raise e
Esempio n. 4
0
def network_delete_task(network=None):
    rc = create_rc_by_network(network)
    LOG.info("delete network,id:[%s],name[%s]" % (network.id, network.name))
    try:
        net = neutron.network_delete(rc, network.network_id)
        network.network_id = None
        network.deleted = True
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.info("delete network error,id:[%s],name[%s]" % (network.id, network.name))
        raise ex

    return network
Esempio n. 5
0
def network_create_task(network):
    rc = create_rc_by_network(network)
    network_params = {'name': "network-%s" % network.id, "admin_state_up": True}
    LOG.info("start create network,id:[%s],name[%s]" % (network.id, network.name))
    try:
        net = neutron.network_create(rc, **network_params)
        network.network_id = net.id
        network.status = NETWORK_STATE_ACTIVE
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.info("create network error,id:[%s],name[%s],msg:[%s]" % (network.id, network.name, ex))
        raise ex

    return network
Esempio n. 6
0
def create_network(network):
    rc = create_rc_by_network(network)
    network_params = {'name': "network-%s" % network.id, "admin_state_up": True}
    LOG.info("Start to create network, id:[%s], name[%s]",
             network.id, network.name)
    try:
        net = neutron.network_create(rc, **network_params)

        network.network_id = net.id
        network.status = NETWORK_STATE_ACTIVE
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.exception("Failed to create network, id:[%s], name[%s], "
                      "exception:[%s]",
                      network.id, network.name, ex)
        raise ex

    return network
Esempio n. 7
0
def network_delete_task(network):
    rc = create_rc_by_network(network)
    LOG.info("delete network,id:[%s],name[%s]" % (network.id, network.name))
    try:
        # delete all subnet
        LOG.info("delete all subnet, network id [%s] name[%s]" % (network.id, network.name))
        subnet_set = Subnet.objects.filter(network_id=network.id, deleted=False)
        for subnet in subnet_set:
            subnet_delete_task(subnet)
        # delete network
        net = neutron.network_delete(rc, network.network_id)
        network.network_id = None
        network.deleted = True
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.info("delete network error,id:[%s],name[%s],msg:[%s]" % (network.id, network.name, ex))
        raise ex

    return network
Esempio n. 8
0
def delete_network(network):
    rc = create_rc_by_network(network)
    LOG.info("Start to delete network, id:[%s], name[%s]",
             network.id, network.name)
    try:

        subnet_set = Subnet.objects.filter(network_id=network.id, deleted=False)
        for subnet in subnet_set:
            delete_subnet(subnet)

        neutron.network_delete(rc, network.network_id)

        network.network_id = None
        network.deleted = True
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.exception("Failed to delete network, id:[%s], name[%s], msg:[%s]",
                      network.id, network.name, ex)
        raise ex

    return network
Esempio n. 9
0
def create_network(network):
    rc = create_rc_by_network(network)
    network_params = {
        'name': "network-%s" % network.id,
        "admin_state_up": True
    }
    LOG.info("Start to create network, id:[%s], name[%s]", network.id,
             network.name)
    try:
        net = neutron.network_create(rc, **network_params)

        network.network_id = net.id
        network.status = NETWORK_STATE_ACTIVE
        network.save()
    except Exception as ex:
        network.status = NETWORK_STATE_ERROR
        network.save()
        LOG.exception(
            "Failed to create network, id:[%s], name[%s], "
            "exception:[%s]", network.id, network.name, ex)
        raise ex

    return network
Esempio n. 10
0
def make_sure_default_private_network(instance):
    network = None
    try:
        network = Network.objects.get(pk=instance.network_id)
    except Network.DoesNotExist:
        pass

    default_private_networks = Network.objects.filter(deleted=False,
        is_default=True, status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
        user=instance.user, user_data_center=instance.user_data_center)
    
    if not default_private_networks.exists():
        sleeping = random.uniform(0.4, 5.5)
        time.sleep(sleeping)
        LOG.info("No default network [%s][%s], sleep [%s] seconds",
                instance.user_data_center.tenant_name, instance.name, sleeping)


        default_private_networks = Network.objects.filter(deleted=False,
            is_default=True, status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
            user=instance.user, user_data_center=instance.user_data_center)

        if not default_private_networks.exists(): 
            LOG.info("Double check no default network [%s][%s].",
                    instance.user_data_center.tenant_name, instance.name)
            begin = datetime.datetime.now()
            default_private_network = Network.objects.create(
                name=settings.DEFAULT_NETWORK_NAME, status=NETWORK_STATE_BUILD,
                is_default=True, user=instance.user,
                user_data_center=instance.user_data_center)

            address = None
            for i in xrange(255):
                tmp_address = "172.31.%s.0/24" % i
                if not Subnet.objects.filter(user=instance.user,
                            deleted=False, address=tmp_address,
                            user_data_center=instance.user_data_center).exists():
                    address = tmp_address
                    break
            if not address:
                address = "172.30.0.0/24"
            default_private_subnet = Subnet.objects.create(
                name=settings.DEFAULT_SUBNET_NAME, network=default_private_network,
                address=address, ip_version=4, status=0, user=instance.user,
                user_data_center=instance.user_data_center)

            default_router = Router.objects.create(
                name=settings.DEFAULT_ROUTER_NAME, status=0, is_default=True,
                is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                user_data_center=instance.user_data_center)

            end = datetime.datetime.now()
            LOG.info("Create network db record apply [%s] seconds.",
                            (end-begin).seconds) 

            begin = datetime.datetime.now()
            create_network(default_private_network)
            create_subnet(default_private_subnet)
            router_create_task(default_router)
            attach_network_to_router(default_private_network.id,
                        default_router.id, default_private_subnet.id)
            end = datetime.datetime.now()
            LOG.info("Prepare private network api apply [%s] seconds.",
                            (end-begin).seconds) 
        else:
            LOG.info("Double check instance has default network [%s].", instance.name)
            default_private_network = default_private_networks[0]
    else:
        default_private_network = default_private_networks[0]
        LOG.info("Instance has default network, [%s][%s].",
                    instance, default_private_network)

    if not network:
        network = default_private_network
    
    count = 1
    while True:
        if count > settings.MAX_COUNT_SYNC:
            LOG.info("Network not active, instance:[%s] netowk:[%s]." %(
                        instance.name, network.name))
            break

        count = count + 1
        rc = create_rc_by_network(network)
        try:
            network = Network.objects.get(pk=network.id)
            if not network.network_id:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue

            net = neutron.network_get(rc, network.network_id)
            if net.status.upper() not in ["ACTIVE", ]:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue 

            if net.subnets:
                break
            else:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND) 
        except:
            time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND) 

    return network
Esempio n. 11
0
def make_sure_default_private_network(instance, rc, user_tenant_uuid):
    network = None
    try:
        network = Network.objects.get(pk=instance.network_id)
    except Network.DoesNotExist:
        LOG.info("network not exist")
        pass

    default_private_network = None
    default_private_subnet = None
    default_router = None

    # Try to get default network
    default_private_networks = Network.objects.filter(deleted=False,
        is_default=True, status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
        user=instance.user, user_data_center=instance.user_data_center)
    
    if not default_private_networks.exists():
        LOG.info("*** default private network not exists in initcloud. Going to confirm if it exists in neutron***")
        sleeping = random.uniform(0.4, 5.5)
        time.sleep(sleeping)
        LOG.info("No default network [%s][%s], sleep [%s] seconds",
                instance.user_data_center.tenant_name, instance.name, sleeping)


        default_private_networks = Network.objects.filter(deleted=False,
            is_default=True, status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
            user=instance.user, user_data_center=instance.user_data_center)

        # No default network exists, create a new one.
        if not default_private_networks.exists(): 

            LOG.info("*** no default network in initcloud. GOing to confirm if it exists in neutron ***")
            LOG.info("*** vlan enabled or not ***" + str(settings.VLAN_ENABLED))
            if settings.VLAN_ENABLED == True:
                LOG.info("*** vlan enabled ***")
                LOG.info("Double check no default vlan network [%s][%s].",
                        instance.user_data_center.tenant_name, instance.name)
                begin = datetime.datetime.now()
                network_ = neutron.network_list_for_tenant(rc, tenant_id=user_tenant_uuid)
                LOG.info("********** network is ******************" + str(network_))
                network_id = None
                network_name = None
                network_status = None
                subnet_id = None
                subnet_name = None
                subnet_addr = None
                for net in network_:
                    LOG.info("***** net is *******" + str(net))
                    network_id = net.id
                    network_name = net.name
                    network_status = net.admin_state_up
                    subnet = net.subnets
                    for s in subnet:
                        subnet_name = s.name
                        subnet_id = s.id
                        subnet_addr = s.cidr
                LOG.info("********* network_id is *********" + str(network_id))
                LOG.info("********* network_name is *********" + str(network_name))
                LOG.info("********* network_status is *********" + str(network_status))
                LOG.info("********* subnet_id is *********" + str(subnet_id))
                LOG.info("********* subnet_name is *********" + str(subnet_name))
                LOG.info("********* subnet_addr is *********" + str(subnet_addr))
                # Create Default network to initcloud
                default_private_network = Network.objects.create(
                    name=network_name, network_id=network_id, status=network_status,
                    is_default=True, user=instance.user,
                    user_data_center=instance.user_data_center)

                LOG.info("*** default private network create success ***")
                address = None
                for i in xrange(255):
                    tmp_address = settings.TENANT_DEFAULT_NETWORK
                    if not Subnet.objects.filter(user=instance.user,
                                deleted=False, address=tmp_address,
                                user_data_center=instance.user_data_center).exists():
                        address = tmp_address
                        break
                if not address:
                    address = settings.TENANT_DEFAULT_NETWORK 
                # Create default private subnet to initcloud
                default_private_subnet = Subnet.objects.create(
                    name=subnet_name, network=default_private_network,
                    address=subnet_addr, ip_version=4, status=0, user=instance.user,
                    user_data_center=instance.user_data_center)

                LOG.info("*** default_private_subnet create success ***")

                end = datetime.datetime.now()
                LOG.info("Create vlan network db record apply [%s] seconds.",
                              (end-begin).seconds) 

            # User has not default network for vxlan.
            if settings.VLAN_ENABLED == False:

                LOG.info("*** vxlan mode is enabled ***")
                # Start check if network exists in neutron.

                network_ = neutron.network_list_for_tenant(rc, tenant_id=user_tenant_uuid)
                LOG.info("********** network is ******************" + str(network_))
                network_id = None
                network_name = None
                network_status = None
                subnet_id = None
                subnet_name = None
                subnet_addr = None
                for net in network_:
                    LOG.info("***** net is *******" + str(net))
                    network_id = net.id
                    network_name = net.name
                    network_status = net.admin_state_up
                    subnet = net.subnets
                    for s in subnet:
                        subnet_name = s.name
                        subnet_id = s.id
                        subnet_addr = s.cidr

                begin = datetime.datetime.now()
                LOG.info("********* network_status is *********" + str(network_status))

                # User has network in neutron
                if network_name and network_id:
                    LOG.info("*** vxlan user has network in neutron ***")
                    default_private_network = Network.objects.create(
                        name=network_name, network_id=network_id, status=network_status,
                        is_default=True, user=instance.user,
                        user_data_center=instance.user_data_center)

                    # If network exists, check subnet exists or not.
                   
                    # If subnet exists, store data in initcloud.
                    if subnet_id and subnet_name:

                        LOG.info("*** vxlan user has subnet in neutron ***")
                        address = None
                        for i in xrange(255):
                            tmp_address = settings.TENANT_DEFAULT_NETWORK
                            if not Subnet.objects.filter(user=instance.user,
                                        deleted=False, address=tmp_address,
                                        user_data_center=instance.user_data_center).exists():
                                address = tmp_address
                                break
                        if not address:
                            address = settings.TENANT_DEFAULT_NETWORK
                        # Create default private subnet to initcloud
                        default_private_subnet = Subnet.objects.create(
                            name=subnet_name, network=default_private_network, subnet_id=subnet_id,
                            address=subnet_addr, ip_version=4, status=1, user=instance.user,
                            user_data_center=instance.user_data_center)

                        # Check if router exists.

                        neutron_subnets = neutron.subnet_list(rc, network_id=network_id)
                        for n in neutron_subnets:
                            LOG.info("*** n is ***" + str(n))
                        routers = neutron.router_list(rc, tenant_id=user_tenant_uuid)

                        neutron_subnet_id = None
                        neutron_router_id = None
                        neutron_router_name = None
                        external_gateway_info = None
                        external_fixed_ips = None
                        is_router = False
                        gateway_ip = None
                        for r in routers:
                            is_router = True
                            neutron_router_id = r.id
                            neutron_router_name = r.name
                            LOG.info("*** router is ***" + str(r))
                            external_gateway_info = r.external_gateway_info
                            LOG.info("*** external_gateway_info is ***" + str(external_gateway_info))
                            if external_gateway_info:
                                external_fixed_ips = external_gateway_info['external_fixed_ips']
                                if external_fixed_ips:
                                    for fip in external_fixed_ips:
                                        neutron_subnet_id = fip['subnet_id']
                                        gateway_ip = fip['ip_address']

                        ports = neutron.port_list(rc, network_id=network_id)
                        p_network_id = None
                        p_subnet_id = None
                        p_fixed_ips = None
                        os_port_id = None
                        for p in ports:
                            LOG.info("*** p is ***" + str(p))
                            os_port_id = p.id
                            if p.device_owner == "network:router_interface":
                                p_network_id = p.network_id
                                p_fixed_ips = p.fixed_ips
                                for f in p_fixed_ips:
                                    p_subnet_id = f['subnet_id'] 
                        LOG.info("*** gateway_ip is ***" + str(gateway_ip))
                        LOG.info("*** neutron_subnet_id is ***" + str(neutron_subnet_id))
                        LOG.info("*** subnet_id is ***" + str(subnet_id))

                        LOG.info("external_gateway_info is" + str(external_gateway_info))
                        LOG.info("external_fixed_ips is " + str(external_fixed_ips))
                        # router exists
                        if is_router and str(p_subnet_id) == str(subnet_id):
                            LOG.info("*** vxlan user has router exists ***")
                            # external_gateway exists
                            if external_gateway_info:
                                # external_fixed_ips exists, save router info to initcloud
                                if external_fixed_ips:
                                    LOG.info("***** ****************************** ***********")
                                    LOG.info("*** neutron_router_name ***" + str(neutron_router_name))
                                    LOG.info("*** neutron_router_id ***" + str(neutron_router_id))
                                    LOG.info("*** gateway_ip ***" + str(gateway_ip))
                                    default_router = Router.objects.create(
                                        name=str(neutron_router_name), status=1, 
                                        is_default=True,router_id=str(neutron_router_id), gateway=str(gateway_ip),
                                        is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                                        user_data_center=instance.user_data_center)
                                    LOG.info("*** router create success ***")

                                    RouterInterface.objects.create(
                                    network_id=default_private_network.id, router_id=default_router.id, 
                                    subnet_id=default_private_subnet.id,
                                    user=instance.user, user_data_center=instance.user_data_center,
                                    os_port_id=str(os_port_id))

                                # external_fixed_ips does not exist
                                else:
                                    router_add_interface(rc, router_id=neutron_router_id, subnet_id=neutron_subnet_id)
                                    default_router = Router.objects.create(
                                        name=str(neutron_router_name), status=1,
                                        is_default=True,router_id=str(neutron_router_id), gateway=str(gateway_ip),
                                        is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                                        user_data_center=instance.user_data_center)

                            # external_gateway does not exist
                            else:
                                router_gateway = neutron.router_add_gateway(rc, router_id=neutron_router_id, network_id=network_id)
                                router_add_interface(rc, router_id=neutron_router_id, subnet_id=neutron_subnet_id)

                                default_router = Router.objects.create(
                                        name=str(neutron_router_name), status=1,
                                        is_default=True,router_id=str(neutron_router_id), gateway=str(gateway_ip),
                                        is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                                        user_data_center=instance.user_data_center)

                        # Router does not exist
                        else:
                            LOG.info("*** router does not exist ***")
                            default_router = Router.objects.create(
                                name=settings.DEFAULT_ROUTER_NAME, status=1, is_default=True,
                                is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                                user_data_center=instance.user_data_center)

                            # Start to create real network in neutron
                            #begin = datetime.datetime.now()
                            #create_network(default_private_network)
                            #create_subnet(default_private_subnet)

                            router_create_task(default_router)
                            attach_network_to_router(default_private_network.id,
                                     default_router.id, default_private_subnet.id)

                    # Subnet not exists in neutron, create a subnet in neutron and store in the initcloud.
                    else:
                        LOG.info("*** vxlan subnet does not exists ***")
                        address = None
                        for i in xrange(255):
                            tmp_address = settings.TENANT_DEFAULT_NETWORK
                            if not Subnet.objects.filter(user=instance.user,
                                        deleted=False, address=tmp_address,
                                        user_data_center=instance.user_data_center).exists():
                                address = tmp_address
                                break
                        if not address:
                            address = settings.TENANT_DEFAULT_NETWORK
                        # Create default private subnet to initcloud
                        default_private_subnet = Subnet.objects.create(
                            name=settings.DEFAULT_SUBNET_NAME, network=default_private_network,
                            address=address, ip_version=4, status=0, user=instance.user,
                            user_data_center=instance.user_data_center)


                        """
                        create_subnet(default_private_subnet)

                        routers = neutron.router_list(rc, tenant_id=user_tenant_uuid)
                        

                        neutron_subnet_id = None
                        for r in routers:
                            LOG.info("*** router is ***" + str(r))
                            external_gateway_info = r.external_gateway_info
                            LOG.info("*** external_gateway_info is ***" + str(external_gateway_info))
                            if external_gateway_info:
                                external_fixed_ips = external_gateway_info['external_fixed_ips']
                                if external_fixed_ips:
                                    for fip in external_fixed_ips:
                                        neutron_subnet_id = fip['subnet_id']
                        LOG.info("*** neutron_subnet_id is ***" + str(neutron_subnet_id))

                        """
                        default_router = Router.objects.create(
                            name=settings.DEFAULT_ROUTER_NAME, status=0, is_default=True,
                            is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                            user_data_center=instance.user_data_center)

                        # Start to create real network in neutron
                        begin = datetime.datetime.now()
                        #create_network(default_private_network)
                        create_subnet(default_private_subnet)

                        router_create_task(default_router)
                        attach_network_to_router(default_private_network.id,
                                  default_router.id, default_private_subnet.id)

                # User has not network in neutron and initcloud.
                else:
                    LOG.info("*** vxlan user network does not exist ***")
                    default_private_network = Network.objects.create(
                        name=settings.DEFAULT_NETWORK_NAME, status=NETWORK_STATE_BUILD,
                        is_default=True, user=instance.user,
                        user_data_center=instance.user_data_center)

                    address = None
                    for i in xrange(255):
                        tmp_address = settings.TENANT_DEFAULT_NETWORK
                        if not Subnet.objects.filter(user=instance.user,
                                    deleted=False, address=tmp_address,
                                    user_data_center=instance.user_data_center).exists():
                            address = tmp_address
                            break
                    if not address:
                        address = settings.TENANT_DEFAULT_NETWORK
                    # Create default private subnet to initcloud
                    default_private_subnet = Subnet.objects.create(
                        name=settings.DEFAULT_SUBNET_NAME, network=default_private_network,
                        address=address, ip_version=4, status=0, user=instance.user,
                        user_data_center=instance.user_data_center)


                    default_router = Router.objects.create(
                        name=settings.DEFAULT_ROUTER_NAME, status=0, is_default=True,
                        is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY, user=instance.user,
                        user_data_center=instance.user_data_center)

                    # Start to create real network in neutron
                    begin = datetime.datetime.now()
                    create_network(default_private_network)
                    create_subnet(default_private_subnet)
      

                    router_create_task(default_router)
                    attach_network_to_router(default_private_network.id,
                               default_router.id, default_private_subnet.id)
                    end = datetime.datetime.now()
                    LOG.info("Prepare private network api apply [%s] seconds.",
                                (end-begin).seconds) 
        else:
            LOG.info("Double check instance has default network [%s].", instance.name)
            default_private_network = default_private_networks[0]
    else:
        default_private_network = default_private_networks[0]
        LOG.info("Instance has default network, [%s][%s].",
                    instance, default_private_network)

    LOG.info(" *** i am two ***")
    if not network:
        network = default_private_network
    
    # Wait for network creation complete
    count = 1
    while True:
        if count > settings.MAX_COUNT_SYNC:
            LOG.info("Network not active, instance:[%s] netowk:[%s]." %(
                        instance.name, network.name))
            break

        count = count + 1
        rc = create_rc_by_network(network)
        try:
            network = Network.objects.get(pk=network.id)
            if not network.network_id:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue

            net = neutron.network_get(rc, network.network_id)
            if net.status.upper() not in ["ACTIVE", ]:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue 

            if net.subnets:
                break
            else:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND) 
        except:
            time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND) 

    LOG.info("*** network is ***" + str(network))
    return network
Esempio n. 12
0
def make_sure_default_private_network(instance, rc, user_tenant_uuid):
    network = None
    try:
        network = Network.objects.get(pk=instance.network_id)
    except Network.DoesNotExist:
        LOG.info("network not exist")
        pass

    default_private_network = None
    default_private_subnet = None
    default_router = None

    # Try to get default network
    default_private_networks = Network.objects.filter(
        deleted=False,
        is_default=True,
        status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
        user=instance.user,
        user_data_center=instance.user_data_center)

    if not default_private_networks.exists():
        LOG.info(
            "*** default private network not exists in initcloud. Going to confirm if it exists in neutron***"
        )
        sleeping = random.uniform(0.4, 5.5)
        time.sleep(sleeping)
        LOG.info("No default network [%s][%s], sleep [%s] seconds",
                 instance.user_data_center.tenant_name, instance.name,
                 sleeping)

        default_private_networks = Network.objects.filter(
            deleted=False,
            is_default=True,
            status__in=[NETWORK_STATE_BUILD, NETWORK_STATE_ACTIVE],
            user=instance.user,
            user_data_center=instance.user_data_center)

        # No default network exists, create a new one.
        if not default_private_networks.exists():

            LOG.info(
                "*** no default network in initcloud. GOing to confirm if it exists in neutron ***"
            )
            LOG.info("*** vlan enabled or not ***" +
                     str(settings.VLAN_ENABLED))
            if settings.VLAN_ENABLED == True:
                LOG.info("*** vlan enabled ***")
                LOG.info("Double check no default vlan network [%s][%s].",
                         instance.user_data_center.tenant_name, instance.name)
                begin = datetime.datetime.now()
                network_ = neutron.network_list_for_tenant(
                    rc, tenant_id=user_tenant_uuid)
                LOG.info("********** network is ******************" +
                         str(network_))
                network_id = None
                network_name = None
                network_status = None
                subnet_id = None
                subnet_name = None
                subnet_addr = None
                for net in network_:
                    LOG.info("***** net is *******" + str(net))
                    network_id = net.id
                    network_name = net.name
                    network_status = net.admin_state_up
                    subnet = net.subnets
                    for s in subnet:
                        subnet_name = s.name
                        subnet_id = s.id
                        subnet_addr = s.cidr
                LOG.info("********* network_id is *********" + str(network_id))
                LOG.info("********* network_name is *********" +
                         str(network_name))
                LOG.info("********* network_status is *********" +
                         str(network_status))
                LOG.info("********* subnet_id is *********" + str(subnet_id))
                LOG.info("********* subnet_name is *********" +
                         str(subnet_name))
                LOG.info("********* subnet_addr is *********" +
                         str(subnet_addr))
                # Create Default network to initcloud
                default_private_network = Network.objects.create(
                    name=network_name,
                    network_id=network_id,
                    status=network_status,
                    is_default=True,
                    user=instance.user,
                    user_data_center=instance.user_data_center)

                LOG.info("*** default private network create success ***")
                address = None
                for i in xrange(255):
                    tmp_address = settings.TENANT_DEFAULT_NETWORK
                    if not Subnet.objects.filter(user=instance.user,
                                                 deleted=False,
                                                 address=tmp_address,
                                                 user_data_center=instance.
                                                 user_data_center).exists():
                        address = tmp_address
                        break
                if not address:
                    address = settings.TENANT_DEFAULT_NETWORK
                # Create default private subnet to initcloud
                default_private_subnet = Subnet.objects.create(
                    name=subnet_name,
                    network=default_private_network,
                    address=subnet_addr,
                    ip_version=4,
                    status=0,
                    user=instance.user,
                    user_data_center=instance.user_data_center)

                LOG.info("*** default_private_subnet create success ***")

                end = datetime.datetime.now()
                LOG.info("Create vlan network db record apply [%s] seconds.",
                         (end - begin).seconds)

            # User has not default network for vxlan.
            if settings.VLAN_ENABLED == False:

                LOG.info("*** vxlan mode is enabled ***")
                # Start check if network exists in neutron.

                network_ = neutron.network_list_for_tenant(
                    rc, tenant_id=user_tenant_uuid)
                LOG.info("********** network is ******************" +
                         str(network_))
                network_id = None
                network_name = None
                network_status = None
                subnet_id = None
                subnet_name = None
                subnet_addr = None
                for net in network_:
                    LOG.info("***** net is *******" + str(net))
                    network_id = net.id
                    network_name = net.name
                    network_status = net.admin_state_up
                    subnet = net.subnets
                    for s in subnet:
                        subnet_name = s.name
                        subnet_id = s.id
                        subnet_addr = s.cidr

                begin = datetime.datetime.now()
                LOG.info("********* network_status is *********" +
                         str(network_status))

                # User has network in neutron
                if network_name and network_id:
                    LOG.info("*** vxlan user has network in neutron ***")
                    default_private_network = Network.objects.create(
                        name=network_name,
                        network_id=network_id,
                        status=network_status,
                        is_default=True,
                        user=instance.user,
                        user_data_center=instance.user_data_center)

                    # If network exists, check subnet exists or not.

                    # If subnet exists, store data in initcloud.
                    if subnet_id and subnet_name:

                        LOG.info("*** vxlan user has subnet in neutron ***")
                        address = None
                        for i in xrange(255):
                            tmp_address = settings.TENANT_DEFAULT_NETWORK
                            if not Subnet.objects.filter(
                                    user=instance.user,
                                    deleted=False,
                                    address=tmp_address,
                                    user_data_center=instance.user_data_center
                            ).exists():
                                address = tmp_address
                                break
                        if not address:
                            address = settings.TENANT_DEFAULT_NETWORK
                        # Create default private subnet to initcloud
                        default_private_subnet = Subnet.objects.create(
                            name=subnet_name,
                            network=default_private_network,
                            subnet_id=subnet_id,
                            address=subnet_addr,
                            ip_version=4,
                            status=1,
                            user=instance.user,
                            user_data_center=instance.user_data_center)

                        # Check if router exists.

                        neutron_subnets = neutron.subnet_list(
                            rc, network_id=network_id)
                        for n in neutron_subnets:
                            LOG.info("*** n is ***" + str(n))
                        routers = neutron.router_list(
                            rc, tenant_id=user_tenant_uuid)

                        neutron_subnet_id = None
                        neutron_router_id = None
                        neutron_router_name = None
                        external_gateway_info = None
                        external_fixed_ips = None
                        is_router = False
                        gateway_ip = None
                        for r in routers:
                            is_router = True
                            neutron_router_id = r.id
                            neutron_router_name = r.name
                            LOG.info("*** router is ***" + str(r))
                            external_gateway_info = r.external_gateway_info
                            LOG.info("*** external_gateway_info is ***" +
                                     str(external_gateway_info))
                            if external_gateway_info:
                                external_fixed_ips = external_gateway_info[
                                    'external_fixed_ips']
                                if external_fixed_ips:
                                    for fip in external_fixed_ips:
                                        neutron_subnet_id = fip['subnet_id']
                                        gateway_ip = fip['ip_address']

                        ports = neutron.port_list(rc, network_id=network_id)
                        p_network_id = None
                        p_subnet_id = None
                        p_fixed_ips = None
                        os_port_id = None
                        for p in ports:
                            LOG.info("*** p is ***" + str(p))
                            os_port_id = p.id
                            if p.device_owner == "network:router_interface":
                                p_network_id = p.network_id
                                p_fixed_ips = p.fixed_ips
                                for f in p_fixed_ips:
                                    p_subnet_id = f['subnet_id']
                        LOG.info("*** gateway_ip is ***" + str(gateway_ip))
                        LOG.info("*** neutron_subnet_id is ***" +
                                 str(neutron_subnet_id))
                        LOG.info("*** subnet_id is ***" + str(subnet_id))

                        LOG.info("external_gateway_info is" +
                                 str(external_gateway_info))
                        LOG.info("external_fixed_ips is " +
                                 str(external_fixed_ips))
                        # router exists
                        if is_router and str(p_subnet_id) == str(subnet_id):
                            LOG.info("*** vxlan user has router exists ***")
                            # external_gateway exists
                            if external_gateway_info:
                                # external_fixed_ips exists, save router info to initcloud
                                if external_fixed_ips:
                                    LOG.info(
                                        "***** ****************************** ***********"
                                    )
                                    LOG.info("*** neutron_router_name ***" +
                                             str(neutron_router_name))
                                    LOG.info("*** neutron_router_id ***" +
                                             str(neutron_router_id))
                                    LOG.info("*** gateway_ip ***" +
                                             str(gateway_ip))
                                    default_router = Router.objects.create(
                                        name=str(neutron_router_name),
                                        status=1,
                                        is_default=True,
                                        router_id=str(neutron_router_id),
                                        gateway=str(gateway_ip),
                                        is_gateway=settings.
                                        DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                                        user=instance.user,
                                        user_data_center=instance.
                                        user_data_center)
                                    LOG.info("*** router create success ***")

                                    RouterInterface.objects.create(
                                        network_id=default_private_network.id,
                                        router_id=default_router.id,
                                        subnet_id=default_private_subnet.id,
                                        user=instance.user,
                                        user_data_center=instance.
                                        user_data_center,
                                        os_port_id=str(os_port_id))

                                # external_fixed_ips does not exist
                                else:
                                    router_add_interface(
                                        rc,
                                        router_id=neutron_router_id,
                                        subnet_id=neutron_subnet_id)
                                    default_router = Router.objects.create(
                                        name=str(neutron_router_name),
                                        status=1,
                                        is_default=True,
                                        router_id=str(neutron_router_id),
                                        gateway=str(gateway_ip),
                                        is_gateway=settings.
                                        DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                                        user=instance.user,
                                        user_data_center=instance.
                                        user_data_center)

                            # external_gateway does not exist
                            else:
                                router_gateway = neutron.router_add_gateway(
                                    rc,
                                    router_id=neutron_router_id,
                                    network_id=network_id)
                                router_add_interface(
                                    rc,
                                    router_id=neutron_router_id,
                                    subnet_id=neutron_subnet_id)

                                default_router = Router.objects.create(
                                    name=str(neutron_router_name),
                                    status=1,
                                    is_default=True,
                                    router_id=str(neutron_router_id),
                                    gateway=str(gateway_ip),
                                    is_gateway=settings.
                                    DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                                    user=instance.user,
                                    user_data_center=instance.user_data_center)

                        # Router does not exist
                        else:
                            LOG.info("*** router does not exist ***")
                            default_router = Router.objects.create(
                                name=settings.DEFAULT_ROUTER_NAME,
                                status=1,
                                is_default=True,
                                is_gateway=settings.
                                DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                                user=instance.user,
                                user_data_center=instance.user_data_center)

                            # Start to create real network in neutron
                            #begin = datetime.datetime.now()
                            #create_network(default_private_network)
                            #create_subnet(default_private_subnet)

                            router_create_task(default_router)
                            attach_network_to_router(
                                default_private_network.id, default_router.id,
                                default_private_subnet.id)

                    # Subnet not exists in neutron, create a subnet in neutron and store in the initcloud.
                    else:
                        LOG.info("*** vxlan subnet does not exists ***")
                        address = None
                        for i in xrange(255):
                            tmp_address = settings.TENANT_DEFAULT_NETWORK
                            if not Subnet.objects.filter(
                                    user=instance.user,
                                    deleted=False,
                                    address=tmp_address,
                                    user_data_center=instance.user_data_center
                            ).exists():
                                address = tmp_address
                                break
                        if not address:
                            address = settings.TENANT_DEFAULT_NETWORK
                        # Create default private subnet to initcloud
                        default_private_subnet = Subnet.objects.create(
                            name=settings.DEFAULT_SUBNET_NAME,
                            network=default_private_network,
                            address=address,
                            ip_version=4,
                            status=0,
                            user=instance.user,
                            user_data_center=instance.user_data_center)
                        """
                        create_subnet(default_private_subnet)

                        routers = neutron.router_list(rc, tenant_id=user_tenant_uuid)
                        

                        neutron_subnet_id = None
                        for r in routers:
                            LOG.info("*** router is ***" + str(r))
                            external_gateway_info = r.external_gateway_info
                            LOG.info("*** external_gateway_info is ***" + str(external_gateway_info))
                            if external_gateway_info:
                                external_fixed_ips = external_gateway_info['external_fixed_ips']
                                if external_fixed_ips:
                                    for fip in external_fixed_ips:
                                        neutron_subnet_id = fip['subnet_id']
                        LOG.info("*** neutron_subnet_id is ***" + str(neutron_subnet_id))

                        """
                        default_router = Router.objects.create(
                            name=settings.DEFAULT_ROUTER_NAME,
                            status=0,
                            is_default=True,
                            is_gateway=settings.
                            DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                            user=instance.user,
                            user_data_center=instance.user_data_center)

                        # Start to create real network in neutron
                        begin = datetime.datetime.now()
                        #create_network(default_private_network)
                        create_subnet(default_private_subnet)

                        router_create_task(default_router)
                        attach_network_to_router(default_private_network.id,
                                                 default_router.id,
                                                 default_private_subnet.id)

                # User has not network in neutron and initcloud.
                else:
                    LOG.info("*** vxlan user network does not exist ***")
                    default_private_network = Network.objects.create(
                        name=settings.DEFAULT_NETWORK_NAME,
                        status=NETWORK_STATE_BUILD,
                        is_default=True,
                        user=instance.user,
                        user_data_center=instance.user_data_center)

                    address = None
                    for i in xrange(255):
                        tmp_address = settings.TENANT_DEFAULT_NETWORK
                        if not Subnet.objects.filter(
                                user=instance.user,
                                deleted=False,
                                address=tmp_address,
                                user_data_center=instance.user_data_center
                        ).exists():
                            address = tmp_address
                            break
                    if not address:
                        address = settings.TENANT_DEFAULT_NETWORK
                    # Create default private subnet to initcloud
                    default_private_subnet = Subnet.objects.create(
                        name=settings.DEFAULT_SUBNET_NAME,
                        network=default_private_network,
                        address=address,
                        ip_version=4,
                        status=0,
                        user=instance.user,
                        user_data_center=instance.user_data_center)

                    default_router = Router.objects.create(
                        name=settings.DEFAULT_ROUTER_NAME,
                        status=0,
                        is_default=True,
                        is_gateway=settings.DEFAULT_ROUTER_AUTO_SET_GATEWAY,
                        user=instance.user,
                        user_data_center=instance.user_data_center)

                    # Start to create real network in neutron
                    begin = datetime.datetime.now()
                    create_network(default_private_network)
                    create_subnet(default_private_subnet)

                    router_create_task(default_router)
                    attach_network_to_router(default_private_network.id,
                                             default_router.id,
                                             default_private_subnet.id)
                    end = datetime.datetime.now()
                    LOG.info("Prepare private network api apply [%s] seconds.",
                             (end - begin).seconds)
        else:
            LOG.info("Double check instance has default network [%s].",
                     instance.name)
            default_private_network = default_private_networks[0]
    else:
        default_private_network = default_private_networks[0]
        LOG.info("Instance has default network, [%s][%s].", instance,
                 default_private_network)

    LOG.info(" *** i am two ***")
    if not network:
        network = default_private_network

    # Wait for network creation complete
    count = 1
    while True:
        if count > settings.MAX_COUNT_SYNC:
            LOG.info("Network not active, instance:[%s] netowk:[%s]." %
                     (instance.name, network.name))
            break

        count = count + 1
        rc = create_rc_by_network(network)
        try:
            network = Network.objects.get(pk=network.id)
            if not network.network_id:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue

            net = neutron.network_get(rc, network.network_id)
            if net.status.upper() not in [
                    "ACTIVE",
            ]:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
                continue

            if net.subnets:
                break
            else:
                time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)
        except:
            time.sleep(settings.INSTANCE_SYNC_INTERVAL_SECOND)

    LOG.info("*** network is ***" + str(network))
    return network