Ejemplo n.º 1
0
    def wait_for_server_creation(self, server_id):
        """
        @summary: Waits for a server to be created successfully
        @param server_id: The uuid of the server
        @type server_id: String
        @return: A server object after it has been successfully built
        @rtype: Server
        """

        verifier = StatusProgressionVerifier(
            'server', server_id, lambda id_: self.verify_entity(
                self.servers_client.get_server(id_)).status, server_id)

        verifier.set_global_state_properties(
            timeout=self.config.server_build_timeout)
        verifier.add_state(expected_statuses=[ServerStates.BUILD],
                           acceptable_statuses=[ServerStates.ACTIVE],
                           error_statuses=[ServerStates.ERROR],
                           poll_rate=self.config.server_status_interval)

        verifier.add_state(expected_statuses=[ServerStates.ACTIVE],
                           error_statuses=[ServerStates.ERROR],
                           poll_rate=self.config.server_status_interval)
        verifier.start()

        response = self.servers_client.get_server(server_id)
        return self.verify_entity(response)
Ejemplo n.º 2
0
    def verify_volume_status_progression_during_attachment(
            self, volume_id, state_list=None):

        verifier = StatusProgressionVerifier(
            'volume', volume_id, self._get_volume_status, volume_id)
        verifier.set_global_state_properties(
            timeout=self.config.attachment_timeout)

        verifier.add_state(
            expected_statuses=['available'],
            acceptable_statuses=['attaching', 'in-use'],
            error_statuses=['error', 'creating'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(
            expected_statuses=['attaching'],
            acceptable_statuses=['in-use'],
            error_statuses=['error', 'creating'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(
            expected_statuses=['in-use'],
            error_statuses=['available', 'error', 'creating'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.start()
Ejemplo n.º 3
0
    def verify_server_snapshotting_progression(self, server_id):
        # Wait while the server is imaging
        verifier = StatusProgressionVerifier(
            'server', server_id,
            lambda id_: self.verify_entity(
                self.servers_client.get_server(id_)).task_state,
            server_id)

        verifier.set_global_state_properties(
            timeout=self.config.snapshot_timeout)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_SNAPSHOT],
            acceptable_statuses=[ComputeTaskStates.IMAGE_PENDING_UPLOAD,
                                 ComputeTaskStates.IMAGE_UPLOADING],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_PENDING_UPLOAD],
            acceptable_statuses=[ComputeTaskStates.IMAGE_UPLOADING,
                                 ComputeTaskStates.NONE],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_UPLOADING],
            acceptable_statuses=[ComputeTaskStates.NONE],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.NONE],
            poll_rate=self.config.image_status_interval)
        verifier.start()

        response = self.servers_client.get_server(server_id)
        return self.verify_entity(response)
Ejemplo n.º 4
0
    def verify_server_snapshotting_progression(self, server_id):
        # Wait while the server is imaging
        verifier = StatusProgressionVerifier(
            'server', server_id, lambda id_: self.verify_entity(
                self.servers_client.get_server(id_)).task_state, server_id)

        verifier.set_global_state_properties(
            timeout=self.config.snapshot_timeout)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_SNAPSHOT],
            acceptable_statuses=[
                ComputeTaskStates.IMAGE_PENDING_UPLOAD,
                ComputeTaskStates.IMAGE_UPLOADING
            ],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_PENDING_UPLOAD],
            acceptable_statuses=[ComputeTaskStates.IMAGE_UPLOADING],
            error_statuses=[ComputeTaskStates.NONE],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(
            expected_statuses=[ComputeTaskStates.IMAGE_UPLOADING],
            error_statuses=[ComputeTaskStates.NONE],
            poll_rate=self.config.image_status_interval)
        verifier.add_state(expected_statuses=[ComputeTaskStates.NONE],
                           poll_rate=self.config.image_status_interval)
        verifier.start()

        response = self.servers_client.get_server(server_id)
        return self.verify_entity(response)
Ejemplo n.º 5
0
    def verify_volume_status_progression_during_attachment(
            self, volume_id, state_list=None):

        verifier = StatusProgressionVerifier('volume', volume_id,
                                             self._get_volume_status,
                                             volume_id)
        verifier.set_global_state_properties(
            timeout=self.config.attachment_timeout)

        verifier.add_state(expected_statuses=['available'],
                           acceptable_statuses=['attaching', 'in-use'],
                           error_statuses=['error', 'creating'],
                           poll_rate=self.config.api_poll_rate,
                           poll_failure_retry_limit=3)

        verifier.add_state(expected_statuses=['attaching'],
                           acceptable_statuses=['in-use'],
                           error_statuses=['error', 'creating'],
                           poll_rate=self.config.api_poll_rate,
                           poll_failure_retry_limit=3)

        verifier.add_state(expected_statuses=['in-use'],
                           error_statuses=['available', 'error', 'creating'],
                           poll_rate=self.config.api_poll_rate,
                           poll_failure_retry_limit=3)

        verifier.start()
Ejemplo n.º 6
0
    def wait_for_server_creation(self, server_id):
        """
        @summary: Waits for a server to be created successfully
        @param server_id: The uuid of the server
        @type server_id: String
        @return: A server object after it has been successfully built
        @rtype: Server
        """

        verifier = StatusProgressionVerifier(
            'server', server_id,
            lambda id_: self.verify_entity(
                self.servers_client.get_server(id_)).status,
            server_id)

        retry_limit = self.config.server_status_poll_failure_max_retries
        verifier.set_global_state_properties(
            timeout=self.config.server_build_timeout)
        verifier.add_state(
            expected_statuses=[ServerStates.BUILD],
            acceptable_statuses=[ServerStates.ACTIVE],
            error_statuses=[ServerStates.ERROR],
            poll_rate=self.config.server_status_interval,
            poll_failure_retry_limit=retry_limit)

        verifier.add_state(
            expected_statuses=[ServerStates.ACTIVE],
            error_statuses=[ServerStates.ERROR],
            poll_rate=self.config.server_status_interval,
            poll_failure_retry_limit=retry_limit)

        try:
            verifier.start()
        except (StatusProgressionError, StatusPollError) as e:
            if not e.args:
                e.args=('',)
            e.args = (
                'Failed to create server with instance '
                'id {id}'.format(id=server_id),) + e.args
            e.args = ('; '.join(e.args),)
            raise
        except Exception as e:
            if not e.args:
                e.args=('',)
            e.args = (
                'Unexpected error occurred while waiting for server {id}'
                'to be created.'.format(id=server_id),) + e.args
            e.args = ('; '.join(e.args),)
            raise

        response = self.servers_client.get_server(server_id)
        return self.verify_entity(response)
Ejemplo n.º 7
0
    def wait_for_snapshot_status(
            self, snapshot_id, expected_status, timeout, poll_rate=None):

        verifier = StatusProgressionVerifier(
            'snapshot', snapshot_id, self.get_snapshot_status, snapshot_id)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[expected_status],
            poll_rate=self.config.snapshot_status_poll_frequency,
            poll_failure_retry_limit=
                self.config.snapshot_status_poll_failure_max_retries)
        verifier.start()
Ejemplo n.º 8
0
    def wait_for_server_creation(self, server_id):
        """
        @summary: Waits for a server to be created successfully
        @param server_id: The uuid of the server
        @type server_id: String
        @return: A server object after it has been successfully built
        @rtype: Server
        """

        verifier = StatusProgressionVerifier(
            'server', server_id, lambda id_: self.verify_entity(
                self.servers_client.get_server(id_)).status, server_id)

        retry_limit = self.config.server_status_poll_failure_max_retries
        verifier.set_global_state_properties(
            timeout=self.config.server_build_timeout)
        verifier.add_state(expected_statuses=[ServerStates.BUILD],
                           acceptable_statuses=[ServerStates.ACTIVE],
                           error_statuses=[ServerStates.ERROR],
                           poll_rate=self.config.server_status_interval,
                           poll_failure_retry_limit=retry_limit)

        verifier.add_state(expected_statuses=[ServerStates.ACTIVE],
                           error_statuses=[ServerStates.ERROR],
                           poll_rate=self.config.server_status_interval,
                           poll_failure_retry_limit=retry_limit)

        try:
            verifier.start()
        except (StatusProgressionError, StatusPollError) as e:
            if not e.args:
                e.args = ('', )
            e.args = ('Failed to create server with instance '
                      'id {id}'.format(id=server_id), ) + e.args
            e.args = ('; '.join(e.args), )
            raise
        except Exception as e:
            if not e.args:
                e.args = ('', )
            e.args = ('Unexpected error occurred while waiting for server {id}'
                      'to be created.'.format(id=server_id), ) + e.args
            e.args = ('; '.join(e.args), )
            raise

        response = self.servers_client.get_server(server_id)
        return self.verify_entity(response)
Ejemplo n.º 9
0
    def verify_volume_status_progression_during_detachment(
            self, volume_id, raise_on_error=True):
        """
        Track the status progression of volume volume_id being detached.

        Optionally fails silently if rais_on_error is set to False.
        :param volume_id: the uuid of the volume being tracked
        :returns: None
        """

        verifier = StatusProgressionVerifier('volume', volume_id,
                                             self._get_volume_status,
                                             volume_id)
        verifier.set_global_state_properties(
            timeout=self.config.attachment_timeout)

        verifier.add_state(
            expected_statuses=['in-use'],
            acceptable_statuses=['detaching', 'available'],
            error_statuses=['error', 'attaching', 'creating', 'deleting'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(
            expected_statuses=['detaching'],
            acceptable_statuses=['available'],
            error_statuses=['error', 'attaching', 'creating', 'deleting'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(expected_statuses=['available'],
                           error_statuses=[
                               'error', 'attaching', 'creating', 'deleting',
                               'in-use'
                           ],
                           poll_rate=self.config.api_poll_rate,
                           poll_failure_retry_limit=3)

        try:
            verifier.start()
        except Exception as exception:
            if raise_on_error:
                raise exception
Ejemplo n.º 10
0
    def verify_volume_status_progression_during_detachment(
            self, volume_id, raise_on_error=True):
        """
        Track the status progression of volume volume_id being detached.

        Optionally fails silently if rais_on_error is set to False.
        :param volume_id: the uuid of the volume being tracked
        :returns: None
        """

        verifier = StatusProgressionVerifier(
            'volume', volume_id, self._get_volume_status, volume_id)
        verifier.set_global_state_properties(
            timeout=self.config.attachment_timeout)

        verifier.add_state(
            expected_statuses=['in-use'],
            acceptable_statuses=['detaching', 'available'],
            error_statuses=['error', 'attaching', 'creating', 'deleting'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(
            expected_statuses=['detaching'],
            acceptable_statuses=['available'],
            error_statuses=['error', 'attaching', 'creating', 'deleting'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        verifier.add_state(
            expected_statuses=['available'],
            error_statuses=[
                'error', 'attaching', 'creating', 'deleting', 'in-use'],
            poll_rate=self.config.api_poll_rate,
            poll_failure_retry_limit=3)

        try:
            verifier.start()
        except Exception as exception:
            if raise_on_error:
                raise exception
Ejemplo n.º 11
0
    def wait_for_snapshot_status(self,
                                 snapshot_id,
                                 expected_status,
                                 timeout,
                                 poll_rate=None):
        """ This method can end up polling for the entire timeout if the
        snapshot enters a permament unexpected state.
        It's been included for backwards compatibility only and should
        generally be avoided."""

        verifier = StatusProgressionVerifier('snapshot', snapshot_id,
                                             self.get_snapshot_status,
                                             snapshot_id)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[expected_status],
            poll_rate=self.config.snapshot_status_poll_frequency,
            poll_failure_retry_limit=(
                self.config.snapshot_status_poll_failure_max_retries))
        verifier.start()
Ejemplo n.º 12
0
    def verify_image_creation_progression(self, image_id):
        verifier = StatusProgressionVerifier(
            'image', image_id, lambda id_: self.verify_entity(
                self.images_client.get_image(id_)).status, image_id)

        verifier.set_global_state_properties(
            timeout=self.config.snapshot_timeout)

        verifier.add_state(
            expected_statuses=[ImageStates.SAVING],
            acceptable_statuses=[ImageStates.ACTIVE],
            error_statuses=[ImageStates.ERROR, ImageStates.DELETED],
            poll_rate=self.config.image_status_interval)

        verifier.add_state(
            expected_statuses=[ImageStates.ACTIVE],
            error_statuses=[ImageStates.ERROR, ImageStates.DELETED],
            poll_rate=self.config.image_status_interval)

        verifier.start()
        response = self.images_client.get_image(image_id)
        return self.verify_entity(response)
Ejemplo n.º 13
0
    def verify_volume_create_status_progresion(self, volume_id, timeout):
        """Raises an exception if the volume doesn't pass through
        the normal expected series of states for a volume create.
        """
        verifier = StatusProgressionVerifier(
            'volume', volume_id, self.get_volume_status, volume_id)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[self.statuses.Volume.CREATING],
            acceptable_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency,
            poll_failure_retry_limit=
                self.config.volume_status_poll_failure_max_retries)

        verifier.add_state(
            expected_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency,
            poll_failure_retry_limit=
                self.config.volume_status_poll_failure_max_retries)

        verifier.start()
Ejemplo n.º 14
0
    def verify_volume_create_status_progresion(self, volume_id, timeout):
        """Raises an exception if the volume doesn't pass through
        the normal expected series of states for a volume create.
        """
        verifier = StatusProgressionVerifier('volume', volume_id,
                                             self.get_volume_status, volume_id)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[self.statuses.Volume.CREATING],
            acceptable_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency,
            poll_failure_retry_limit=(
                self.config.volume_status_poll_failure_max_retries))

        verifier.add_state(
            expected_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency,
            poll_failure_retry_limit=(
                self.config.volume_status_poll_failure_max_retries))

        verifier.start()
Ejemplo n.º 15
0
    def verify_image_creation_progression(self, image_id):
        verifier = StatusProgressionVerifier(
            'image', image_id,
            lambda id_: self.verify_entity(
                self.images_client.get_image(id_)).status,
            image_id)

        verifier.set_global_state_properties(
            timeout=self.config.snapshot_timeout)

        verifier.add_state(
            expected_statuses=[ImageStates.SAVING],
            acceptable_statuses=[ImageStates.ACTIVE],
            error_statuses=[ImageStates.ERROR, ImageStates.DELETED],
            poll_rate=self.config.image_status_interval)

        verifier.add_state(
            expected_statuses=[ImageStates.ACTIVE],
            error_statuses=[ImageStates.ERROR, ImageStates.DELETED],
            poll_rate=self.config.image_status_interval)

        verifier.start()
        response = self.images_client.get_image(image_id)
        return self.verify_entity(response)
Ejemplo n.º 16
0
    def create_available_volume(
            self, size, volume_type, name=None, description=None,
            availability_zone=None, metadata=None, bootable=None,
            image_ref=None, snapshot_id=None, source_volid=None, timeout=None):
        """Create a volume and wait for it to reach the 'available' status"""

        metadata = metadata or {}
        timeout = timeout or self.calculate_volume_create_timeout(size)

        try:
            if image_ref:
                timeout = self.calculate_copy_image_to_volume_timeout(size)
                self._log.info(
                    "Copy image to volume timeout calculated at {0} "
                    "seconds".format(timeout))

            elif snapshot_id:
                timeout = self.calculate_snapshot_restore_timeout(size)
                self._log.info(
                    "Create volume from snapshot timeout calculated at {0} "
                    "seconds".format(timeout))

            elif source_volid:
                timeout = self.calculate_volume_clone_timeout(size)
                self._log.info(
                    "Clone a volume timeout calculated at {0} "
                    "seconds".format(timeout))
        except:
            # Worst case if no config values are set.
            # Use the default volume create timeout.
            self._log.info(
                "Unable to use create-method-specific timeout, "
                "defaulting to normal volume create timeout of {0} "
                "seconds".format(timeout))

        self._log.info("create_available_volume() is creating a volume")
        start_time = time()
        resp = self.create_volume(
            size, volume_type, name=name, description=description,
            availability_zone=availability_zone, metadata=metadata,
            bootable=bootable, image_ref=image_ref, snapshot_id=snapshot_id,
            source_volid=source_volid)
        timeout = timeout - (time() - start_time)

        volume = self._verify_entity(resp)

        # Verify volume progression from 'creating' to 'available'
        verifier = StatusProgressionVerifier(
            'volume', volume.id_, self.get_volume_status, volume.id_)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[self.statuses.Volume.CREATING],
            acceptable_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency)

        verifier.add_state(
            expected_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency)

        verifier.start()
        # Return volume model
        resp = self.client.get_volume_info(volume.id_)
        volume = self._verify_entity(resp)
        return volume
Ejemplo n.º 17
0
    def create_available_volume(self,
                                size,
                                volume_type,
                                name=None,
                                description=None,
                                availability_zone=None,
                                metadata=None,
                                bootable=None,
                                image_ref=None,
                                snapshot_id=None,
                                source_volid=None,
                                timeout=None):
        """Create a volume and wait for it to reach the 'available' status"""

        metadata = metadata or {}
        timeout = timeout or self.calculate_volume_create_timeout(size)

        try:
            if image_ref:
                timeout = self.calculate_copy_image_to_volume_timeout(size)
                self._log.info(
                    "Copy image to volume timeout calculated at {0} "
                    "seconds".format(timeout))

            elif snapshot_id:
                timeout = self.calculate_snapshot_restore_timeout(size)
                self._log.info(
                    "Create volume from snapshot timeout calculated at {0} "
                    "seconds".format(timeout))

            elif source_volid:
                timeout = self.calculate_volume_clone_timeout(size)
                self._log.info("Clone a volume timeout calculated at {0} "
                               "seconds".format(timeout))
        except:
            # Worst case if no config values are set.
            # Use the default volume create timeout.
            self._log.info("Unable to use create-method-specific timeout, "
                           "defaulting to normal volume create timeout of {0} "
                           "seconds".format(timeout))

        self._log.info("create_available_volume() is creating a volume")
        start_time = time()
        resp = self.create_volume(size,
                                  volume_type,
                                  name=name,
                                  description=description,
                                  availability_zone=availability_zone,
                                  metadata=metadata,
                                  bootable=bootable,
                                  image_ref=image_ref,
                                  snapshot_id=snapshot_id,
                                  source_volid=source_volid)
        timeout = timeout - (time() - start_time)

        volume = self._verify_entity(resp)

        # Verify volume progression from 'creating' to 'available'
        verifier = StatusProgressionVerifier('volume', volume.id_,
                                             self.get_volume_status,
                                             volume.id_)

        verifier.set_global_state_properties(timeout)
        verifier.add_state(
            expected_statuses=[self.statuses.Volume.CREATING],
            acceptable_statuses=[self.statuses.Volume.AVAILABLE],
            error_statuses=[self.statuses.Volume.ERROR],
            poll_rate=self.config.volume_status_poll_frequency)

        verifier.add_state(expected_statuses=[self.statuses.Volume.AVAILABLE],
                           error_statuses=[self.statuses.Volume.ERROR],
                           poll_rate=self.config.volume_status_poll_frequency)

        verifier.start()
        # Return volume model
        resp = self.client.get_volume_info(volume.id_)
        volume = self._verify_entity(resp)
        return volume