Hi Yong,

Yes, trey is waiting on the new API code, as which point there will no
longer be separate calls to quantum + melange, but rather a single call to
the quantumv2 API.

dan

On Tue, May 29, 2012 at 3:53 PM, Yong Sheng Gong <gong...@cn.ibm.com> wrote:

> Hi Dan and tr3buchet,
> I see some things in branch 
> https://github.com/tr3buchet/nova/tree/quantum_api: 
> <https://github.com/tr3buchet/nova/tree/quantum_api>
> 1. compute manager is using a configurable network_api, i.e.
> self.network_api = utils.import_object(FLAGS.network_api_class)
>
> instead of self.network_api = network.API().
> I think, to use new quantum network api, we should have
> network_api_class= nova. 
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova>network
>  
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova/network>.quantum2
>  
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova/network/quantum2>.*api.*QuantumAPI
>
> in nova.conf.
> 2. most of methods are implemented by calling multiple api methods exposed by 
> melange and quantum servers
> here, since melange will soon be merged into quantum. So we will clear 
> melange connection code then.
>
> And nova. 
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova>network
>  
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova/network>.quantum2
>  
> <https://github.com/tr3buchet/nova/tree/9f4b64d49b27170da5c1a5c19be96d342fc10db3/nova/network/quantum2>.*api.*QuantumAPI
>  is a wrapper API, it will cause some problems.
>
> Let's look at one method of it:
>
>   def allocate_for_instance(self, context, instance, requested_networks=
> None,
>                               availability_zone=None, **kwargs):
>         instance_id = instance['uuid']
>         rxtx_factor = instance['instance_type']['rxtx_factor']
>         LOG.debug(_('network allocations for instance %s'), instance_id)
>         tenant_id = instance['project_id']
>         host = instance['host']
>
>         networks = self._get_networks(tenant_id, normalize=False,
>                                       include_default_tenant=True)
>
>         if requested_networks:
>             # pare down networks, to include only those requested
>             # TODO(tr3buchet): handle networks in requested networks which
>             # are not in networks.. raise?
>             networks = [n for n in networks
>                         if n['network_id'] in requested_networks]
>
>         # Make sure we only request one allocation per network
>         networks = set([(net['network_id'],
>                          net['tenant_id']) for net in networks])
>
>         networks = [{'id': net[0],
>                      'tenant_id': net[1]} for net in networks]
>         vifs = []
>         try:
>             vifs = self.m_conn.allocate_for_instance_networks(tenant_id,
>                                                               instance_id,
>                                                               networks)
>         except Exception:
>             LOG.exception(_('Melange allocation failed'))
>             self._clean_up_melange(tenant_id, instance_id,
>                                    raise_exception=False)
>         for vif in vifs:
>             pairs = []
>
>             (ips, network_tenant_ids, network_ids) = \
>                         self._get_ips_and_ids_from_vif(vif)
>
>             if (not network_tenant_ids or not network_ids or
>                 len(network_tenant_ids) > 1 or len(network_ids) > 1):
>
>                 # NOTE(jkoelker) Something is screwy, cleanup and error
>                 self._clean_up_melange(tenant_id, instance_id)
>
>             network_tenant_id = network_tenant_ids.pop()
>             network_id = network_ids.pop()
>
>             if FLAGS.quantum_use_port_security:
>                 if FLAGS.quantum_port_security_include_link_local:
>                     mac = netaddr.EUI(vif['mac_address'])
>                     ips.append(str(mac.ipv6_link_local()))
>
>                 pairs = self._generate_address_pairs(vif, ips)
>
>             self.q_conn.create_and_attach_port(network_tenant_id,
>                                                network_id,
>                                                vif['id'],
>                                                vm_id=instance_id,
>                                                rxtx_factor=rxtx_factor,
>                                                nova_id=availability_zone,
>                                                allowed_address_pairs=pairs
> )
>
> Here we called two methods by webservice, It will cause:
> 1. transaction problem,
> They are not in one transaction context, So we have to be careful to maintain 
> the consistency of our system.
>
> 2. performance.
> We have to go-and-back multiple times for one function needed in nova.
>
> So I think we can implement the nova quantum api on the side of quantum.
>
> Any ideas?
>
>
> Thanks
> Yong Sheng Gong
>
>
>
>
>
>
> -----Dan Wendlandt <d...@nicira.com> <d...@nicira.com> wrote: -----
> To: Trey Morris <trey.mor...@rackspace.com> <trey.mor...@rackspace.com>
> From: Dan Wendlandt <d...@nicira.com> <d...@nicira.com>
> Date: 05/30/2012 12:46AM
> Cc: Yong Sheng Gong/China/IBM@IBMCN, netstack@lists.launchpad.net
> Subject: Re: [Netstack] About quantum api v2.0
>
>
>
>
> On Tue, May 29, 2012 at 9:07 AM, Trey Morris <trey.mor...@rackspace.com>wrote:
>
>> Mr. Gong, we've got a lot of work going on in this area and it's rapidly
>> changing at the moment. We've already written a new network manager that we
>> use and I'm in the process of removing the network manager piece all
>> together when using nova with quantum. This work is planned for upstream as
>> a part of Folsom.
>>
>> A few (dated) branches you can peruse:
>> https://github.com/jkoelker/nova/tree/the_deuce
>> https://github.com/tr3buchet/nova/tree/quantum_api
>>
>> As to your question about the disparity, quantum isn't written specific
>> to nova. You can see how we've handled it in the above branches. Let me
>> know if you have any further questions
>>
>
>> -tr3buchet
>>
>
> Yup, that's correct.  Trey's branch covers the logic around VM
> allocation/deallocation, which is really all Nova will be responsible for
> moving forward (this is inline with the general goal of making Nova focus
> on compute, leaving networking and storage to other services).  The second
> of the branch's does this in a really cool way: by having nova-compute call
> quantum directly, rather than having everything proxied through
> nova-network.  This eliminates the need for nova-network all together when
> running Quantum.
>
> Of the other calls you mentioned, floating IPs will be implemented as an
> extension to the Quantum v2 API (they are an extension in Nova as well).
>  The DNS stuff was added more recently to Nova, I believe to automatically
> create DNS entries when an instance is created.  Vish and I have only
> talked about this briefly, but we are not currently planning on
> implementing this as part of Quantum.  My initial thoughts on this is that
> it makes more sense as code that could live outside of "core" Nova or
> Quantum and simply consume notifications about instances/ports being
> created.  Thus, I'd rather focus energy on building a good notifications
> mechanism.
>
>  Dan
>
>
>>
>> On Tue, May 29, 2012 at 3:35 AM, Yong Sheng Gong <gong...@cn.ibm.com>wrote:
>>
>>>
>>> Hi,
>>> We have planned to replace quantum network manager in nova project with
>>> quantum api v2.0 calls.
>>> I have found that nova will call following 34 network api methods:
>>> class API(base.Base):
>>>     # called in compute manager
>>>     def get_instance_nw_info(self, context, instance):
>>>         pass
>>>
>>>     def add_fixed_ip_to_instance(self, context, instance, network_id):
>>>         # libvirt does not support
>>>         pass
>>>
>>>     def remove_fixed_ip_from_instance(self, context, instance, address):
>>>         # libvirt does not support
>>>         """Removes a fixed ip from instance from specified network."""
>>>
>>>         args = {'instance_id': instance['id'],
>>>                 'host': instance['host'],
>>>                 'address': address}
>>>         pass
>>>
>>>     def deallocate_for_instance(self, context, instance, **kwargs):
>>>         """Deallocates all network structures related to instance."""
>>>         args = kwargs
>>>         args['instance_id'] = instance['id']
>>>         args['project_id'] = instance['project_id']
>>>         args['host'] = instance['host']
>>>         pass
>>>
>>>     def allocate_for_instance(self, context, instance, **kwargs):
>>>         pass
>>>
>>>     def setup_networks_on_host(self, context, instance, host=None,
>>>                                                         teardown=False):
>>>         # setup dhcp info on host
>>>         pass
>>>
>>>
>>>
>>>     # called in floating_ips controller
>>>     def get_fixed_ip(self, context, id):
>>>         #fixed_ip_id
>>>         pass
>>>
>>>     def get_floating_ip(self, context, id):
>>>         pass
>>>
>>>     def get_floating_ips_by_project(self, context):
>>>         pass
>>>
>>>     def get_floating_ip_by_address(self, context, address):
>>>         pass
>>>     def allocate_floating_ip(self, context, pool=None):
>>>         pass
>>>
>>>     def release_floating_ip(self, context, address,
>>>                             affect_auto_assigned=False):
>>>         pass
>>>     def disassociate_floating_ip(self, context, address,
>>>                                  affect_auto_assigned=False):
>>>         pass
>>>
>>>     #called in FloatingIPPool
>>>     def get_floating_ip_pools(self, context):
>>>         pass
>>>
>>>     #called in get meta handler
>>>     def get_fixed_ip_by_address(self, context, address):
>>>         pass
>>>
>>>     #called in FloatingIPDNSEntryController
>>>     def get_dns_entries_by_name(self):
>>>         pass
>>>
>>>     def get_dns_entries_by_address(self):
>>>         pass
>>>
>>>     def add_dns_entry(self):
>>>         pass
>>>
>>>     def modify_dns_entry(self):
>>>         pass
>>>
>>>     def delete_dns_entry(self):
>>>         pass
>>>
>>>     #called in FloatingIPDNSDomainController
>>>     def get_dns_domains(self):
>>>         pass
>>>
>>>     def create_private_dns_domain(self):
>>>         pass
>>>     def create_public_dns_domain(self):
>>>         pass
>>>     def delete_dns_domain(self):
>>>         pass
>>>
>>>
>>>     #called in network controller
>>>     def get_all(self, context):
>>>         pass
>>>
>>>     def get(self, context, network_uuid):
>>>         pass
>>>
>>>     def delete(self, context, network_uuid):
>>>         pass
>>>
>>>     def disassociate(self, context, network_uuid):
>>>         pass
>>>     #called in compute api
>>>     def validate_networks(self, context, requested_networks):
>>>         pass
>>>     def get_instance_uuids_by_ip_filter(self, context, filters):
>>>         pass
>>>     def associate_floating_ip(self, context, floating_address,
>>> fixed_address,
>>>
>>> affect_auto_assigned=False):
>>>         pass
>>>     # called in ServerVirtualInterfaceController
>>>     def get_vifs_by_instance(self, context, instance):
>>>         pass
>>>
>>>     #unknown
>>>     def add_network_to_project(self, context, project_id):
>>>         pass
>>>     def get_vif_by_mac_address(self, context, mac_address):
>>>         pass
>>>     def get_floating_ips_by_fixed_address(self, context, fixed_address):
>>>         pass
>>>
>>> There are some called in compute manager, some called in compute api,
>>>  most  called in controllers under nova/api/openstack/compute/contrib.
>>> Some even are seemingly not called at all.
>>>
>>> Our current quantum api is much finer grained compared to the api needed
>>> by nova. There seems to be a disparity between them. For example, nova does
>>> not need to add a port to a network, plugin an interface api at all. It
>>> just needs coarse grained api such as allocate_for_instance and 
>>> deallocate_for_instance
>>> etc.
>>>
>>> How do we implement quantum api v2.0? It is fine grained or coarse
>>> grained.
>>>
>>> Any ideas?
>>> Thanks
>>> Yong Sheng Gong
>>>
>>> --
>>> Mailing list: https://launchpad.net/~netstack
>>> Post to     : netstack@lists.launchpad.net
>>> Unsubscribe : https://launchpad.net/~netstack
>>> More help   : https://help.launchpad.net/ListHelp
>>>
>>>
>>
>> --
>> Mailing list: https://launchpad.net/~netstack
>> Post to     : netstack@lists.launchpad.net
>> Unsubscribe : https://launchpad.net/~netstack
>> More help   : https://help.launchpad.net/ListHelp
>>
>>
>
>
> --
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Dan Wendlandt
> Nicira, Inc: www.nicira.com
> twitter: danwendlandt
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>


-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dan Wendlandt
Nicira, Inc: www.nicira.com
twitter: danwendlandt
~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 
Mailing list: https://launchpad.net/~netstack
Post to     : netstack@lists.launchpad.net
Unsubscribe : https://launchpad.net/~netstack
More help   : https://help.launchpad.net/ListHelp

Reply via email to