Merge branch 'master' of github.com:open-cloud/xos
diff --git a/xos/cord/models.py b/xos/cord/models.py
index 483b76b..cab7909 100644
--- a/xos/cord/models.py
+++ b/xos/cord/models.py
@@ -203,7 +203,7 @@
# There's a bit of a race here; some other user could be trying to
# allocate a bbs_account at the same time we are.
- for i in range(1,21):
+ for i in range(2,21):
account_name = "bbs%02d@onlab.us" % i
if (account_name not in bbs_accounts):
return account_name
@@ -236,7 +236,8 @@
"cdn_enable": False,
"sliver_id": None,
"users": [],
- "bbs_account": None}
+ "bbs_account": None,
+ "last_ansible_hash": None}
def __init__(self, *args, **kwargs):
super(VCPETenant, self).__init__(*args, **kwargs)
@@ -389,6 +390,14 @@
return self.set_attribute("bbs_account", value)
@property
+ def last_ansible_hash(self):
+ return self.get_attribute("last_ansible_hash", self.default_attributes["last_ansible_hash"])
+
+ @last_ansible_hash.setter
+ def last_ansible_hash(self, value):
+ return self.set_attribute("last_ansible_hash", value)
+
+ @property
def ssh_command(self):
if self.sliver:
return self.sliver.get_ssh_command()
@@ -513,6 +522,14 @@
def hpc_client_ip(self):
return self.addresses.get("hpc_client",None)
+ @property
+ def is_synced(self):
+ return (self.enacted is not None) and (self.enacted >= self.updated)
+
+ @is_synced.setter
+ def is_synced(self, value):
+ pass
+
def pick_node(self):
nodes = list(Node.objects.all())
# TODO: logic to filter nodes by which nodes are up, and which
@@ -595,7 +612,10 @@
if not self.bbs_account:
# make sure we use the proxied VCPEService object, not the generic Service object
vcpe_service = VCPEService.objects.get(id=self.provider_service.id)
- self.bbs_account = vcpe_service.allocate_bbs_account()
+ if self.service_specific_id=="SYNCME":
+ self.bbs_account = "bbs01@onlab.us"
+ else:
+ self.bbs_account = vcpe_service.allocate_bbs_account()
super(VCPETenant, self).save()
else:
if self.bbs_account:
diff --git a/xos/core/xoslib/methods/cordsubscriber.py b/xos/core/xoslib/methods/cordsubscriber.py
index 79a1442..5e8a60c 100644
--- a/xos/core/xoslib/methods/cordsubscriber.py
+++ b/xos/core/xoslib/methods/cordsubscriber.py
@@ -51,6 +51,8 @@
wan_mac = ReadOnlyField()
+ vcpe_synced = serializers.BooleanField()
+
humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
class Meta:
@@ -62,6 +64,7 @@
'url_filter_enable', 'url_filter_rules', 'url_filter_level',
'bbs_account',
'ssh_command',
+ 'vcpe_synced',
'cdn_enable', 'vbng_id', 'routeable_subnet', 'nat_ip', 'lan_ip', 'wan_ip', 'private_ip', 'wan_mac')
@@ -197,6 +200,7 @@
@classmethod
def get_urlpatterns(self):
patterns = super(CordSubscriberViewSet, self).get_urlpatterns()
+ patterns.append( self.detail_url("vcpe_synced/$", {"get": "get_vcpe_synced"}, "vcpe_synced") )
patterns.append( self.detail_url("url_filter/$", {"get": "get_url_filter"}, "url_filter") )
patterns.append( self.detail_url("url_filter/(?P<level>[a-zA-Z0-9\-_]+)/$", {"put": "set_url_filter"}, "url_filter") )
patterns.append( self.detail_url("services/$", {"get": "get_services"}, "services") )
@@ -227,6 +231,10 @@
return Response({"subscribers": serializer.data})
+ def get_vcpe_synced(self, request, pk=None):
+ subscriber = self.get_object()
+ return Response({"vcpe_synced": subscriber.vcpe_synced})
+
def get_url_filter(self, request, pk=None):
subscriber = self.get_object()
return Response({"level": subscriber.url_filter_level})
@@ -314,10 +322,10 @@
def setup_demo_vcpe(self, voltTenant):
# nuke the users and start over
voltTenant.vcpe.users = []
- voltTenant.vcpe.create_user(name="Mom's PC", mac="01020303040506", level="PG_13")
- voltTenant.vcpe.create_user(name="Dad's PC", mac="01020304040507", level="PG_13")
- voltTenant.vcpe.create_user(name="Jack's iPhone", mac="01020304050508", level="PG_13")
- voltTenant.vcpe.create_user(name="Jill's iPad", mac="01020304050609", level="PG_13")
+ voltTenant.vcpe.create_user(name="Mom's PC", mac="010203040506", level="PG_13")
+ voltTenant.vcpe.create_user(name="Dad's PC", mac="90E2Ba82F975", level="PG_13")
+ voltTenant.vcpe.create_user(name="Jack's iPhone", mac="A85B780F2651", level="PG_13")
+ voltTenant.vcpe.create_user(name="Jill's iPad", mac="010203040509", level="PG_13")
voltTenant.vcpe.save()
def initdemo(self, request):
diff --git a/xos/core/xoslib/objects/cordsubscriber.py b/xos/core/xoslib/objects/cordsubscriber.py
index 4719a13..1a376ad 100644
--- a/xos/core/xoslib/objects/cordsubscriber.py
+++ b/xos/core/xoslib/objects/cordsubscriber.py
@@ -50,6 +50,7 @@
("private_ip", "vcpe.private_ip"),
("wan_ip", "vcpe.wan_ip"),
("wan_mac", "vcpe.wan_mac"),
+ ("vcpe_synced", "vcpe.is_synced"),
)
def __getattr__(self, key):
diff --git a/xos/core/xoslib/templates/xosCordSubscriber.html b/xos/core/xoslib/templates/xosCordSubscriber.html
index 67568ec..52a62f2 100644
--- a/xos/core/xoslib/templates/xosCordSubscriber.html
+++ b/xos/core/xoslib/templates/xosCordSubscriber.html
@@ -17,6 +17,7 @@
<h3>vCPE</h3>
<table class="xos-detail-table cord-subscriber-table">
<tr><td class="xos-label-cell">Id:</td><td><%= model.attributes.vcpe_id %></td></tr>
+ <tr><td class="xos-label-cell">Synced:</td><td><% if (model.attributes.vcpe_synced) { print("Yes"); } else { print("No"); } %></td></tr>
<tr><td class="xos-label-cell">Image:</td><td><%= model.attributes.image_name %></td></tr>
<tr><td class="xos-label-cell">Sliver Id:</td><td><%= model.attributes.sliver %></td></tr>
<tr><td class="xos-label-cell">Firewall:</td><td><input type="checkbox" name="firewall_enable" <% if (model.attributes.firewall_enable) print("checked"); %>>Enable<br>
diff --git a/xos/observers/vbng/steps/sync_vbngtenant.py b/xos/observers/vbng/steps/sync_vbngtenant.py
index 9dec0de..07d1635 100644
--- a/xos/observers/vbng/steps/sync_vbngtenant.py
+++ b/xos/observers/vbng/steps/sync_vbngtenant.py
@@ -77,8 +77,8 @@
logger.info("received public IP %s from private IP %s" % (r.text, private_ip))
o.routeable_subnet = r.text
o.mapped_ip = private_ip
- c.mapped_mac = private_mac
- c.mapped_hostname = private_hostname
+ o.mapped_mac = private_mac
+ o.mapped_hostname = private_hostname
o.save()
diff --git a/xos/observers/vcpe/steps/sync_vcpetenant.py b/xos/observers/vcpe/steps/sync_vcpetenant.py
index d2afed5..910cc4c 100644
--- a/xos/observers/vcpe/steps/sync_vcpetenant.py
+++ b/xos/observers/vcpe/steps/sync_vcpetenant.py
@@ -1,7 +1,9 @@
+import hashlib
import os
import socket
import sys
import base64
+import time
from django.db.models import F, Q
from xos.config import Config
from observer.syncstep import SyncStep
@@ -110,7 +112,16 @@
fields[attribute_name] = getattr(o, attribute_name)
fields.update(self.get_extra_attributes(o))
- run_template_ssh(self.template_name, fields)
+
+ ansible_hash = hashlib.md5(repr(sorted(fields.items()))).hexdigest()
+ quick_update = (o.last_ansible_hash == ansible_hash)
+
+ if quick_update:
+ logger.info("quick_update triggered; skipping ansible recipe")
+ else:
+ tStart = time.time()
+ run_template_ssh(self.template_name, fields)
+ logger.info("playbook execution time %d" % int(time.time()-tStart))
if o.url_filter_enable:
if (str(o.service_specific_id) != "SYNCME"):
@@ -118,9 +129,12 @@
# Also fix the spot in cord/models.py
logger.info("skipping sync of URL filter for SSID %s" % str(o.service_specific_id))
else:
+ tStart = time.time()
bbs = BBS(o.bbs_account, "123")
bbs.sync(o.url_filter_level, o.users)
+ logger.info("bbs update tiem %d" % int(time.time()-tStart))
+ o.last_ansible_hash = ansible_hash
o.save()
def delete_record(self, m):
diff --git a/xos/observers/vcpe/steps/sync_vcpetenant.yaml b/xos/observers/vcpe/steps/sync_vcpetenant.yaml
index a280b33..5adb144 100644
--- a/xos/observers/vcpe/steps/sync_vcpetenant.yaml
+++ b/xos/observers/vcpe/steps/sync_vcpetenant.yaml
@@ -1,5 +1,6 @@
---
- hosts: {{ sliver_name }}
+ gather_facts: False
connection: ssh
user: ubuntu
sudo: yes
@@ -28,6 +29,7 @@
wan_mac: {{ wan_mac }}
tasks:
+{% if full_setup %}
- name: Docker repository
copy: src=/opt/xos/observers/vcpe/files/docker.list
dest=/etc/apt/sources.list.d/docker.list
@@ -54,14 +56,17 @@
- name: make sure /etc/dnsmasq.d exists
file: path=/etc/dnsmasq.d state=directory owner=root group=root
-
+{% endif %}
+
- name: dnsmasq config
template: src=/opt/xos/observers/vcpe/templates/dnsmasq_servers.j2 dest=/etc/dnsmasq.d/servers.conf owner=root group=root
notify:
- restart vcpe
- - name: networking info
- template: src=/opt/xos/observers/vcpe/templates/vlan_sample.j2 dest=/etc/vlan_sample owner=root group=root
+# These are samples, not necessary for correct function of demo
+
+# - name: networking info
+# template: src=/opt/xos/observers/vcpe/templates/vlan_sample.j2 dest=/etc/vlan_sample owner=root group=root
- name: firewall info
template: src=/opt/xos/observers/vcpe/templates/firewall_sample.j2 dest=/etc/firewall_sample owner=root group=root
diff --git a/xos/openstack_observer/syncstep.py b/xos/openstack_observer/syncstep.py
index fb06bdd..3dadbf4 100644
--- a/xos/openstack_observer/syncstep.py
+++ b/xos/openstack_observer/syncstep.py
@@ -150,7 +150,7 @@
try:
error = self.error_map.map(str_e)
except:
- error = '2 - %s'%str_e
+ error = '%s'%str_e
if isinstance(e, InnocuousException) and not force_error:
o.backend_status = '1 - %s'%error