示例#1
0
 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))
示例#2
0
 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))
示例#3
0
    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)
示例#4
0
    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
示例#5
0
    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,
        }
示例#7
0
    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,
        }