Skip to content

Commit

Permalink
Check vrouter release before schedule VM SI
Browse files Browse the repository at this point in the history
Check if the vrouter agent version supports to be scheduled for a
virtual machine that compose a service instance.

Change-Id: Id25144e7b67fcbae0e4e56d488a6f4025813b644
Closes-bug: #1412515
  • Loading branch information
Édouard Thuleau committed Jan 21, 2015
1 parent 82433a5 commit fa7b70c
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/config/common/svc_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
_ACTIVE_LOCAL_PREFERENCE = 200
_STANDBY_LOCAL_PREFERENCE = 100

# Version from the vrouter agent can manage service instances
_VROUTER_NETNS_SUPPORTED_VERSION = '1.10'

def get_management_if_str():
return _MGMT_STR

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
# @author: Edouard Thuleau, Cloudwatt.

import abc
import ast
from distutils.version import StrictVersion as V
import random
import six

from cfgm_common import analytics_client
from cfgm_common import svc_info
from sandesh_common.vns import constants
from vnc_api.vnc_api import NoIdError

Expand Down Expand Up @@ -71,9 +74,14 @@ def _get_candidates(self, si_uuid, vm_uuid):
else:
vr_list = self._vnc_lib.virtual_routers_list()['virtual-routers']

# check if vrouters are functional
# check if vrouters are functional and support service instance
vrs_fq_name = [vr['fq_name'] for vr in vr_list
if self.vrouter_running(vr['fq_name'][-1])]
vrs_fq_name = [vr_fq_name for vr_fq_name in vrs_fq_name
if self.vrouter_check_version(
vr_fq_name[-1],
svc_info._VROUTER_NETNS_SUPPORTED_VERSION)]

for vr_fq_name in vrs_fq_name:
try:
vr_obj = self._vnc_lib.virtual_router_read(fq_name=vr_fq_name)
Expand Down Expand Up @@ -115,6 +123,29 @@ def vrouter_running(self, vrouter_name):
return True
return False

def vrouter_check_version(self, vrouter_name, version):
"""Check the vrouter version is upper or equal to a desired version."""
path = "/analytics/uves/vrouter/"
fqdn_uuid = "%s?cfilt=VrouterAgent" % vrouter_name

try:
vrouter_agent = self._analytics.request(path, fqdn_uuid)
except analytics_client.OpenContrailAPIFailed:
return False

if not vrouter_agent:
return False

try:
build_info = ast.literal_eval(
vrouter_agent['VrouterAgent']['build_info'])
vrouter_version = V(build_info['build-info'][0]['build-version'])
requested_version = V(version)
except KeyError, ValueError:
return False

return vrouter_version >= requested_version

def _bind_vrouter(self, vm_uuid, vr_fq_name):
"""Bind the virtual machine to the vrouter which has been chosen."""
vm_obj = self._vnc_lib.virtual_machine_read(id=vm_uuid)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import unittest

import cfgm_common.analytics_client as analytics
import cfgm_common.svc_info as svc_info
from sandesh_common.vns import constants
import svc_monitor.scheduler.vrouter_scheduler as scheduler
from vnc_api.vnc_api import VirtualRouter, VirtualMachine
Expand Down Expand Up @@ -56,6 +57,9 @@
}
],
"description": "null"
},
"VrouterAgent": {
"build_info": "{\"build-info\":[{\"build-time\":\"2015-01-12 11:13:42.160435\",\"build-hostname\":\"vrouter1\",\"build-git-ver\":\"bdcb043\",\"build-user\":\"root\",\"build-version\":\"2.0\",\"build-id\":\"unknown\",\"build-number\":\"unknown\"}]}"
}
}

Expand Down Expand Up @@ -89,6 +93,9 @@
}
],
"description": "null"
},
"VrouterAgent": {
"build_info": "{\"build-info\":[{\"build-time\":\"2015-01-12 11:13:42.160435\",\"build-hostname\":\"vrouter1\",\"build-git-ver\":\"bdcb043\",\"build-user\":\"root\",\"build-version\":\"1.06\",\"build-id\":\"unknown\",\"build-number\":\"unknown\"}]}"
}
}

Expand Down Expand Up @@ -122,6 +129,9 @@
}
],
"description": "null"
},
"VrouterAgent": {
"build_info": "{\"build-info\":[{\"build-time\":\"2015-01-12 11:13:42.160435\",\"build-hostname\":\"vrouter1\",\"build-git-ver\":\"bdcb043\",\"build-user\":\"root\",\"build-version\":\"1.10\",\"build-id\":\"unknown\",\"build-number\":\"unknown\"}]}"
}
}

Expand Down Expand Up @@ -155,6 +165,9 @@
}
],
"description": "null"
},
"VrouterAgent": {
"build_info": "{\"build-info\":[{\"build-time\":\"2015-01-12 11:13:42.160435\",\"build-hostname\":\"vrouter1\",\"build-git-ver\":\"bdcb043\",\"build-user\":\"root\",\"build-version\":\"2.0\",\"build-id\":\"unknown\",\"build-number\":\"unknown\"}]}"
}
}

Expand Down Expand Up @@ -215,6 +228,8 @@ def test_get_candidates(self):

self.analytics_mock.side_effect = [RUNNING_VROUTER_UVES_STATUS,
NON_RUNNING_VROUTER_UVES_STATUS_3,
RUNNING_VROUTER_UVES_STATUS,
RUNNING_VROUTER_UVES_STATUS,
RUNNING_VROUTER_UVES_STATUS]

vr_obj = VirtualRouter()
Expand All @@ -239,6 +254,8 @@ def test_get_candidates(self):

self.analytics_mock.side_effect = [RUNNING_VROUTER_UVES_STATUS,
NON_RUNNING_VROUTER_UVES_STATUS_3,
RUNNING_VROUTER_UVES_STATUS,
RUNNING_VROUTER_UVES_STATUS,
RUNNING_VROUTER_UVES_STATUS]
self.vnc_mock.virtual_machine_read.side_effect = [vm_obj_1, vm_obj_2]

Expand All @@ -263,6 +280,26 @@ def test_vrouter_running(self):
self.assertFalse(self.scheduler.vrouter_running('fake_vrouter_name'))
self.assertTrue(self.scheduler.vrouter_running('fake_vrouter_name'))

def test_vrouter_check_version(self):
self.analytics_mock.side_effect = [analytics.OpenContrailAPIFailed,
NON_RUNNING_VROUTER_UVES_STATUS_1,
NON_RUNNING_VROUTER_UVES_STATUS_2,
NON_RUNNING_VROUTER_UVES_STATUS_3,
NON_RUNNING_VROUTER_UVES_STATUS_4,
RUNNING_VROUTER_UVES_STATUS]
self.assertFalse(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))
self.assertFalse(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))
self.assertTrue(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))
self.assertTrue(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))
self.assertFalse(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))
self.assertTrue(self.scheduler.vrouter_check_version(
'fake_vrouter_name', svc_info._VROUTER_NETNS_SUPPORTED_VERSION))

def test_random_scheduling(self):
random_patch = mock.patch('random.choice')
random_mock = random_patch.start()
Expand Down

0 comments on commit fa7b70c

Please sign in to comment.