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\Compute;
19
20 use OpenCloud\Common\Exceptions;
21 use OpenCloud\Common\Http\Client;
22 use OpenCloud\Common\Service\NovaService;
23
24 /**
25 * The Compute class represents the OpenStack Nova service.
26 *
27 * It is constructed from a OpenStack object and requires a service name,
28 * region, and URL type to select the proper endpoint from the service
29 * catalog. However, constants can be used to define default values for
30 * these to make it easier to use:
31 *
32 * Creating a compute object:
33 *
34 * <code>
35 * $rackspace = new OpenCloud\Rackspace(...);
36 * $dallas = new Compute(
37 * $rackspace, // connection
38 * 'cloudServersOpenStack', // the service's name
39 * 'DFW', // region identifier
40 * 'publicURL' // URL type
41 * );
42 * </code>
43 *
44 * The easy way (with defaults); this assumes that the constants (RAXSDK_...)
45 * are defined elsewhere *before* the inclusion of the first SDK library file:
46 *
47 * <code>
48 * $rackspace = new OpenCloud\Rackspace(...);
49 * $dallas = new OpenCloud\Compute($rackspace); // uses defaults
50 * </code>
51 *
52 */
53 class Service extends NovaService
54 {
55 const DEFAULT_TYPE = 'compute';
56 const DEFAULT_NAME = 'cloudServersOpenStack';
57
58 protected $additionalExtensions = array('OS-FLV-DISABLED');
59
60 public function __construct(Client $client, $type = null, $name = null, $region = null, $urlType = null)
61 {
62 parent::__construct($client, $type, $name, $region, $urlType);
63
64 // @see https://github.com/rackspace/php-opencloud/issues/353
65 if (strpos($this->getUrl()->getPath(), '/v1.0/') !== false) {
66 throw new Exceptions\UnsupportedVersionError(sprintf(
67 'Sorry; API version /v1.0 is not supported [%s]',
68 $this->getUrl()
69 ));
70 }
71
72 $this->loadNamespaces();
73 }
74
75 /**
76 * Returns a Server object associated with this Compute service
77 *
78 * This is a factory method and should generally be used to create server
79 * objects (thus ensuring that they are correctly associated with the
80 * server) instead of calling the Server class explicitly.
81 *
82 * @api
83 * @param string $id - if specified, the server with the ID is retrieved
84 * @returns Resource\Server object
85 */
86 public function server($id = null)
87 {
88 return new Resource\Server($this, $id);
89 }
90
91 /**
92 * Returns a Collection of server objects, filtered by the specified
93 * parameters
94 *
95 * This is a factory method and should normally be called instead of
96 * creating a ServerList object directly.
97 *
98 * @api
99 * @param boolean $details - if TRUE, full server details are returned; if
100 * FALSE, just the minimal set of info is listed. Defaults to TRUE;
101 * you might set this to FALSE to improve performance at the risk of
102 * not having all the information you need.
103 * @param array $filter - a set of key/value pairs that is passed to the
104 * servers list for filtering
105 * @returns \OpenCloud\Common\Collection
106 */
107 public function serverList($details = true, array $filter = array())
108 {
109 $url = $this->getUrl(Resource\Server::resourceName() . (($details) ? '/detail' : ''), $filter);
110
111 return $this->collection('OpenCloud\Compute\Resource\Server', $url);
112 }
113
114 /**
115 * Returns a Network object
116 *
117 * @api
118 * @param string $id the network ID
119 * @return Resource\Network
120 */
121 public function network($id = null)
122 {
123 return new Resource\Network($this, $id);
124 }
125
126 /**
127 * Returns a Collection of Network objects
128 *
129 * @api
130 * @param array $filter array of filter key/value pairs
131 * @return \OpenCloud\Common\Collection
132 */
133 public function networkList($filter = array())
134 {
135 return $this->collection('OpenCloud\Compute\Resource\Network');
136 }
137
138 /**
139 * Returns an image from the service
140 *
141 * This is a factory method and should normally be called instead of
142 * creating an Image object directly.
143 *
144 * @api
145 * @param string $id - if supplied, returns the image with the specified ID.
146 * @return Resource\Image object
147 */
148 public function image($id = null)
149 {
150 return new Resource\Image($this, $id);
151 }
152
153 /**
154 * Returns a Collection of images (class Image)
155 *
156 * This is a factory method and should normally be used instead of creating
157 * an ImageList object directly.
158 *
159 * @api
160 * @param boolean $details - if TRUE (the default), returns complete image
161 * details. Set to FALSE to improve performance, but only return a
162 * minimal set of data
163 * @param array $filter - key/value pairs to pass to the images resource.
164 * The actual values available here are determined by the OpenStack
165 * code and any extensions installed by your cloud provider;
166 * see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/List_Images-d1e4435.html
167 * for current filters available.
168 * @return \OpenCloud\Common\Collection
169 */
170 public function imageList($details = true, array $filter = array())
171 {
172 $url = clone $this->getUrl();
173 $url->addPath('images');
174
175 if ($details === true) {
176 $url->addPath('detail');
177 }
178
179 if (count($filter)) {
180 $url->setQuery($filter);
181 }
182
183 return $this->resourceList('Image', $url);
184 }
185
186 public function keypair($data = null)
187 {
188 return $this->resource('KeyPair', $data);
189 }
190
191 public function listKeypairs()
192 {
193 return $this->resourceList('KeyPair', null, $this);
194 }
195 }
196