class ISCSIRoot(UIRoot): def __init__(self, shell, endpoint=None): UIRoot.__init__(self, shell) self.error = False self.error_msg = '' self.interactive = True # default interactive mode if settings.config.api_secure: self.http_mode = 'https' else: self.http_mode = 'http' if endpoint is None: self.local_api = ('{}://127.0.0.1:{}/' 'api'.format(self.http_mode, settings.config.api_port)) else: self.local_api = endpoint self.config = {} # Establish the root nodes within the UI, for the different components self.disks = Disks(self) self.ceph = CephGroup(self) self.target = ISCSITarget(self) def refresh(self): self.config = self._get_config() if not self.error: if 'disks' in self.config: self.disks.refresh(self.config['disks']) else: self.disks.refresh({}) if 'gateways' in self.config: self.target.gateway_group = self.config['gateways'] else: self.target.gateway_group = {} if 'clients' in self.config: self.target.client_group = self.config['clients'] else: self.target.client_group = {} self.target.refresh() self.ceph.refresh() else: # Unable to get the config, tell the user and exit the cli self.logger.critical("Unable to access the configuration " "object : {}".format(self.error_msg)) raise GatewayError def _get_config(self, endpoint=None): if not endpoint: endpoint = self.local_api api = APIRequest(endpoint + "/config") api.get() if api.response.status_code == 200: return api.response.json() else: self.error = True self.error_msg = "REST API failure, code : " \ "{}".format(api.response.status_code) return {} def export_ansible(self, config): this_gw = this_host() ansible_vars = [] ansible_vars.append("seed_monitor: {}".format( self.ceph.local_ceph.healthy_mon)) ansible_vars.append("cluster_name: {}".format( settings.config.cluster_name)) ansible_vars.append("gateway_keyring: {}".format( settings.config.gateway_keyring)) ansible_vars.append("deploy_settings: true") ansible_vars.append("perform_system_checks: true") ansible_vars.append('gateway_iqn: "{}"'.format( config['gateways']['iqn'])) ansible_vars.append('gateway_ip_list: "{}"'.format(",".join( config['gateways']['ip_list']))) ansible_vars.append("# rbd device definitions") ansible_vars.append("rbd_devices:") disk_template = (" - {{ pool: '{}', image: '{}', size: '{}', " "host: '{}', state: 'present' }}") for disk in self.disks.children: ansible_vars.append( disk_template.format(disk.pool, disk.image, disk.size_h, this_gw)) ansible_vars.append("# client connections") ansible_vars.append("client_connections:") client_template = (" - {{ client: '{}', image_list: '{}', " "chap: '{}', status: 'present' }}") for client in sorted(config['clients'].keys()): client_metadata = config['clients'][client] lun_data = client_metadata['luns'] sorted_luns = [ s[0] for s in sorted(lun_data.iteritems(), key=lambda (x, y): y['lun_id']) ] chap = CHAP(client_metadata['auth']['chap']) ansible_vars.append( client_template.format(client, ','.join(sorted_luns), chap.chap_str)) for var in ansible_vars: print(var) def export_copy(self, config): fmtd_config = json.dumps(config, sort_keys=True, indent=4, separators=(',', ': ')) print(fmtd_config) def ui_command_export(self, mode='ansible'): self.logger.debug("CMD: export mode={}".format(mode)) current_config = self._get_config() if mode == "ansible": self.export_ansible(current_config) elif mode == 'copy': self.export_copy(current_config) def ui_command_info(self): self.logger.debug("CMD: info") if settings.config.trusted_ip_list: display_ips = ','.join(settings.config.trusted_ip_list) else: display_ips = 'None' console_message("HTTP mode : {}".format(self.http_mode)) console_message("Rest API port : {}".format( settings.config.api_port)) console_message("Local endpoint : {}".format(self.local_api)) console_message("Local Ceph Cluster : {}".format( settings.config.cluster_name)) console_message("2ndary API IP's : {}".format(display_ips))
class ISCSIRoot(UIRoot): def __init__(self, shell, scan_threads=1, endpoint=None): UIRoot.__init__(self, shell) self.error = False self.error_msg = '' self.interactive = True # default interactive mode self.scan_threads = scan_threads if settings.config.api_secure: self.http_mode = 'https' else: self.http_mode = 'http' if endpoint is None: self.local_api = ('{}://localhost:{}/' 'api'.format(self.http_mode, settings.config.api_port)) else: self.local_api = endpoint self.config = {} # Establish the root nodes within the UI, for the different components self.disks = Disks(self) self.ceph = CephGroup(self) self.target = ISCSITargets(self) def refresh(self): self.config = self._get_config() if not self.error: if 'disks' in self.config: self.disks.refresh(self.config['disks']) else: self.disks.refresh({}) if 'gateways' in self.config: self.target.gateway_group = self.config['gateways'] else: self.target.gateway_group = {} self.target.refresh(self.config['targets'], self.config['discovery_auth']) self.ceph.refresh() else: # Unable to get the config, tell the user and exit the cli self.logger.critical("Unable to access the configuration " "object : {}".format(self.error_msg)) raise GatewayError def _get_config(self, endpoint=None): if not endpoint: endpoint = self.local_api api = APIRequest(endpoint + "/config") api.get() if api.response.status_code == 200: try: return api.response.json() except Exception: self.error = True self.error_msg = "Malformed REST API response" return {} else: self.error = True self.error_msg = "REST API failure, code : " \ "{}".format(api.response.status_code) return {} def export_copy(self, config): fmtd_config = json.dumps(config, sort_keys=True, indent=4, separators=(',', ': ')) print(fmtd_config) def ui_command_export(self, mode='copy'): """ Print the configuration in a format that can be used as a backup. The export command supports two modes: copy - This prints the internal configuration. It can used for backup or for support requests. """ valid_modes = ['copy'] self.logger.debug("CMD: export mode={}".format(mode)) if mode not in valid_modes: self.logger.error("Invalid export mode requested - supported " "modes are: {}".format(','.join(valid_modes))) return current_config = self._get_config() if not current_config.get('targets'): self.logger.error("Export requested, but the config is empty") return if mode == 'copy': self.export_copy(current_config) def ui_command_info(self): self.logger.debug("CMD: info") if settings.config.trusted_ip_list: display_ips = ','.join(settings.config.trusted_ip_list) else: display_ips = 'None' console_message("HTTP mode : {}".format(self.http_mode)) console_message("Rest API port : {}".format(settings.config.api_port)) console_message("Local endpoint : {}".format(self.local_api)) console_message("Local Ceph Cluster : {}".format(settings.config.cluster_name)) console_message("2ndary API IP's : {}".format(display_ips))