64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
# Copyright 2013 IBM Corp.
|
|
|
|
from nova import rpc
|
|
from oslo.messaging import Target
|
|
from nova.openstack.common import log as logging
|
|
from powervc.common.constants import PVC_TOPIC
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
MAX_CACHE_ENTRY = 100
|
|
|
|
|
|
class NetworkAPI(object):
|
|
"""
|
|
Client side of the PowerVC Neutron agent RPC API.
|
|
"""
|
|
BASE_RPC_API_VERSION = '1.0'
|
|
|
|
def __init__(self, topic=None):
|
|
self.topic = topic if topic else PVC_TOPIC
|
|
# Caching the map between local network uuid and pvc network uuid
|
|
# catch[local_uuid] = pvc_uuid
|
|
# Insert entry: when get_pvc_network_uuid is called the first time
|
|
# Delete entry:not supported
|
|
# Capacity limit: no limit set
|
|
self.rpcclient = rpc.get_client(Target(topic=self.topic))
|
|
self._cache = dict()
|
|
|
|
def get_pvc_network_uuid(self, ctxt, network_uuid):
|
|
LOG.debug("network_uuid_cache has %s entries" % len(self._cache))
|
|
# in case of upper limit, emit a warning
|
|
if (len(self._cache) > MAX_CACHE_ENTRY):
|
|
# In production env, debug is disabled by default
|
|
# there should not be many networks in real env.
|
|
# log this for reference, this is not supposed to occur
|
|
LOG.warning("network_uuid_cache reach limit:%s" % len(self._cache))
|
|
# check if the entry has been cached
|
|
if network_uuid in self._cache:
|
|
pvc_uuid = self._cache[network_uuid]
|
|
LOG.debug("network_uuid_cache found pvc_uuid %s for %s" %
|
|
(pvc_uuid, network_uuid))
|
|
return pvc_uuid
|
|
kwargs = {}
|
|
kwargs['network_id'] = network_uuid
|
|
pvc_id = self.rpcclient.call(ctxt, 'get_pvc_network_uuid', **kwargs)
|
|
# in case None, we do not cache it
|
|
if pvc_id:
|
|
# add this entry to cache
|
|
LOG.debug("network_uuid_cache adding pvc_uuid %s for %s to cache" %
|
|
(pvc_id, network_uuid))
|
|
self._cache[network_uuid] = pvc_id
|
|
return pvc_id
|
|
|
|
def set_device_id_on_port_by_pvc_instance_uuid(self,
|
|
ctxt,
|
|
local_ins_id,
|
|
pvc_ins_id):
|
|
kwargs = {}
|
|
kwargs['device_id'] = local_ins_id
|
|
kwargs['pvc_ins_uuid'] = pvc_ins_id
|
|
method_name = "set_device_id_on_port_by_pvc_instance_uuid"
|
|
result = self.rpcclient.call(ctxt, method_name, **kwargs)
|
|
return result
|