blob: bc5674797edfb133fe828b7724decd0a57f72038 [file] [log] [blame]
# Copyright 2017-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from mock import Mock
import random
def mock_enumerator(items):
e = lambda:None
e.all = lambda:items
return e
# A list of all mock object stores that have been created
AllMockObjectStores = []
class MockObjectList:
item_list = None
def __init__(self, initial=None):
self.id_counter = 0
if initial:
self.item_list=initial
elif self.item_list is None:
self.item_list=[]
def get_items(self):
return self.item_list
def count(self):
return len(self.get_items())
def first(self):
return self.get_items()[0]
def all(self):
return self.get_items()
def filter(self, **kwargs):
items = self.get_items()
for (k,v) in kwargs.items():
items = [x for x in items if getattr(x,k) == v]
return items
def get(self, **kwargs):
objs = self.filter(**kwargs)
if not objs:
raise IndexError("No objects matching %s" % str(kwargs))
return objs[0]
class MockObjectStore(MockObjectList):
def save(self, o):
if (not hasattr(o,"id")) or (not o.id) or (o.id==98052):
for item in self.get_items():
if item.id >= self.id_counter:
self.id_counter = item.id + 1
o.id = self.id_counter
self.id_counter = self.id_counter + 1
for item in self.get_items():
if item.id == o.id:
item = o
break
else:
self.get_items().append(o)
class MockObject(object):
objects = None
id = None
deleted = False
field_names = []
def __init__(self, **kwargs):
object.__setattr__(self, 'is_set', {})
setattr(self, 'backend_code', 0)
setattr(self, 'id', 98052)
setattr(self, 'pk', random.randint(0, 1<<30))
self.leaf_model = self
# reset is_set
self.is_set = {}
for (k,v) in kwargs.items():
setattr(self,k,v)
self.is_new = True
self._initial = self._dict
def __setattr__(self, name, value):
self.is_set[name] = True
object.__setattr__(self, name, value)
@property
def self_content_type_id(self):
return self.__class__.__name__
def save(self, update_fields=[], always_update_timestamp=False):
if self.objects:
self.objects.save(self)
def delete(self):
pass
def tologdict(self):
return {}
@property
def _dict(self):
d={}
for name in self.field_names:
if self.is_set.get(name, False):
d[name] = getattr(self, name)
return d
@property
def diff(self):
d1 = self._initial
d2 = self._dict
all_field_names = self.field_names
diffs=[]
for k in all_field_names:
if (d1.get(k,None) != d2.get(k,None)):
diffs.append( (k, (d1.get(k,None), d2.get(k,None))) )
return dict(diffs)
@property
def has_changed(self):
return bool(self.diff)
@property
def changed_fields(self):
if self.is_new:
return self._dict.keys()
return self.diff.keys()
def has_field_changed(self, field_name):
return field_name in self.diff.keys()
def get_field_diff(self, field_name):
return self.diff.get(field_name, None)
def recompute_initial(self):
self._initial = self._dict
def save_changed_fields(self, always_update_timestamp=False):
if self.has_changed:
update_fields = self.changed_fields
if always_update_timestamp and "updated" not in update_fields:
update_fields.append("updated")
self.save(update_fields=sorted(update_fields), always_update_timestamp=always_update_timestamp)
def get_MockObjectStore(x):
store = globals()["Mock%sObjects" % x]()
if not store in AllMockObjectStores:
AllMockObjectStores.append(store)
return store
class ModelAccessor(object):
def check_db_connection_okay(self):
return True
def connection_close(self):
pass
def journal_object(self, *args, **kwargs):
pass
def obj_exists(self, o):
# gRPC will default id to '0' for uninitialized objects
return (o.id is not None) and (o.id != 0)
def fetch_pending(self, model, deleted = False):
num = random.randint(1, 5)
object_list = []
for i in range(num):
if isinstance(model, list):
model = model[0]
try:
obj = model()
except:
import pdb
pdb.set_trace()
obj.name = "Opinionated Berry %d"%i
object_list.append(obj)
return object_list
def reset_all_object_stores(self):
for store in AllMockObjectStores:
store.items = []
def get_model_class(self, classname):
return globals()[classname]
def has_model_class(self, classname):
return classname in globals()
def __getattr__(self, name):
""" Wrapper for getattr to facilitate retrieval of classes """
has_model_class = self.__getattribute__("has_model_class")
get_model_class = self.__getattribute__("get_model_class")
if has_model_class(name):
return get_model_class(name)
# Default behaviour
return self.__getattribute__(name)
model_accessor = ModelAccessor()
def get_first_site():
return model_accessor.Site.objects.first().id
class ObjectSet(object):
def __init__(self, objects):
self.objects = objects
def all(self):
return self.objects
#####
# DO NOT MODIFY THE CLASSES BELOW. THEY ARE AUTOGENERATED.
#
{% for m in proto.messages -%}
class Mock{{ m.name }}Objects(MockObjectStore): pass
class {{ m.name }}(MockObject):
objects = get_MockObjectStore("{{ m.name }}")
{% for f in xproto_base_fields(m, proto.message_table) + m.fields -%}
{{ f.name }} = {{ xproto_first_non_empty([f.options.default, "None"]) }}
{% if f.link -%}{{ f.name }}_id = None{% endif %}
{% endfor %}
leaf_model_name = "{{ m.name }}"
field_names = ["id", \
{% for f in xproto_base_fields(m, proto.message_table) + m.fields -%}
"{{ f.name }}",
{% endfor %}
]
{% endfor %}