[CORD-2550] Fixing profile/enodeb update and adding debug info
[CORD-2714] Not adding profiles to the same handover

Change-Id: I7f84362c8de43753f9712f53fbf1bead3ece58f3
diff --git a/xos/synchronizer/steps/sync_progranserviceinstance.py b/xos/synchronizer/steps/sync_progranserviceinstance.py
index 11d679d..69a860e 100644
--- a/xos/synchronizer/steps/sync_progranserviceinstance.py
+++ b/xos/synchronizer/steps/sync_progranserviceinstance.py
@@ -16,7 +16,7 @@
 
 import os
 import sys
-from synchronizers.new_base.SyncInstanceUsingAnsible import SyncStep
+from synchronizers.new_base.syncstep import SyncStep
 from synchronizers.new_base.modelaccessor import ProgranServiceInstance, ENodeB, Handover
 
 from xosconfig import Config
@@ -40,9 +40,6 @@
 
     observes = ProgranServiceInstance
 
-    # Poll every 5 loops of self.call
-    poll = 0
-
     def sync_record(self, o):
         onos = ProgranHelpers.get_progran_onos_info()
 
@@ -50,13 +47,19 @@
 
         profile_url = "http://%s:%s/onos/progran/profile/" % (onos['url'], onos['port'])
         data = self.get_progran_profile_field(o)
+        log.debug("Sync'ing profile with data", request_data=data)
 
-        r = requests.post(profile_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+        if o.previously_sync == False:
+            log.debug("Sending POST")
+            r = requests.post(profile_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+        else:
+            log.debug("Sending PUT")
+            r = requests.put(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())
         if o.enodeb_id:
             log.info("adding profile %s to enodeb %s" % (o.id, o.enodeb.enbId), object=str(o), **o.tologdict())
             enodeb_url = "http://%s:%s/onos/progran/enodeb/%s/profile" % (onos['url'], onos['port'], o.enodeb.enbId)
@@ -65,6 +68,7 @@
                     o.name
                 ]
             }
+            log.debug("Adding enodeb to profile with data", request_data=data)
             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
@@ -78,7 +82,7 @@
             o.active_enodeb_id = 0 # removing the value because it has been deleted
             log.info("EnodeB synchronized", response=r.json())
 
-        o.save()
+        o.previously_sync = True
 
     def get_handover_for_profile(self, o):
         return {
@@ -124,103 +128,4 @@
         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()