     1: <?php
     2: /**
     3:  * Copyright 2012-2014 Rackspace US, Inc.
     4:  *
     5:  * Licensed under the Apache License, Version 2.0 (the "License");
     6:  * you may not use this file except in compliance with the License.
     7:  * You may obtain a copy of the License at
     8:  *
     9:  * http://www.apache.org/licenses/LICENSE-2.0
    10:  *
    11:  * Unless required by applicable law or agreed to in writing, software
    12:  * distributed under the License is distributed on an "AS IS" BASIS,
    13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14:  * See the License for the specific language governing permissions and
    15:  * limitations under the License.
    16:  */
    17:
    18: namespace OpenCloud\Image\Resource;
    19:
    20: use Guzzle\Http\Exception\BadResponseException;
    21: use OpenCloud\Common\Exceptions\ForbiddenOperationException;
    22: use OpenCloud\Common\Exceptions\ResourceNotFoundException;
    23: use OpenCloud\Image\Enum\MemberStatus;
    24:
    25: /**
    26:  * Class that represents a Member which belongs to a Glance Image. In more general terms, an image member is a user who
    27:  * has been granted access to an image. Normally, if an image is not public, only the owner can boot from the image.
    28:  *
    29:  * @package OpenCloud\Images\Resource
    30:  */
    31: class Member extends AbstractSchemaResource
    32: {
    33:     protected static $url_resource = 'members';
    34:     protected static $json_name = '';
    35:     protected static $json_collection_name = 'members';
    36:
    37:     /**
    38:      * @var array Enumerated types
    39:      */
    40:     private $allowedStates = array(
    41:         MemberStatus::ACCEPTED,
    42:         MemberStatus::PENDING,
    43:         MemberStatus::REJECTED
    44:     );
    45:
    46:     /**
    47:      * Update the status of a member, allowing them to fully access an image after being invited
    48:      *
    49:      * @param $status The eventual status this member wants.
    50:      * @return \Guzzle\Http\Message\Response
    51:      * @throws \OpenCloud\Common\Exceptions\ForbiddenOperationException
    52:      * @throws \OpenCloud\Common\Exceptions\ResourceNotFoundException
    53:      * @throws \Guzzle\Http\Exception\BadResponseException
    54:      * @throws \InvalidArgumentException
    55:      */
    56:     public function updateStatus($status)
    57:     {
    58:         if (!in_array($status, $this->allowedStates)) {
    59:             throw new \InvalidArgumentException(
    60:                 sprintf('Status must be one of these defined types: %s', implode($this->allowedStates, ','))
    61:             );
    62:         }
    63:
    64:         $json = json_encode(array('status' => $status));
    65:
    66:         $request = $this->getClient()->put($this->getUrl(), self::getJsonHeader(), $json);
    67:
    68:         try {
    69:             return $request->send();
    70:         } catch (BadResponseException $e) {
    71:             $response = $e->getResponse();
    72:
    73:             switch ($response->getStatusCode()) {
    74:                 case 403:
    75:                     $exception = ForbiddenOperationException::factory($e);
    76:                     break;
    77:                 case 404:
    78:                     $exception = ResourceNotFoundException::factory($e);
    79:                     break;
    80:             }
    81:
    82:             throw isset($exception) ? $exception : $e;
    83:         }
    84:     }
    85:
    86:     /**
    87:      * @return \Guzzle\Http\Message\Response
    88:      */
    89:     public function delete()
    90:     {
    91:         return $this->getClient()->delete($this->getUrl())->send();
    92:     }
    93: }
    94: