[CORD-2675] Polling profiles
Change-Id: Ic47e88341a74384cb57d959bf2d01e1a8addbd8c
diff --git a/xos/synchronizer/steps/sync_progranserviceinstance.py b/xos/synchronizer/steps/sync_progranserviceinstance.py
index 14925bc..11d679d 100644
--- a/xos/synchronizer/steps/sync_progranserviceinstance.py
+++ b/xos/synchronizer/steps/sync_progranserviceinstance.py
@@ -17,14 +17,15 @@
import os
import sys
from synchronizers.new_base.SyncInstanceUsingAnsible import SyncStep
-from synchronizers.new_base.ansible_helper import run_template
-from synchronizers.new_base.modelaccessor import ProgranServiceInstance, ENodeB
+from synchronizers.new_base.modelaccessor import ProgranServiceInstance, ENodeB, Handover
from xosconfig import Config
from multistructlog import create_logger
import json
import requests
from requests.auth import HTTPBasicAuth
+import time
+import datetime
log = create_logger(Config().get('logging'))
@@ -39,6 +40,9 @@
observes = ProgranServiceInstance
+ # Poll every 5 loops of self.call
+ poll = 0
+
def sync_record(self, o):
onos = ProgranHelpers.get_progran_onos_info()
@@ -48,6 +52,8 @@
data = self.get_progran_profile_field(o)
r = requests.post(profile_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+
+ ProgranHelpers.get_progran_rest_errors(r)
log.info("Profile synchronized", response=r.json())
log.info("sync'ing enodeb", object=str(o), **o.tologdict())
@@ -60,6 +66,7 @@
]
}
r = requests.post(enodeb_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+ ProgranHelpers.get_progran_rest_errors(r)
o.active_enodeb_id = o.enodeb_id # storing the value to know when it will be deleted
log.info("EnodeB synchronized", response=r.json())
elif o.active_enodeb_id:
@@ -67,12 +74,12 @@
log.info("removing profile %s from enodeb %s" % (o.name, o.active_enodeb_id), object=str(o), **o.tologdict())
enodeb_url = "http://%s:%s/onos/progran/enodeb/%s/profile/%s" % (onos['url'], onos['port'], enb_id, o.name)
r = requests.delete(enodeb_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
+ ProgranHelpers.get_progran_rest_errors(r)
o.active_enodeb_id = 0 # removing the value because it has been deleted
log.info("EnodeB synchronized", response=r.json())
o.save()
-
def get_handover_for_profile(self, o):
return {
"A3Hysteresis": o.handover.HysteresisA3,
@@ -114,4 +121,106 @@
profile_url = "http://%s:%s/onos/progran/profile/%s" % (onos['url'], onos['port'], o.name)
r = requests.delete(profile_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
o.active_enodeb_id = 0 # removing the value because it has been deleted
- log.info("Profile synchronized", response=r.json())
\ No newline at end of file
+ log.info("Profile synchronized", response=r.json())
+
+ def fetch_pending(self, deleted):
+ # self.read_profiles_from_progran()
+ return super(SyncProgranServiceInstance, self).fetch_pending(deleted)
+
+ @staticmethod
+ def date_to_time(d):
+ if len(d) == 0:
+ return 0
+ return time.mktime(datetime.datetime.strptime(d, "%d.%m.%Y %H:%S").timetuple())
+
+ @staticmethod
+ def update_fields(model, dict, mapping={}, transformations={}):
+ dict = SyncProgranServiceInstance.convert_keys(dict, mapping, transformations)
+ for k, v in dict.iteritems():
+ if hasattr(model, k):
+ setattr(model, k, v)
+ else:
+ log.warn("%s does not have a '%s' property, not updating it" % (model.model_name, k))
+ return model
+
+ @staticmethod
+ def convert_keys(dict, mapping={}, transformations={}):
+ for k, v in dict.iteritems():
+ if k in mapping:
+ # apply custom transformations to the data
+ if k in transformations:
+ dict[k] = transformations[k](v)
+
+ # NOTE we may have different names that the field in the dict
+ dict[mapping[k]] = dict[k]
+ del dict[k]
+ return dict
+
+
+ def my_call(self, failed=[], deletion=False):
+ """
+ Read profile from progran and save them in xos
+ """
+ if self.poll < 5:
+ self.poll = self.poll + 1
+ else:
+ self.poll = 0
+ onos = ProgranHelpers.get_progran_onos_info()
+ profile_url = "http://%s:%s/onos/progran/profile/" % (onos['url'], onos['port'])
+ r = requests.get(profile_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
+ res = r.json()['ProfileArray']
+
+ # remove default profiles
+ res = [p for p in res if "Default" not in p['Name']]
+
+ field_mapping = {
+ 'Name': 'name',
+ 'Start': 'start',
+ 'End': 'end'
+ }
+
+ field_transformations = {
+ 'Start': SyncProgranServiceInstance.date_to_time,
+ 'End': SyncProgranServiceInstance.date_to_time
+ }
+
+ handover_mapping = {
+ 'A5Hysteresis': 'HysteresisA5',
+ 'A3Hysteresis': 'HysteresisA3'
+ }
+
+ for p in res:
+
+ # checking for handovers
+ handover_dict = p['Handover']
+ handover_dict = SyncProgranServiceInstance.convert_keys(handover_dict, handover_mapping)
+ del p['Handover']
+
+ try:
+ handover = Handover.objects.get(**handover_dict)
+ log.info("handover already exists, updating it", handover=handover_dict)
+ except IndexError:
+ handover = Handover()
+ handover = SyncProgranServiceInstance.update_fields(handover, handover_dict)
+ log.info("handover is new, creating it", handover=handover_dict)
+
+ handover.save()
+
+ # checking for profiles
+ try:
+ si = ProgranServiceInstance.objects.get(name=p['Name'])
+ log.info("Profile %s already exists, updating it" % p['Name'])
+ except IndexError:
+ si = ProgranServiceInstance()
+ si.name = p['Name']
+ log.info("Profile %s is new, creating it" % p['Name'])
+
+ si = SyncProgranServiceInstance.update_fields(si, p, field_mapping, field_transformations)
+ si.handover = handover
+
+
+
+ # TODO keep track of the deleted profiles
+ # existing profiles - updated profiles = deleted profiles
+
+ si.save()