%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/3rdparty/php-opencloud/openstack/src/Images/v2/Models/ |
| Current File : /www/varak.net/nextcloud.varak.net/3rdparty/php-opencloud/openstack/src/Images/v2/Models/Image.php |
<?php
declare(strict_types=1);
namespace OpenStack\Images\v2\Models;
use OpenStack\Common\JsonSchema\Schema;
use OpenStack\Common\Resource\Alias;
use OpenStack\Common\Resource\Creatable;
use OpenStack\Common\Resource\Deletable;
use OpenStack\Common\Resource\Listable;
use OpenStack\Common\Resource\OperatorResource;
use OpenStack\Common\Resource\Retrievable;
use OpenStack\Common\Transport\Utils;
use OpenStack\Images\v2\JsonPatch;
use Psr\Http\Message\StreamInterface;
/**
* @property \OpenStack\Images\v2\Api $api
*/
class Image extends OperatorResource implements Creatable, Listable, Retrievable, Deletable
{
/** @var string */
public $status;
/** @var string */
public $name;
/** @var array */
public $tags;
/** @var string */
public $containerFormat;
/** @var \DateTimeImmutable */
public $createdAt;
/** @var string */
public $diskFormat;
/** @var \DateTimeImmutable */
public $updatedAt;
/** @var string */
public $visibility;
/** @var int */
public $minDisk;
/** @var bool */
public $protected;
/** @var string */
public $id;
/** @var \GuzzleHttp\Psr7\Uri */
public $fileUri;
/** @var string */
public $checksum;
/** @var string */
public $ownerId;
/** @var int */
public $size;
/** @var int */
public $minRam;
/** @var \GuzzleHttp\Psr7\Uri */
public $schemaUri;
/** @var int */
public $virtualSize;
private $jsonSchema;
protected $aliases = [
'container_format' => 'containerFormat',
'disk_format' => 'diskFormat',
'min_disk' => 'minDisk',
'owner' => 'ownerId',
'min_ram' => 'minRam',
'virtual_size' => 'virtualSize',
];
protected function getAliases(): array
{
return parent::getAliases() + [
'created_at' => new Alias('createdAt', \DateTimeImmutable::class),
'updated_at' => new Alias('updatedAt', \DateTimeImmutable::class),
'fileUri' => new Alias('fileUri', \GuzzleHttp\Psr7\Uri::class),
'schemaUri' => new Alias('schemaUri', \GuzzleHttp\Psr7\Uri::class),
];
}
public function populateFromArray(array $data): self
{
parent::populateFromArray($data);
$baseUri = $this->getHttpBaseUrl();
if (isset($data['file'])) {
$this->fileUri = Utils::appendPath($baseUri, $data['file']);
}
if (isset($data['schema'])) {
$this->schemaUri = Utils::appendPath($baseUri, $data['schema']);
}
return $this;
}
public function create(array $data): Creatable
{
$response = $this->execute($this->api->postImages(), $data);
return $this->populateFromResponse($response);
}
public function retrieve()
{
$response = $this->executeWithState($this->api->getImage());
$this->populateFromResponse($response);
}
private function getSchema(): Schema
{
if (null === $this->jsonSchema) {
$response = $this->execute($this->api->getImageSchema());
$this->jsonSchema = new Schema(Utils::jsonDecode($response, false));
}
return $this->jsonSchema;
}
public function update(array $data)
{
// retrieve latest state so we can accurately produce a diff
$this->retrieve();
$schema = $this->getSchema();
$data = (object) $data;
$aliasNames = array_map(
function (Alias $a) {
return $a->propertyName;
},
$this->getAliases()
);
// formulate src and des structures
$des = $schema->normalizeObject($data, $aliasNames);
$src = $schema->normalizeObject($this, $aliasNames);
// validate user input
$schema->validate($des);
if (!$schema->isValid()) {
throw new \RuntimeException($schema->getErrorString());
}
// formulate diff
$patch = new JsonPatch();
$diff = $patch->disableRestrictedPropRemovals($patch->diff($src, $des), $schema->getPropertyPaths());
$json = json_encode($diff, JSON_UNESCAPED_SLASHES);
// execute patch operation
$response = $this->execute($this->api->patchImage(), [
'id' => $this->id,
'patchDoc' => $json,
'contentType' => 'application/openstack-images-v2.1-json-patch',
]);
$this->populateFromResponse($response);
}
public function delete()
{
$this->executeWithState($this->api->deleteImage());
}
public function deactivate()
{
$this->executeWithState($this->api->deactivateImage());
}
public function reactivate()
{
$this->executeWithState($this->api->reactivateImage());
}
public function uploadData(StreamInterface $stream)
{
$this->execute($this->api->postImageData(), [
'id' => $this->id,
'data' => $stream,
'contentType' => 'application/octet-stream',
]);
}
public function downloadData(): StreamInterface
{
$response = $this->executeWithState($this->api->getImageData());
return $response->getBody();
}
public function addMember($memberId): Member
{
return $this->model(Member::class, ['imageId' => $this->id, 'id' => $memberId])->create([]);
}
/**
* @return \Generator<mixed, \OpenStack\Images\v2\Models\Member>
*/
public function listMembers(): \Generator
{
return $this->model(Member::class)->enumerate($this->api->getImageMembers(), ['imageId' => $this->id]);
}
public function getMember($memberId): Member
{
return $this->model(Member::class, ['imageId' => $this->id, 'id' => $memberId]);
}
}