From b77c12a7d69dc9960d40990f35b9c70da42c1705 Mon Sep 17 00:00:00 2001 From: Fabio Verboso Date: Fri, 24 Mar 2017 11:48:21 +0100 Subject: [PATCH] now boards receive their location Change-Id: I9808505e7e0d80f1e4c91788ea3ec59d90e32c56 --- iotronic/conductor/endpoints.py | 3 ++ iotronic/conductor/provisioner.py | 5 +++ iotronic/objects/location.py | 60 ++++++++++++++++++++----------- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/iotronic/conductor/endpoints.py b/iotronic/conductor/endpoints.py index 30bdd5e..20aa651 100644 --- a/iotronic/conductor/endpoints.py +++ b/iotronic/conductor/endpoints.py @@ -114,7 +114,10 @@ class ConductorEndpoint(object): prov.conf_registration_agent(self.ragent.wsurl) prov.conf_main_agent(agent.wsurl) + loc = objects.Location.list_by_board_uuid(ctx, board.uuid)[0] + prov.conf_location(loc) board.config = prov.get_config() + board.status = states.OFFLINE board.save() diff --git a/iotronic/conductor/provisioner.py b/iotronic/conductor/provisioner.py index d8d9386..94e0196 100644 --- a/iotronic/conductor/provisioner.py +++ b/iotronic/conductor/provisioner.py @@ -75,3 +75,8 @@ class Provisioner(object): if 'board' not in self.config['iotronic']: self.config['iotronic']['board'] = {} self.config['iotronic']['board']['token'] = "" + + def conf_location(self, location): + if "location" not in self.config['iotronic']['board']: + self.config['iotronic']['board']['location'] = {} + self.config['iotronic']['board']['location'] = location.get_geo() diff --git a/iotronic/objects/location.py b/iotronic/objects/location.py index 5030a9f..b13c067 100644 --- a/iotronic/objects/location.py +++ b/iotronic/objects/location.py @@ -59,6 +59,23 @@ class Location(base.IotronicObject): location = Location._from_db_object(cls(context), db_location) return location + def get_geo(self): + + updated = self._attr_to_primitive('updated_at') + created = self._attr_to_primitive('created_at') + + geo = { + 'longitude': self.longitude, + 'latitude': self.latitude, + 'altitude': self.altitude, + } + if updated is None: + geo['updated_at'] = created + else: + geo['updated_at'] = updated + + return geo + # @base.remotable_classmethod # def get(cls, context, location_id): # """Find a location based on its id or uuid and return @@ -199,24 +216,25 @@ class Location(base.IotronicObject): self.obj_reset_changes() - # @base.remotable - # def refresh(self, context=None): - # """Loads updates for this Location. - # - # Loads a location with the same uuid from the database and - # checks for updated attributes. Updates are applied from - # the loaded location column by column, if there are any updates. - # - # :param context: Security context. NOTE: This should only - # be used internally by the indirection_api. - # Unfortunately, RPC requires context as the first - # argument, even though we don't use it. - # A context should be set when instantiating the - # object, e.g.: Location(context) - # """ - # current = self.__class__.get_by_uuid(self._context, uuid=self.uuid) - # for field in self.fields: - # if (hasattr( - # self, base.get_attrname(field)) - # and self[field] != current[field]): - # self[field] = current[field] + # @base.remotable + # def refresh(self, context=None): + # """Loads updates for this Location. + # + # Loads a location with the same uuid from the database and + # checks for updated attributes. Updates are applied from + # the loaded location column by column, if there are any updates. + # + # :param context: Security context. NOTE: This should only + # be used internally by the indirection_api. + # Unfortunately, RPC requires context as the first + # argument, even though we don't use it. + # A context should be set when instantiating the + # object, e.g.: Location(context) + # """ + # current = self.__class__.get_by_uuid(self._context, + # uuid=self.uuid) + # for field in self.fields: + # if (hasattr( + # self, base.get_attrname(field)) + # and self[field] != current[field]): + # self[field] = current[field]