def _from_db_object(resource, context, db_resource, only_fields=None): if db_resource is None: return None for field in resource.fields: if (only_fields is not None and field not in only_fields and field != 'id'): continue if field == 'data': resource['data'] = [ resource_data.ResourceData._from_db_object( resource_data.ResourceData(context), resd) for resd in db_resource.data ] elif field != 'attr_data': resource[field] = db_resource[field] if db_resource['rsrc_prop_data_id'] is not None: if hasattr(db_resource, '__dict__'): rpd_obj = db_resource.__dict__.get('rsrc_prop_data') else: rpd_obj = None if rpd_obj is not None: # Object is already eager loaded rpd_obj = (rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(), context, rpd_obj)) resource._properties_data = rpd_obj.data else: resource._properties_data = {} if db_resource['properties_data']: LOG.error( 'Unexpected condition where resource.rsrc_prop_data ' 'and resource.properties_data are both not null. ' 'rsrc_prop_data.id: %(rsrc_prop_data_id)s, ' 'resource id: %(res_id)s', { 'rsrc_prop_data_id': resource['rsrc_prop_data'].id, 'res_id': resource['id'] }) elif db_resource['properties_data']: # legacy field if db_resource['properties_data_encrypted']: decrypted_data = crypt.decrypted_dict( db_resource['properties_data']) resource._properties_data = decrypted_data else: resource._properties_data = db_resource['properties_data'] else: resource._properties_data = None if db_resource['attr_data'] is not None: resource._attr_data = rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(context), context, db_resource['attr_data']).data else: resource._attr_data = None resource._context = context resource.obj_reset_changes() return resource
def _from_db_object(context, event, db_event): event._resource_properties = None for field in event.fields: if field == 'resource_status_reason': # this works whether db_event is a dict or db ref event[field] = db_event['_resource_status_reason'] else: event[field] = db_event[field] if db_event['rsrc_prop_data_id'] is None: event._resource_properties = db_event['resource_properties'] or {} else: if hasattr(db_event, '__dict__'): rpd_obj = db_event.__dict__.get('rsrc_prop_data') elif hasattr(db_event, 'rsrc_prop_data'): rpd_obj = db_event['rsrc_prop_data'] else: rpd_obj = None if rpd_obj is not None: # Object is already eager loaded rpd_obj = ( rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(), context, rpd_obj)) event._resource_properties = rpd_obj.data event._context = context event.obj_reset_changes() return event
def _get_rpd_and_db_obj(self): rpd_obj = rpd_object.ResourcePropertiesData().create(self.ctx, self.data) db_obj = self.ctx.session.query( models.ResourcePropertiesData).get(rpd_obj.id) self.assertEqual(len(self.data), len(db_obj['data'])) return rpd_obj, db_obj
def _from_db_object(resource, context, db_resource): if db_resource is None: return None for field in resource.fields: if field == 'data': resource['data'] = [ resource_data.ResourceData._from_db_object( resource_data.ResourceData(context), resd) for resd in db_resource.data ] else: resource[field] = db_resource[field] if db_resource['rsrc_prop_data'] is not None: resource['rsrc_prop_data'] = \ rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(context), context, db_resource['rsrc_prop_data']) resource._properties_data = resource['rsrc_prop_data'].data if db_resource['properties_data']: LOG.error( 'Unexpected condition where resource.rsrc_prop_data ' 'and resource.properties_data are both not null. ' 'rsrc_prop_data.id: %(rsrc_prop_data_id)s, ' 'resource id: %(res_id)s', { 'rsrc_prop_data_id': resource['rsrc_prop_data'].id, 'res_id': resource['id'] }) elif db_resource['properties_data']: # legacy field if db_resource['properties_data_encrypted']: decrypted_data = crypt.decrypted_dict( db_resource['properties_data']) resource._properties_data = decrypted_data else: resource._properties_data = db_resource['properties_data'] else: resource._properties_data = {} if db_resource['attr_data'] is not None: resource['attr_data'] = \ rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(context), context, db_resource['attr_data']) resource._context = context resource.obj_reset_changes() return resource
def test_event_object_resource_properties_data(self): cfg.CONF.set_override('encrypt_parameters_and_properties', True) data = {'p1': 'hello', 'p2': 'too soon?'} rpd_obj = rpd_object.ResourcePropertiesData().create(self.ctx, data) e_obj = event_object.Event().create( self.ctx, { 'stack_id': self.stack.id, 'uuid': str(uuid.uuid4()), 'rsrc_prop_data_id': rpd_obj.id }) e_obj = event_object.Event.get_all_by_stack(utils.dummy_context(), self.stack.id)[0] # properties data appears unencrypted to event object self.assertEqual(data, e_obj.resource_properties)
def _from_db_object(context, event, db_event): for field in event.fields: event[field] = db_event[field] if db_event['rsrc_prop_data']: event['rsrc_prop_data'] = \ rpd.ResourcePropertiesData._from_db_object( rpd.ResourcePropertiesData(context), context, db_event['rsrc_prop_data']) event._resource_properties = event['rsrc_prop_data'].data else: event._resource_properties = db_event['resource_properties'] or {} event._context = context event.obj_reset_changes() return event
def test_rsrc_prop_data_encrypt(self): cfg.CONF.set_override('encrypt_parameters_and_properties', True) rpd_obj, db_obj = self._get_rpd_and_db_obj() # verify data is encrypted in the db self.assertNotEqual(db_obj['data'], self.data) for key in self.data: self.assertEqual('cryptography_decrypt_v1', db_obj['data'][key][0]) # verify rpd_obj data is unencrypted self.assertEqual(self.data, rpd_obj['data']) # verify loading a fresh rpd_obj has decrypted data rpd_obj = rpd_object.ResourcePropertiesData._from_db_object( rpd_object.ResourcePropertiesData(self.ctx), self.ctx, db_obj) self.assertEqual(self.data, rpd_obj['data'])
def test_event_object_resource_properties_data(self): cfg.CONF.set_override('encrypt_parameters_and_properties', True, enforce_type=True) data = {'p1': 'hello', 'p2': 'too soon?'} rpd_obj = rpd_object.ResourcePropertiesData().create(self.ctx, data) rpd_db_obj = self.ctx.session.query(models.ResourcePropertiesData).get( rpd_obj.id) e_obj = event_object.Event().create( self.ctx, { 'stack_id': self.stack.id, 'uuid': str(uuid.uuid4()), 'rsrc_prop_data': rpd_db_obj }) e_obj = event_object.Event().get_by_id(utils.dummy_context(), e_obj.id) # properties data appears unencrypted to event object self.assertEqual(data, e_obj.rsrc_prop_data.data)