configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_comparator.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
from cone.public import plugin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
from crml_model import *
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
class CrmlComparator(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
    def __init__(self, resource_ref, repo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
        self.logger = logging.getLogger('cone.crml.comparator(%s)' % resource_ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
        self.resource_ref = resource_ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
        self.repo = repo
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    def get_flat_comparison_id(cls, repo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
        Return the flat comparison ID for the given repository.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
        return cls._num_to_str(repo.uid_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    def get_flat_comparison_extra_data(cls, repo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        return {'repo': repo}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    def _num_to_str(cls, number):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        if isinstance(number, basestring):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
                number = long(number, 10)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
            except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
                number = long(number, 16)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        return "0x%08X" % number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    def flat_compare(self, target_resource_ref, target_repo):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        Compare two CRML repository models.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        @return: A plugin.FlatComparisonResult object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        source_repo = self.repo
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        result = plugin.FlatComparisonResult()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        source_repo_uid = self._num_to_str(source_repo.uid_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        target_repo_uid = self._num_to_str(target_repo.uid_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        if source_repo_uid != target_repo_uid:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            raise RuntimeError("Comparing CRML implementations instances that don't have the same repository UID (%r vs. %r)" % (source_repo_uid, target_repo_uid))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        # Default field contents for new entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        default_field_content = {
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
            'data'      : {}}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        Entry = plugin.FlatComparisonResultEntry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        if self.resource_ref != target_resource_ref:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            result.modified.append(Entry(value_id       = 'file',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                                         source_value   = self.resource_ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
                                         target_value   = target_resource_ref,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
                                         data           = {'source_repo': source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
                                                           'target_repo': target_repo}))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        # Compare repository attributes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        # -----------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
        repo_mods = self._flat_compare_object_attrs(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
            key_id      = None,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
            source_obj  = source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
            target_obj  = target_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
            varnames    = ('uid_name', 'owner', 'backup', 'rfs', 'access'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        content = default_field_content.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        content['data'] = {'source_repo': source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
                           'target_repo': target_repo}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        self._fill_in_entry_fields(repo_mods, content)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        result.modified.extend(repo_mods)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        source_data = self._get_flat_comparison_data(source_repo)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        target_data = self._get_flat_comparison_data(target_repo)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        # Find entries only in source
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        # ---------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        for id, crml_key in source_data.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
            if id not in target_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
                data = {'repo': source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
                        'key':  crml_key}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
                result.only_in_source.append(Entry(sub_id=id, data=data))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        # Find entries only in target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        # ---------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        for id, crml_key in target_data.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
            if id not in source_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
                data = {'repo': source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
                        'key':  crml_key}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
                result.only_in_target.append(Entry(sub_id=id, data=data))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        # Find differing entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        # ----------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        for id, source_key in source_data.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
            if id not in target_data: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
            target_key = target_data[id]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
            if source_key == target_key: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
            # Get the comparison result for the key
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
            comp_result = self._get_flat_key_comparison_result(id, source_key, target_key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
            # Fill in the missing fields of the result entries
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
            content = default_field_content.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
            content['data'] = {'repo'   : source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                               'key'    : source_key}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            self._fill_in_entry_fields(comp_result.only_in_source, content)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
            content = default_field_content.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
            content['data'] = {'repo'   : target_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
                               'key'    : target_key}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
            self._fill_in_entry_fields(comp_result.only_in_target,  content)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
            content = default_field_content.copy()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
            content['data'] = {'source_repo'    : source_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
                               'target_repo'    : target_repo,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
                               'source_key'     : source_key,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
                               'target_key'     : target_key}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            self._fill_in_entry_fields(comp_result.modified, content)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
            result.extend(comp_result)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
    def _fill_in_entry_fields(self, entry_list, field_contents):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        for entry in entry_list:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
            for varname, value in field_contents.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                if getattr(entry, varname) is None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
                    setattr(entry, varname, value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
    def _get_flat_comparison_data(self, repository):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
        Return a dictionary containing all keys in the repository.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        The dictionary will have the CRML key UIDs as the dictionary keys and
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        the CRML key objects as the values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        data = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        for key in repository.keys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
            if isinstance(key, (CrmlSimpleKey, CrmlBitmaskKey)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
                id = self._num_to_str(key.int)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
            elif isinstance(key, CrmlKeyRange):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
                id = self._num_to_str(key.first_int) + '-' + self._num_to_str(key.last_int)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
            data[id] = key
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
    def _get_flat_key_comparison_result(self, key_id, source_key, target_key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        Return a flat comparison result for a source and target CRML key pair.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        @param key_id: The ID of the key, e.g. '0x00000001' for a simple key or
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
            '0x00001000-0x00001FFF' for a key range.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
        @param source_key: The source key object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        @param target_key: The target key object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        @return: A plugin.FlatComparisonResult object.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        result = plugin.FlatComparisonResult()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        if type(source_key) == type(target_key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
            comp_funcs = {CrmlSimpleKey:   self._flat_compare_simple_keys,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
                          CrmlBitmaskKey:  self._flat_compare_bitmask_keys,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
                          CrmlKeyRange:    self._flat_compare_key_ranges}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
            func = comp_funcs[type(source_key)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
            result.extend(func(key_id, source_key, target_key))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
            # Perform base key comparison
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            result.modified.extend(self._flat_compare_base_keys(key_id, source_key, target_key))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
            # Add an entry for key type change
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
            type_ids = {CrmlSimpleKey:  'simple_key',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
                        CrmlBitmaskKey: 'bitmask_key',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
                        CrmlKeyRange:   'key_range'}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
            entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
                sub_id       = key_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
                value_id     = 'key_type',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
                source_value = type_ids[type(source_key)],
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
                target_value = type_ids[type(target_key)])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
            result.modified.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
    def _flat_compare_object_attrs(self, key_id, source_obj, target_obj, varnames):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        for varname in varnames:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            sval = getattr(source_obj, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
            tval = getattr(target_obj, varname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
            if sval != tval:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
                if isinstance(sval, CrmlAccess):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
                    result.extend(self._flat_compare_object_attrs(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
                          key_id, sval, tval,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
                          ('cap_rd', 'cap_wr', 'sid_rd', 'sid_wr')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
                    entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
                        sub_id       = key_id,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
                        value_id     = varname,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
                        source_value = sval,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
                        target_value = tval)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
                    result.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    def _flat_compare_base_keys(self, key_id, source_key, target_key, extra_varnames=[]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
        varnames = ['name', 'backup', 'read_only', 'access']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        varnames.extend(extra_varnames)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        return self._flat_compare_object_attrs(key_id, source_key, target_key, varnames)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
    def _flat_compare_simple_keys(self, key_id, source_key, target_key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
                                           extra_varnames=['ref', 'type'])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        return plugin.FlatComparisonResult(modified=mod)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    def _flat_compare_bitmask_keys(self, key_id, source_key, target_key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
                                           extra_varnames=['type'])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        only_in_source = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        only_in_target = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        def get_bits_dict(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            bits = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
            for bit in key.bits:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
                bits[bit.index] = bit
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
            return bits
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        src_bits = get_bits_dict(source_key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        tgt_bits = get_bits_dict(target_key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        # Find bits only in source
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        # ------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        for index in src_bits.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
            if index not in tgt_bits:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
                entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
                    sub_id = "%s (bit %s)" % (key_id, index))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
                only_in_source.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        # Find bits only in target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
        # ------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
        for index in tgt_bits.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
            if index not in src_bits:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
                entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
                    sub_id = "%s (bit %s)" % (key_id, index))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
                only_in_target.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        # Find modified bits
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        # ------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        for index, src_bit in src_bits.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
            if index not in tgt_bits: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
            tgt_bit = tgt_bits[index]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
            mod.extend(self._flat_compare_object_attrs(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
                key_id      = "%s (bit %s)" % (key_id, index),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
                source_obj  = src_bit,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
                target_obj  = tgt_bit,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
                varnames    = ('ref', 'invert')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        return plugin.FlatComparisonResult(modified         = mod,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
                                           only_in_source   = only_in_source,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
                                           only_in_target   = only_in_target)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    def _flat_compare_key_ranges(self, key_id, source_key, target_key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
                                           extra_varnames=['ref', 'index_bits', 'first_index'])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        only_in_source = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        only_in_target = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        # Use hexadecimal format for index bits
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        for entry in mod:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
            if entry.value_id == 'index_bits':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
                entry.source_value = self._num_to_str(entry.source_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
                entry.target_value = self._num_to_str(entry.target_value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        def get_subkeys_dict(key):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
            subkeys = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
            for sk in key.subkeys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
                subkeys[sk.int] = sk
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
            return subkeys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        src_subkeys = get_subkeys_dict(source_key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        tgt_subkeys = get_subkeys_dict(target_key)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        # Find sub-keys only in source
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        # ----------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        for uid in src_subkeys.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
            if uid not in tgt_subkeys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
                entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
                    sub_id = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
                only_in_source.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        # Find sub-keys only in target
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        # ----------------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        for uid in tgt_subkeys.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
            if uid not in src_subkeys:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
                entry = plugin.FlatComparisonResultEntry(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
                    sub_id = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
                only_in_target.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        # Find modified bits
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        # ------------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        for uid, src_subkey in src_subkeys.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
            if uid not in tgt_subkeys: continue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            tgt_subkey = tgt_subkeys[uid]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            mod.extend(self._flat_compare_object_attrs(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
                key_id      = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
                source_obj  = src_subkey,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
                target_obj  = tgt_subkey,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
                varnames    = ('ref', 'type', 'name')))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
        return plugin.FlatComparisonResult(modified         = mod,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
                                           only_in_source   = only_in_source,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
                                           only_in_target   = only_in_target)