      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\Orchestration;
     19:
     20: use OpenCloud\Common\PersistentObject;
     21: use OpenCloud\Exceptions\CreateError;
     22:
     23: /**
     24:  * The Stack class requires a CloudFormation template and may contain additional
     25:  * parameters for that template.
     26:  *
     27:  * A Stack is always associated with an (Orchestration) Service.
     28:  *
     29:  * @codeCoverageIgnore
     30:  */
     31: class Stack extends PersistentObject
     32: {
     33:     /**
     34:      * Identifier of stack.
     35:      *
     36:      * @var string
     37:      */
     38:     protected $id;
     39:
     40:     /**
     41:      * The name associated with the stack. Must be unique within your account,
     42:      * contain only alphanumeric characters (case sensitive) and start with an
     43:      * alpha character. Maximum length of the name is 255 characters.
     44:      *
     45:      * @var string
     46:      */
     47:     protected $stack_name;
     48:
     49:     /**
     50:      * A list of Parameter structures that specify input parameters for the stack.
     51:      *
     52:      * @var mixed
     53:      */
     54:     protected $parameters;
     55:
     56:     /**
     57:      * Structure containing the template body.
     58:      *
     59:      * @var string
     60:      */
     61:     protected $template;
     62:
     63:     /**
     64:      * Set to true to disable rollback of the stack if stack creation failed.
     65:      *
     66:      * @var bool
     67:      */
     68:     protected $disable_rollback;
     69:
     70:     /**
     71:      * Description of stack.
     72:      *
     73:      * @var string
     74:      */
     75:     protected $description;
     76:
     77:     /**
     78:      * @var type
     79:      */
     80:     protected $stack_status_reason;
     81:
     82:     /**
     83:      * @var type
     84:      */
     85:     protected $outputs;
     86:
     87:     /**
     88:      * @var type
     89:      */
     90:     protected $creation_time;
     91:
     92:     /**
     93:      * Array of stack lists.
     94:      *
     95:      * @var array
     96:      */
     97:     protected $links;
     98:
     99:     /**
    100:      * The list of capabilities that you want to allow in the stack.
    101:      *
    102:      * @var mixed
    103:      */
    104:     protected $capabilities;
    105:
    106:     /**
    107:      * The Simple Notification Service topic ARNs to publish stack related events.
    108:      *
    109:      * @var mixed
    110:      */
    111:     protected $notification_topics;
    112:
    113:     /**
    114:      * The amount of time that can pass before the stack status becomes
    115:      * CREATE_FAILED; if DisableRollback is not set or is set to false, the
    116:      * stack will be rolled back.
    117:      *
    118:      * @var string
    119:      */
    120:     protected $timeout_mins;
    121:
    122:     /**
    123:      * @var type
    124:      */
    125:     protected $stack_status;
    126:
    127:     /**
    128:      * @var type
    129:      */
    130:     protected $updated_time;
    131:
    132:     /**
    133:      * @var type
    134:      */
    135:     protected $template_description;
    136:
    137:     protected static $json_name = "stack";
    138:     protected static $url_resource = "stacks";
    139:     protected $createKeys = array(
    140:         'template',
    141:         'stack_name'
    142:     );
    143:
    144:     /**
    145:      * {@inheritDoc}
    146:      */
    147:     protected function createJson()
    148:     {
    149:         $pk = $this->primaryKeyField();
    150:
    151:         if (!empty($this->{$pk})) {
    152:             throw new CreateError(sprintf(
    153:                 'Stack is already created and has ID of %s',
    154:                 $this->$pk
    155:             ));
    156:         }
    157:
    158:         $object = (object) array('disable_rollback' => false, 'timeout_mins' => 60);
    159:
    160:         foreach ($this->createKeys as $property) {
    161:             if (empty($this->$property)) {
    162:                 throw new CreateError(sprintf(
    163:                     'Cannot create Stack with null %s',
    164:                     $property
    165:                 ));
    166:             } else {
    167:                 $object->$property = $this->$property;
    168:             }
    169:         }
    170:
    171:         if (null !== $this->parameters) {
    172:             $object->parameters = $this->parameters;
    173:         }
    174:
    175:         return $object;
    176:     }
    177:
    178:     public function name()
    179:     {
    180:         return $this->stack_name;
    181:     }
    182:
    183:     public function status()
    184:     {
    185:         return $this->stack_status;
    186:     }
    187:
    188:     public function resource($id = null)
    189:     {
    190:         $resource = new Resource($this->getService());
    191:         $resource->setParent($this);
    192:         $resource->populate($id);
    193:
    194:         return $resource;
    195:     }
    196:
    197:     public function resources()
    198:     {
    199:         return $this->getService()->collection(
    200:             'OpenCloud\Orchestration\Resource',
    201:             $this->url('resources'),
    202:             $this
    203:         );
    204:     }
    205: }
    206: