Merge "Make BlockDeviceState implement a dict"
This commit is contained in:
commit
016b1f1522
@ -13,6 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
|
import collections
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
@ -39,12 +40,12 @@ def _load_json(file_name):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
class BlockDeviceState(object):
|
class BlockDeviceState(collections.MutableMapping):
|
||||||
"""The global state singleton
|
"""The global state singleton
|
||||||
|
|
||||||
An reference to an instance of this object is passed between nodes
|
An reference to an instance of this object is passed between nodes
|
||||||
as a global repository. It contains a single dictionary "state"
|
as a global repository. It wraps a single dictionary "state"
|
||||||
and a range of helper functions.
|
and provides a few helper functions.
|
||||||
|
|
||||||
This is used in two contexts:
|
This is used in two contexts:
|
||||||
|
|
||||||
@ -56,8 +57,6 @@ class BlockDeviceState(object):
|
|||||||
from disk and are thus passed the full state.
|
from disk and are thus passed the full state.
|
||||||
"""
|
"""
|
||||||
# XXX:
|
# XXX:
|
||||||
# - might it make sense to make state implement MutableMapping,
|
|
||||||
# so that callers treat it as a dictionary?
|
|
||||||
# - we could implement getters/setters such that if loaded from
|
# - we could implement getters/setters such that if loaded from
|
||||||
# disk, the state is read-only? or make it append-only
|
# disk, the state is read-only? or make it append-only
|
||||||
# (i.e. you can't overwrite existing keys)
|
# (i.e. you can't overwrite existing keys)
|
||||||
@ -78,6 +77,21 @@ class BlockDeviceState(object):
|
|||||||
else:
|
else:
|
||||||
self.state = {}
|
self.state = {}
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
del self.state[key]
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.state[key]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.state[key] = value
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self.state)
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.state)
|
||||||
|
|
||||||
def save_state(self, filename):
|
def save_state(self, filename):
|
||||||
"""Persist the state to disk
|
"""Persist the state to disk
|
||||||
|
|
||||||
@ -289,7 +303,6 @@ class BlockDevice(object):
|
|||||||
# dictionary. They can only be accessed after the state has
|
# dictionary. They can only be accessed after the state has
|
||||||
# been dumped; i.e. after cmd_create() called.
|
# been dumped; i.e. after cmd_create() called.
|
||||||
state = BlockDeviceState(self.state_json_file_name)
|
state = BlockDeviceState(self.state_json_file_name)
|
||||||
state = state.state
|
|
||||||
|
|
||||||
if symbol == 'image-block-partition':
|
if symbol == 'image-block-partition':
|
||||||
# If there is no partition needed, pass back directly the
|
# If there is no partition needed, pass back directly the
|
||||||
@ -313,7 +326,6 @@ class BlockDevice(object):
|
|||||||
# State should have been created by prior calls; we only need
|
# State should have been created by prior calls; we only need
|
||||||
# the dict
|
# the dict
|
||||||
state = BlockDeviceState(self.state_json_file_name)
|
state = BlockDeviceState(self.state_json_file_name)
|
||||||
state = state.state
|
|
||||||
|
|
||||||
tmp_fstab = os.path.join(self.state_dir, "fstab")
|
tmp_fstab = os.path.join(self.state_dir, "fstab")
|
||||||
with open(tmp_fstab, "wt") as fstab_fd:
|
with open(tmp_fstab, "wt") as fstab_fd:
|
||||||
@ -360,7 +372,7 @@ class BlockDevice(object):
|
|||||||
try:
|
try:
|
||||||
dg, call_order = create_graph(self.config, self.params)
|
dg, call_order = create_graph(self.config, self.params)
|
||||||
for node in call_order:
|
for node in call_order:
|
||||||
node.create(state.state, rollback)
|
node.create(state, rollback)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("Create failed; rollback initiated")
|
logger.exception("Create failed; rollback initiated")
|
||||||
for rollback_cb in reversed(rollback):
|
for rollback_cb in reversed(rollback):
|
||||||
@ -380,7 +392,6 @@ class BlockDevice(object):
|
|||||||
# (? more details?)
|
# (? more details?)
|
||||||
try:
|
try:
|
||||||
state = BlockDeviceState(self.state_json_file_name)
|
state = BlockDeviceState(self.state_json_file_name)
|
||||||
state = state.state
|
|
||||||
except BlockDeviceSetupException:
|
except BlockDeviceSetupException:
|
||||||
logger.info("State already cleaned - no way to do anything here")
|
logger.info("State already cleaned - no way to do anything here")
|
||||||
return 0
|
return 0
|
||||||
@ -401,7 +412,6 @@ class BlockDevice(object):
|
|||||||
# State should have been created by prior calls; we only need
|
# State should have been created by prior calls; we only need
|
||||||
# the dict
|
# the dict
|
||||||
state = BlockDeviceState(self.state_json_file_name)
|
state = BlockDeviceState(self.state_json_file_name)
|
||||||
state = state.state
|
|
||||||
|
|
||||||
# Deleting must be done in reverse order
|
# Deleting must be done in reverse order
|
||||||
dg, call_order = create_graph(self.config, self.params)
|
dg, call_order = create_graph(self.config, self.params)
|
||||||
@ -420,7 +430,6 @@ class BlockDevice(object):
|
|||||||
# State should have been created by prior calls; we only need
|
# State should have been created by prior calls; we only need
|
||||||
# the dict
|
# the dict
|
||||||
state = BlockDeviceState(self.state_json_file_name)
|
state = BlockDeviceState(self.state_json_file_name)
|
||||||
state = state.state
|
|
||||||
|
|
||||||
# Deleting must be done in reverse order
|
# Deleting must be done in reverse order
|
||||||
dg, call_order = create_graph(self.config, self.params)
|
dg, call_order = create_graph(self.config, self.params)
|
||||||
|
Loading…
Reference in New Issue
Block a user