php-opencloud / openstack

PHP SDK for OpenStack clouds
Apache License 2.0
222 stars 152 forks source link

Cr volume delete options #364

Closed mirchaemanuel closed 10 months ago

mirchaemanuel commented 10 months ago

feat(volume): Add cascade parameters, revise deletable interface, handle cascade on delete

abhiburk commented 3 months ago

I don't know if this wasn't merged but here is how I am doing it RN. If you wish to add customized params for eg. the cascade params in delete volume, here is my way. (Also implemented extend functionality for volume I,e resize volume)


$volume = $blockstorageV3->getVolume('YOUR ID');
// Extended custom `delete` function using new model class
$volume = new OpenStackVolume($volume);
$volume->delete(['cascade' => true]);

My OpenStackVolume class

class OpenStackVolume
{
    private $volume;

    public function __construct(Volume $volume)
    {
        $this->volume = $volume;
    }

    /**
     * @param int $new_size
     */
    public function extend(int $new_size)
    {
        $this->volume->execute($this->postVolumeExtend(), ['id' => $this->volume->id, 'new_size' => $new_size]);
    }

    public function postVolumeExtend(): array
    {
        return [
            'method'  => 'POST',
            'path'    => 'volumes/{id}/action',
            'jsonKey' => 'os-extend',
            'params'  => [
                'id'       => (new Params())->idPath(),
                'new_size' => [
                    'type'        => Params::INT_TYPE,
                    'location'    => Params::JSON,
                    'required'    => true,
                    'description' => 'The new size of the volume, in gibibytes (GiB).',
                ],
            ],
        ];
    }

    /**
     * @param array $params
     */
    public function delete(array $params = [])
    {
        $this->volume->execute($this->deleteVolume(), ['id' => $this->volume->id, 'cascade' => $params['cascade']]);
    }

    public function deleteVolume(): array
    {
        return [
            'method'  => 'DELETE',
            'path'    => 'volumes/{id}',
            'params'  => [
                'id'       => (new Params())->idPath(),
                'cascade' => [
                    'location'    => Params::QUERY,
                    'type'        => Params::BOOL_TYPE,
                    'description' => 'Indicates whether to force delete a volume even if the volume is in deleting or error_deleting.',
                ],
            ],
        ];
    }
}