def test_build_network_address(self): ipv4_address = '127.0.0.1' ipv6_address = '::1' host_name = 'localhost' port = 3498 self.assertEqual('%s:%s' % (ipv4_address, port), utils.build_network_address(ipv4_address, port)) self.assertEqual('[%s]:%s' % (ipv6_address, port), utils.build_network_address(ipv6_address, port)) self.assertEqual('%s:%s' % (host_name, port), utils.build_network_address(host_name, port))
def _update_storage_services_endpoint(self, executive_service_endpoint): controller_address = self._process_request( self._executive_service_client, self.EXECUTIVE_SERVICE_BINDING, executive_service_endpoint['ws_endpoint'], 'GetControllerAddress') if not controller_address: msg = _("Could not determine controller node.") raise datacore_exceptions.DataCoreConnectionException(reason=msg) controller_host = controller_address.rsplit(':', 1)[0].strip('[]') controller_net_addr = datacore_utils.build_network_address( controller_host, self.DATACORE_EXECUTIVE_PORT) self._storage_services_endpoint = self._build_service_endpoint( controller_net_addr, self.STORAGE_SERVICES)
def _update_executive_service_endpoints(self, storage_services_endpoint): endpoints = [] nodes = self._get_list_data( self._process_request(self._storage_services_client, self.STORAGE_SERVICES_BINDING, storage_services_endpoint['ws_endpoint'], 'GetNodes'), 'RegionNodeData') if not nodes: msg = _("Could not determine executive nodes.") raise datacore_exceptions.DataCoreConnectionException(reason=msg) for node in nodes: host = node.HostAddress.rsplit(':', 1)[0].strip('[]') endpoint = self._build_service_endpoint( datacore_utils.build_network_address( host, self.DATACORE_EXECUTIVE_PORT), self.EXECUTIVE_SERVICE) endpoints.append(endpoint) self._executive_service_endpoints = endpoints
def __init__(self, host, username, password, timeout): if websocket is None: msg = _("Failed to import websocket-client python module." " Please, ensure the module is installed.") raise datacore_exceptions.DataCoreException(msg) self.timeout = timeout executive_service_net_addr = datacore_utils.build_network_address( host, self.DATACORE_EXECUTIVE_PORT) executive_service_endpoint = self._build_service_endpoint( executive_service_net_addr, self.EXECUTIVE_SERVICE) security_options = wsse.Security() username_token = wsse.UsernameToken(username, password) security_options.tokens.append(username_token) self._executive_service_client = suds_client.Client( executive_service_endpoint['http_endpoint'] + '?singlewsdl', nosend=True, timeout=self.timeout, wsse=security_options, plugins=[FaultDefinitionsFilter()]) self._update_storage_services_endpoint(executive_service_endpoint) storage_services_endpoint = self._get_storage_services_endpoint() self._storage_services_client = suds_client.Client( storage_services_endpoint['http_endpoint'] + '?singlewsdl', nosend=True, timeout=self.timeout, wsse=security_options, plugins=[FaultDefinitionsFilter()]) self._update_executive_service_endpoints(storage_services_endpoint)
def initialize_connection(self, volume, connector): """Allow connection to connector and return connection info. :param volume: Volume object :param connector: Connector information :return: Connection information """ LOG.debug( "Initialize connection for volume %(volume)s for " "connector %(connector)s.", { 'volume': volume['id'], 'connector': connector }) virtual_disk = self._get_virtual_disk_for(volume, raise_not_found=True) if virtual_disk.DiskStatus != 'Online': LOG.warning( "Attempting to attach virtual disk %(disk)s " "that is in %(state)s state.", { 'disk': virtual_disk.Id, 'state': virtual_disk.DiskStatus }) server_group = self._get_our_server_group() @cinder_utils.synchronized('datacore-backend-%s' % server_group.Id, external=True) def serve_virtual_disk(): available_ports = self._api.get_ports() iscsi_initiator = self._get_initiator(connector['host'], connector['initiator'], available_ports) iscsi_targets = self._get_targets(virtual_disk, available_ports) if not iscsi_targets: msg = (_("Suitable targets not found for " "virtual disk %(disk)s for volume %(volume)s.") % { 'disk': virtual_disk.Id, 'volume': volume['id'] }) LOG.error(msg) raise cinder_exception.VolumeDriverException(message=msg) auth_params = self._setup_iscsi_chap_authentication( iscsi_targets, iscsi_initiator) virtual_logical_units = self._map_virtual_disk( virtual_disk, iscsi_targets, iscsi_initiator) return iscsi_targets, virtual_logical_units, auth_params targets, logical_units, chap_params = serve_virtual_disk() target_portal = datacore_utils.build_network_address( targets[0].PortConfigInfo.PortalsConfig.iScsiPortalConfigInfo[0]. Address.Address, targets[0].PortConfigInfo.PortalsConfig. iScsiPortalConfigInfo[0].TcpPort) connection_data = {} if chap_params: connection_data['auth_method'] = 'CHAP' connection_data['auth_username'] = chap_params[0] connection_data['auth_password'] = chap_params[1] connection_data['target_discovered'] = False connection_data['target_iqn'] = targets[0].PortName connection_data['target_portal'] = target_portal connection_data['target_lun'] = logical_units[targets[0]].Lun.Quad connection_data['volume_id'] = volume['id'] connection_data['access_mode'] = 'rw' LOG.debug("Connection data: %s", connection_data) return { 'driver_volume_type': 'iscsi', 'data': connection_data, }
def initialize_connection(self, volume, connector): """Allow connection to connector and return connection info. :param volume: Volume object :param connector: Connector information :return: Connection information """ LOG.debug("Initialize connection for volume %(volume)s for " "connector %(connector)s.", {'volume': volume['id'], 'connector': connector}) virtual_disk = self._get_virtual_disk_for(volume, raise_not_found=True) if virtual_disk.DiskStatus != 'Online': LOG.warning("Attempting to attach virtual disk %(disk)s " "that is in %(state)s state.", {'disk': virtual_disk.Id, 'state': virtual_disk.DiskStatus}) server_group = self._get_our_server_group() @cinder_utils.synchronized( 'datacore-backend-%s' % server_group.Id, external=True) def serve_virtual_disk(): available_ports = self._api.get_ports() iscsi_initiator = self._get_initiator(connector['host'], connector['initiator'], available_ports) iscsi_targets = self._get_targets(virtual_disk, available_ports) if not iscsi_targets: msg = (_("Suitable targets not found for " "virtual disk %(disk)s for volume %(volume)s.") % {'disk': virtual_disk.Id, 'volume': volume['id']}) LOG.error(msg) raise cinder_exception.VolumeDriverException(message=msg) auth_params = self._setup_iscsi_chap_authentication( iscsi_targets, iscsi_initiator) virtual_logical_units = self._map_virtual_disk( virtual_disk, iscsi_targets, iscsi_initiator) return iscsi_targets, virtual_logical_units, auth_params targets, logical_units, chap_params = serve_virtual_disk() target_portal = datacore_utils.build_network_address( targets[0].PortConfigInfo.PortalsConfig.iScsiPortalConfigInfo[0] .Address.Address, targets[0].PortConfigInfo.PortalsConfig.iScsiPortalConfigInfo[0] .TcpPort) connection_data = {} if chap_params: connection_data['auth_method'] = 'CHAP' connection_data['auth_username'] = chap_params[0] connection_data['auth_password'] = chap_params[1] connection_data['target_discovered'] = False connection_data['target_iqn'] = targets[0].PortName connection_data['target_portal'] = target_portal connection_data['target_lun'] = logical_units[targets[0]].Lun.Quad connection_data['volume_id'] = volume['id'] connection_data['access_mode'] = 'rw' LOG.debug("Connection data: %s", connection_data) return { 'driver_volume_type': 'iscsi', 'data': connection_data, }