import json
+from orchestrator import OrchestratorError
+
try:
from urlparse import urlparse
except ImportError:
from urllib.parse import urlparse
+from mgr_util import merge_dicts
from .orchestrator import OrchClient
from .. import mgr
class IscsiGatewaysConfig(object):
@classmethod
- def _load_config(cls):
- if OrchClient().available():
- raise ManagedByOrchestratorException()
+ def _load_config_from_store(cls):
json_db = mgr.get_store(_ISCSI_STORE_KEY,
'{"gateways": {}}')
return json.loads(json_db)
+ @staticmethod
+ def _load_config_from_orchestrator():
+ config = {'gateways': {}}
+ try:
+ instances = OrchClient().list_service_info("iscsi")
+ for instance in instances:
+ config['gateways'][instance.nodename] = {
+ 'service_url': instance.service_url
+ }
+ except (RuntimeError, OrchestratorError, ImportError):
+ pass
+ return config
+
@classmethod
def _save_config(cls, config):
mgr.set_store(_ISCSI_STORE_KEY, json.dumps(config))
@classmethod
def add_gateway(cls, name, service_url):
- config = cls._load_config()
+ config = cls.get_gateways_config()
if name in config:
raise IscsiGatewayAlreadyExists(name)
IscsiGatewaysConfig.validate_service_url(service_url)
@classmethod
def remove_gateway(cls, name):
- config = cls._load_config()
+ if name in cls._load_config_from_orchestrator()['gateways']:
+ raise ManagedByOrchestratorException()
+
+ config = cls._load_config_from_store()
if name not in config['gateways']:
raise IscsiGatewayDoesNotExist(name)
@classmethod
def get_gateways_config(cls):
- try:
- config = cls._load_config()
- except ManagedByOrchestratorException:
- config = {'gateways': {}}
- instances = OrchClient().list_service_info("iscsi")
- for instance in instances:
- config['gateways'][instance.nodename] = {
- 'service_url': instance.service_url
- }
- return config
+ orch_config = cls._load_config_from_orchestrator()
+ local_config = cls._load_config_from_store()
+
+ return {'gateways': merge_dicts(orch_config['gateways'], local_config['gateways'])}
@classmethod
def get_gateway_config(cls, name):