Adds more usage data to Nova's usage notifications.
Adds in bandwidth, state and IP data on standard notifications, and new notifications on add/remove IP. These were missing before, and are needed to meet spec. This fixes bug 849117 Change-Id: Ie586ff3a91a56e5f5eff8abc6905ba6a0b624451
This commit is contained in:
parent
d0f4a18e99
commit
697cfecb59
@ -1438,6 +1438,30 @@ def agent_build_update(context, agent_build_id, values):
|
|||||||
####################
|
####################
|
||||||
|
|
||||||
|
|
||||||
|
def bw_usage_get_by_instance(context, instance_id, start_period):
|
||||||
|
"""Return bw usages for an instance in a given audit period."""
|
||||||
|
return IMPL.bw_usage_get_by_instance(context, instance_id, start_period)
|
||||||
|
|
||||||
|
|
||||||
|
def bw_usage_update(context,
|
||||||
|
instance_id,
|
||||||
|
network_label,
|
||||||
|
start_period,
|
||||||
|
bw_in, bw_out,
|
||||||
|
session=None):
|
||||||
|
"""Update cached bw usage for an instance and network
|
||||||
|
Creates new record if needed."""
|
||||||
|
return IMPL.bw_usage_update(context,
|
||||||
|
instance_id,
|
||||||
|
network_label,
|
||||||
|
start_period,
|
||||||
|
bw_in, bw_out,
|
||||||
|
session=None)
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
|
||||||
|
|
||||||
def instance_type_extra_specs_get(context, instance_type_id):
|
def instance_type_extra_specs_get(context, instance_type_id):
|
||||||
"""Get all extra specs for an instance type."""
|
"""Get all extra specs for an instance type."""
|
||||||
return IMPL.instance_type_extra_specs_get(context, instance_type_id)
|
return IMPL.instance_type_extra_specs_get(context, instance_type_id)
|
||||||
|
@ -3617,6 +3617,42 @@ def agent_build_update(context, agent_build_id, values):
|
|||||||
agent_build_ref.save(session=session)
|
agent_build_ref.save(session=session)
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
|
||||||
|
@require_context
|
||||||
|
def bw_usage_get_by_instance(context, instance_id, start_period):
|
||||||
|
session = get_session()
|
||||||
|
return session.query(models.BandwidthUsage).\
|
||||||
|
filter_by(instance_id=instance_id).\
|
||||||
|
filter_by(start_period=start_period).\
|
||||||
|
all()
|
||||||
|
|
||||||
|
|
||||||
|
@require_context
|
||||||
|
def bw_usage_update(context,
|
||||||
|
instance_id,
|
||||||
|
network_label,
|
||||||
|
start_period,
|
||||||
|
bw_in, bw_out,
|
||||||
|
session=None):
|
||||||
|
session = session if session else get_session()
|
||||||
|
with session.begin():
|
||||||
|
bwusage = session.query(models.BandwidthUsage).\
|
||||||
|
filter_by(instance_id=instance_id).\
|
||||||
|
filter_by(start_period=start_period).\
|
||||||
|
filter_by(network_label=network_label).\
|
||||||
|
first()
|
||||||
|
if not bwusage:
|
||||||
|
bwusage = models.BandwidthUsage()
|
||||||
|
bwusage.instance_id = instance_id
|
||||||
|
bwusage.start_period = start_period
|
||||||
|
bwusage.network_label = network_label
|
||||||
|
bwusage.last_refreshed = utils.utcnow()
|
||||||
|
bwusage.bw_in = bw_in
|
||||||
|
bwusage.bw_out = bw_out
|
||||||
|
bwusage.save(session=session)
|
||||||
|
|
||||||
|
|
||||||
####################
|
####################
|
||||||
|
|
||||||
|
|
||||||
|
@ -294,9 +294,46 @@ EASIER_PASSWORD_SYMBOLS = ('23456789' # Removed: 0, 1
|
|||||||
'ABCDEFGHJKLMNPQRSTUVWXYZ') # Removed: I, O
|
'ABCDEFGHJKLMNPQRSTUVWXYZ') # Removed: I, O
|
||||||
|
|
||||||
|
|
||||||
|
def current_audit_period(unit=None):
|
||||||
|
if not unit:
|
||||||
|
unit = FLAGS.instance_usage_audit_period
|
||||||
|
rightnow = utcnow()
|
||||||
|
if unit not in ('month', 'day', 'year', 'hour'):
|
||||||
|
raise ValueError('Time period must be hour, day, month or year')
|
||||||
|
n = 1 # we are currently only using multiples of 1 unit (mdragon)
|
||||||
|
if unit == 'month':
|
||||||
|
year = rightnow.year - (n // 12)
|
||||||
|
n = n % 12
|
||||||
|
if n >= rightnow.month:
|
||||||
|
year -= 1
|
||||||
|
month = 12 + (rightnow.month - n)
|
||||||
|
else:
|
||||||
|
month = rightnow.month - n
|
||||||
|
begin = datetime.datetime(day=1, month=month, year=year)
|
||||||
|
end = datetime.datetime(day=1,
|
||||||
|
month=rightnow.month,
|
||||||
|
year=rightnow.year)
|
||||||
|
|
||||||
|
elif unit == 'year':
|
||||||
|
begin = datetime.datetime(day=1, month=1, year=rightnow.year - n)
|
||||||
|
end = datetime.datetime(day=1, month=1, year=rightnow.year)
|
||||||
|
|
||||||
|
elif unit == 'day':
|
||||||
|
b = rightnow - datetime.timedelta(days=n)
|
||||||
|
begin = datetime.datetime(day=b.day, month=b.month, year=b.year)
|
||||||
|
end = datetime.datetime(day=rightnow.day,
|
||||||
|
month=rightnow.month,
|
||||||
|
year=rightnow.year)
|
||||||
|
elif unit == 'hour':
|
||||||
|
end = rightnow.replace(minute=0, second=0, microsecond=0)
|
||||||
|
begin = end - datetime.timedelta(hours=n)
|
||||||
|
|
||||||
|
return (begin, end)
|
||||||
|
|
||||||
|
|
||||||
def usage_from_instance(instance_ref, **kw):
|
def usage_from_instance(instance_ref, **kw):
|
||||||
usage_info = dict(
|
usage_info = dict(
|
||||||
project_id=instance_ref['project_id'],
|
tenant_id=instance_ref['project_id'],
|
||||||
user_id=instance_ref['user_id'],
|
user_id=instance_ref['user_id'],
|
||||||
instance_id=instance_ref['id'],
|
instance_id=instance_ref['id'],
|
||||||
instance_type=instance_ref['instance_type']['name'],
|
instance_type=instance_ref['instance_type']['name'],
|
||||||
@ -305,7 +342,11 @@ def usage_from_instance(instance_ref, **kw):
|
|||||||
created_at=str(instance_ref['created_at']),
|
created_at=str(instance_ref['created_at']),
|
||||||
launched_at=str(instance_ref['launched_at']) \
|
launched_at=str(instance_ref['launched_at']) \
|
||||||
if instance_ref['launched_at'] else '',
|
if instance_ref['launched_at'] else '',
|
||||||
image_ref=instance_ref['image_ref'])
|
image_ref=instance_ref['image_ref'],
|
||||||
|
state=instance_ref['vm_state'],
|
||||||
|
state_description=instance_ref['task_state'] \
|
||||||
|
if instance_ref['task_state'] else '',
|
||||||
|
fixed_ips=[a.address for a in instance_ref['fixed_ips']])
|
||||||
usage_info.update(kw)
|
usage_info.update(kw)
|
||||||
return usage_info
|
return usage_info
|
||||||
|
|
||||||
@ -324,7 +365,7 @@ def last_octet(address):
|
|||||||
return int(address.split('.')[-1])
|
return int(address.split('.')[-1])
|
||||||
|
|
||||||
|
|
||||||
def get_my_linklocal(interface):
|
def get_my_linklocal(interface):
|
||||||
try:
|
try:
|
||||||
if_str = execute('ip', '-f', 'inet6', '-o', 'addr', 'show', interface)
|
if_str = execute('ip', '-f', 'inet6', '-o', 'addr', 'show', interface)
|
||||||
condition = '\s+inet6\s+([0-9a-f:]+)/\d+\s+scope\s+link'
|
condition = '\s+inet6\s+([0-9a-f:]+)/\d+\s+scope\s+link'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user