[Kimchi-devel] [PATCH 00/13][WIP] Refactor model
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Jan 21 17:11:46 UTC 2014
On 01/21/2014 03:09 AM, Zhou Zheng Sheng wrote:
> on 2014/01/21 11:31, Zhou Zheng Sheng wrote:
>> on 2014/01/17 10:24, Aline Manera wrote:
>>> From: Aline Manera <alinefm at br.ibm.com>
>>>
>>> I am sending the first patch set to refactor model
>>> It is not completed. I still need to do a lot of tests and so on.
>>> But I would like to share it with you to get your suggestion.
>>>
>>> Basically, the common code between model and mockmodel was placed into
>>> model/<resource>.py and the specific code into model/libvirtbackend.py
>>> and mockbackend.py
>>>
>>> *** It still needs a lot of work ***
>>> - Tests all functions
>>> - Update Makefile and spec files
>>> - Update test cases
>>>
>>> Aline Manera (13):
>>> refactor model: Create a separated model for task resource
>>> refactor model: Create a separated model for debugreport resource
>>> refactor model: Create a separated model for config resource
>>> refactor model: Create a separated model for host resource
>>> refactor model: Create a separated model for plugin resource
>>> refactor model: Create a separated model for libvirt connection
>>> refactor model: Move StoragePooldef from model to
>>> libvirtstoragepools.py
>>> refactor model: Create a separated model for storagepool resource
>>> refactor model: Create a separated model for storagevolume resource
>>> refactor model: Create a separated model for interface and network
>>> resources
>>> refactor model: Create a separated model for template resource
>>> refactor model: Create a separated model for vm resource
>>> refactor model: Update server.py and root.py to use new models
>>>
>>> src/kimchi/control/base.py | 32 +-
>>> src/kimchi/control/config.py | 30 +-
>>> src/kimchi/control/debugreports.py | 18 +-
>>> src/kimchi/control/host.py | 24 +-
>>> src/kimchi/control/interfaces.py | 11 +-
>>> src/kimchi/control/networks.py | 11 +-
>>> src/kimchi/control/plugins.py | 13 +-
>>> src/kimchi/control/storagepools.py | 32 +-
>>> src/kimchi/control/storagevolumes.py | 24 +-
>>> src/kimchi/control/tasks.py | 11 +-
>>> src/kimchi/control/templates.py | 11 +-
>>> src/kimchi/control/utils.py | 2 +-
>>> src/kimchi/control/vms.py | 17 +-
>>> src/kimchi/mockmodel.py | 784 --------------
>>> src/kimchi/model.py | 1827 --------------------------------
>>> src/kimchi/model/__init__.py | 21 +
>>> src/kimchi/model/config.py | 52 +
>>> src/kimchi/model/debugreports.py | 86 ++
>>> src/kimchi/model/host.py | 49 +
>>> src/kimchi/model/interfaces.py | 48 +
>>> src/kimchi/model/libvirtbackend.py | 955 +++++++++++++++++
>>> src/kimchi/model/libvirtconnection.py | 123 +++
>>> src/kimchi/model/libvirtstoragepool.py | 225 ++++
>>> src/kimchi/model/mockbackend.py | 338 ++++++
>>> src/kimchi/model/networks.py | 115 ++
>>> src/kimchi/model/plugins.py | 29 +
>>> src/kimchi/model/storagepools.py | 86 ++
>>> src/kimchi/model/storagevolumes.py | 95 ++
>>> src/kimchi/model/tasks.py | 45 +
>>> src/kimchi/model/templates.py | 89 ++
>>> src/kimchi/model/vms.py | 164 +++
>>> src/kimchi/networkxml.py | 6 +-
>>> src/kimchi/root.py | 24 +-
>>> src/kimchi/server.py | 16 +-
>>> src/kimchi/vmtemplate.py | 18 +-
>>> 35 files changed, 2674 insertions(+), 2757 deletions(-)
>>> delete mode 100644 src/kimchi/mockmodel.py
>>> delete mode 100644 src/kimchi/model.py
>>> create mode 100644 src/kimchi/model/__init__.py
>>> create mode 100644 src/kimchi/model/config.py
>>> create mode 100644 src/kimchi/model/debugreports.py
>>> create mode 100644 src/kimchi/model/host.py
>>> create mode 100644 src/kimchi/model/interfaces.py
>>> create mode 100644 src/kimchi/model/libvirtbackend.py
>>> create mode 100644 src/kimchi/model/libvirtconnection.py
>>> create mode 100644 src/kimchi/model/libvirtstoragepool.py
>>> create mode 100644 src/kimchi/model/mockbackend.py
>>> create mode 100644 src/kimchi/model/networks.py
>>> create mode 100644 src/kimchi/model/plugins.py
>>> create mode 100644 src/kimchi/model/storagepools.py
>>> create mode 100644 src/kimchi/model/storagevolumes.py
>>> create mode 100644 src/kimchi/model/tasks.py
>>> create mode 100644 src/kimchi/model/templates.py
>>> create mode 100644 src/kimchi/model/vms.py
>>>
>> I do not like this approach. It just put everything into the
>> libvirtbackend instead of in the current monolithic model class. We
>> still get monolithic libvirtbackend module. While the change is big, but
>> we do not benefit much in terms of logic splitting and modulization.
>>
>> I'm proposing another mechanism. Maybe I'll send the patches later.
>>
> The libvirtbackend in "Refactor model" patches is still a monolithic
> class. This is due to the following reasons.
>
> 1. Before the split, all controllers use the same model instance, and we
> can feed the root controller a mock model instance to have all
> controllers work on the mock one.
>
> 2. After the controller split and model split, we want concrete
> controllers call concrete models, for example, VM controller calls VM
> model. This seems OK but there is no way to switch all concrete
> controllers to call mock models.
>
> 3. So comes a new layer of abstraction. A "backend" concept was
> introduced and the "backend" does the actual work. The models share the
> same "backend", and we just feed a real "backend" or mock "backend" to
> switch between production mode and test mode. The key problem of "share
> one thing" v.s. "modulization" is still not solved.
I am not sure I completely understood this point.
Do you mean I should also split libvirtbackend.py into libvirt/vms.py,
libvirt/templates.py ?
And the some for mockbackend.py?
I've already thought about that and I don't have a solid conclusion. But
I am OK in splitting it too.
Could I do it after getting this patch set merged? So we will not block
it for a long time.
> I think we have many ways to solve this problem. The key problem is
> after split how we enable the concrete controllers call concrete models
> while we can easily switch between real models and mock models.
>
> The first way is that we can have it automatically synthesize a single
> module instance from all the concrete instances, and all the controllers
> still call this single model instance. This is feasible because the
> synthesis is automatic, the logic and responsibilities are still split
> to each concrete model.
Yeap. Thanks!
I liked the way you did and I will also add it to this patch set.
So I don't need to change control and tests.
> The second way is to introduce an abstract model factory. We can have a
> "real" model factory instance and a "mock" one to produce only "mock"
> model instance. We let the concrete controller request the model factory
> instance to construct a concrete model instance. Then we can easily
> switch between the production mode and test mode by feeding the root
> controller with a real model factory instance or a mock one. This is
> feasible because the factory just cares the creation of a concrete
> model, the inner model responsibilities are still wrapped within the
> concrete model.
>
> I'm proposing the first way because the change will be minimum and
> non-intrusive. I'm trying to send the patches later...
>
More information about the Kimchi-devel
mailing list