Support for multiple containers on same instance for ceilometer service
diff --git a/xos/ceilometer/models.py b/xos/ceilometer/models.py
index a838c4e..3da29dd 100644
--- a/xos/ceilometer/models.py
+++ b/xos/ceilometer/models.py
@@ -29,7 +29,7 @@
sync_attributes = ("private_ip", "private_mac",
"ceilometer_ip", "ceilometer_mac",
- "nat_ip", "nat_mac",)
+ "nat_ip", "nat_mac", "ceilometer_port",)
default_attributes = {}
def __init__(self, *args, **kwargs):
@@ -37,6 +37,7 @@
if ceilometer_services:
self._meta.get_field("provider_service").default = ceilometer_services[0].id
super(MonitoringChannel, self).__init__(*args, **kwargs)
+ self.set_attribute("use_same_instance_for_multiple_tenants", True)
def save(self, *args, **kwargs):
if not self.creator:
@@ -62,7 +63,7 @@
@property
def addresses(self):
- if not self.instance:
+ if (not self.id) or (not self.instance):
return {}
addresses = {}
@@ -132,10 +133,17 @@
return ", ".join(self.tenant_list)
@property
+ def ceilometer_port(self):
+ # TODO: Find a better logic to choose unique ceilometer port number for each instance
+ if not self.id:
+ return None
+ return 8888+self.id
+
+ @property
def ceilometer_url(self):
if not self.ceilometer_ip:
return None
- return "http://" + self.private_ip + ":8888/"
+ return "http://" + self.private_ip + ":" + str(self.ceilometer_port) + "/"
def model_policy_monitoring_channel(pk):
# TODO: this should be made in to a real model_policy
diff --git a/xos/configurations/cord/install_ceilometer_vcpe_notification_listener.sh b/xos/configurations/cord/install_ceilometer_vcpe_notification_listener.sh
index 50a4132..1992e80 100755
--- a/xos/configurations/cord/install_ceilometer_vcpe_notification_listener.sh
+++ b/xos/configurations/cord/install_ceilometer_vcpe_notification_listener.sh
@@ -11,6 +11,6 @@
echo "Copying the ceilometer vcpe notification agent files /usr/lib/python2.7/dist-packages/ceilometer"
tar -xzf ceilometer_vcpe_notification_agent.tar.gz
sudo mv ceilometer/network/ext_services /usr/lib/python2.7/dist-packages/ceilometer/network/
-sudo mv ceilometer-2015.1.1.egg-info/entry_points.txt /usr/lib/python2.7/dist-packages/ceilometer-2015.1.1.egg-info/
+sudo mv ceilometer-2015.1.1.egg-info/entry_points.txt /usr/lib/python2.7/dist-packages/ceilometer-*egg-info/
echo "Restarting ceilometer-agent-notification"
sudo service ceilometer-agent-notification restart
diff --git a/xos/core/models/service.py b/xos/core/models/service.py
index 6cb7a9d..fe70820 100644
--- a/xos/core/models/service.py
+++ b/xos/core/models/service.py
@@ -364,16 +364,31 @@
if getattr(self, "cached_instance", None):
return self.cached_instance
instance_id=self.get_attribute("instance_id")
- if not instance_id:
- return None
- instances=Instance.objects.filter(id=instance_id)
- if not instances:
- return None
- instance=instances[0]
+ instance = None
+ if instance_id:
+ instances=Instance.objects.filter(id=instance_id)
+ instance=instances[0]
+ if not instance:
+ if not self.get_attribute("use_same_instance_for_multiple_tenants", default=False):
+ return None
+ if not self.provider_service.slices.count():
+ raise XOSConfigurationError("The service has no associated slices")
+ slices = self.provider_service.slices.all()
+ instance = self.pick_least_loaded_instance_in_slice(slices)
+ if not instance:
+ return None
instance.caller = self.creator
self.cached_instance = instance
return instance
+ def pick_least_loaded_instance_in_slice(self, slices):
+ for slice in slices:
+ if slice.instances.all().count() > 0:
+ #TODO: Temporarily returning the first instance in the slice
+ #TODO: Change logic to pick instance based on number of monitoring channels ruuning in each instance
+ return slice.instances.all()[0]
+ return None
+
@instance.setter
def instance(self, value):
if value:
diff --git a/xos/observers/monitoring_channel/steps/sync_monitoringchannel.yaml b/xos/observers/monitoring_channel/steps/sync_monitoringchannel.yaml
index bbe284f..fb4b73d 100644
--- a/xos/observers/monitoring_channel/steps/sync_monitoringchannel.yaml
+++ b/xos/observers/monitoring_channel/steps/sync_monitoringchannel.yaml
@@ -15,6 +15,7 @@
headnode_flat_lan_ip: {{ rabbit_host }}
ceilometer_client_acess_ip: {{ ceilometer_ip }}
ceilometer_client_acess_mac: {{ ceilometer_mac }}
+ ceilometer_host_port: {{ ceilometer_port }}
allowed_tenant_ids:
{% for allowed_tenant_id in allowed_tenant_ids %}
- {{ allowed_tenant_id }}
diff --git a/xos/observers/monitoring_channel/templates/start-monitoring-channel.sh.j2 b/xos/observers/monitoring_channel/templates/start-monitoring-channel.sh.j2
index 10d9ef5..f56c247 100755
--- a/xos/observers/monitoring_channel/templates/start-monitoring-channel.sh.j2
+++ b/xos/observers/monitoring_channel/templates/start-monitoring-channel.sh.j2
@@ -15,13 +15,14 @@
MONITORING_CHANNEL=monitoring-channel-{{ unique_id }}
HEADNODEFLATLANIP={{ headnode_flat_lan_ip }}
+HOST_FORWARDING_PORT_FOR_CEILOMETER={{ ceilometer_host_port }}
docker inspect $MONITORING_CHANNEL > /dev/null 2>&1
if [ "$?" == 1 ]
then
#sudo docker build -t monitoring-channel -f Dockerfile.monitoring_channel .
sudo docker pull srikanthvavila/monitoring-channel
- docker run -d --name=$MONITORING_CHANNEL --add-host="ctl:$HEADNODEFLATLANIP" --privileged=true -p 8888:8000 srikanthvavila/monitoring-channel
+ docker run -d --name=$MONITORING_CHANNEL --add-host="ctl:$HEADNODEFLATLANIP" --privileged=true -p $HOST_FORWARDING_PORT_FOR_CEILOMETER:8000 srikanthvavila/monitoring-channel
else
docker start $MONITORING_CHANNEL
fi