~hopem/charms/trusty/nova-cloud-controller/lp1499435

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/contrib/peerstorage/__init__.py

  • Committer: Liam Young
  • Date: 2015-06-04 08:45:01 UTC
  • mfrom: (163 nova-cloud-controller)
  • mto: This revision was merged to the branch mainline in revision 164.
  • Revision ID: liam.young@canonical.com-20150604084501-113hnbchy3qdht8o
Resync le charm helpers

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
    If a setting is not extant in the leader-get but is on the relation-get
69
69
    peer rel, it is migrated and marked as such so that it is not re-migrated.
70
70
    """
71
 
    settings = _leader_get(attribute=attribute)
 
71
    migration_key = '__leader_get_migrated_settings__'
72
72
    if not is_leader():
73
 
        return settings
 
73
        return _leader_get(attribute=attribute)
74
74
 
75
75
    settings_migrated = False
76
 
    migration_key = '__leader_get_migrated_settings__'
77
 
    if attribute:
78
 
        migrated = _leader_get(attribute=migration_key)
79
 
        if migrated:
80
 
            migrated = set(json.loads(migrated))
81
 
        else:
82
 
            migrated = set([])
83
 
    elif migration_key in settings:
84
 
        migrated = set(json.loads(settings[migration_key]))
85
 
        # Remove from returned settings
86
 
        del settings[migration_key]
 
76
    leader_settings = _leader_get(attribute=attribute)
 
77
    previously_migrated = _leader_get(attribute=migration_key)
 
78
 
 
79
    if previously_migrated:
 
80
        migrated = set(json.loads(previously_migrated))
87
81
    else:
88
82
        migrated = set([])
89
83
 
 
84
    try:
 
85
        if migration_key in leader_settings:
 
86
            del leader_settings[migration_key]
 
87
    except TypeError:
 
88
        pass
 
89
 
90
90
    if attribute:
91
91
        if attribute in migrated:
92
 
            return settings
93
 
 
94
 
        # Leader setting wins
95
 
        if not settings:
96
 
            settings = relation_get(attribute=attribute, unit=local_unit())
97
 
            if settings:
98
 
                leader_set(settings={attribute: settings})
99
 
 
100
 
        if settings:
 
92
            return leader_settings
 
93
 
 
94
        # If attribute not present in leader db, check if this unit has set
 
95
        # the attribute in the peer relation
 
96
        if not leader_settings:
 
97
            peer_setting = relation_get(attribute=attribute, unit=local_unit())
 
98
            if peer_setting:
 
99
                leader_set(settings={attribute: peer_setting})
 
100
                leader_settings = peer_setting
 
101
 
 
102
        if leader_settings:
101
103
            settings_migrated = True
102
104
            migrated.add(attribute)
103
105
    else:
105
107
        if r_settings:
106
108
            for key in set(r_settings.keys()).difference(migrated):
107
109
                # Leader setting wins
108
 
                if not settings.get(key):
109
 
                    settings[key] = r_settings[key]
 
110
                if not leader_settings.get(key):
 
111
                    leader_settings[key] = r_settings[key]
110
112
 
111
113
                settings_migrated = True
112
114
                migrated.add(key)
113
115
 
114
116
            if settings_migrated:
115
 
                leader_set(**settings)
 
117
                leader_set(**leader_settings)
116
118
 
117
119
    if migrated and settings_migrated:
118
120
        migrated = json.dumps(list(migrated))
119
121
        leader_set(settings={migration_key: migrated})
120
122
 
121
 
    return settings
 
123
    return leader_settings
122
124
 
123
125
 
124
126
def relation_set(relation_id=None, relation_settings=None, **kwargs):