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;
19
20 use OpenCloud\Common\Exceptions\CredentialError;
21 use OpenCloud\Common\Service\ServiceBuilder;
22
23 /**
24 * Rackspace extends the OpenStack class with support for Rackspace's
25 * API key and tenant requirements.
26 *
27 * The only difference between Rackspace and OpenStack is that the
28 * Rackspace class generates credentials using the username
29 * and API key, as required by the Rackspace authentication
30 * service.
31 *
32 * Example:
33 * <pre><code>
34 * $client = new Rackspace(
35 * 'https://identity.api.rackspacecloud.com/v2.0/',
36 * array(
37 * 'username' => 'FRED',
38 * 'apiKey' => '0900af093093788912388fc09dde090ffee09'
39 * )
40 * );
41 * </code></pre>
42 */
43 class Rackspace extends OpenStack
44 {
45 const US_IDENTITY_ENDPOINT = 'https://identity.api.rackspacecloud.com/v2.0/';
46 const UK_IDENTITY_ENDPOINT = 'https://lon.identity.api.rackspacecloud.com/v2.0/';
47
48 /**
49 * Generates Rackspace API key credentials
50 * {@inheritDoc}
51 */
52 public function getCredentials()
53 {
54 $secret = $this->getSecret();
55
56 if (!empty($secret['username']) && !empty($secret['apiKey'])) {
57 $credentials = array('auth' => array(
58 'RAX-KSKEY:apiKeyCredentials' => array(
59 'username' => $secret['username'],
60 'apiKey' => $secret['apiKey']
61 )
62 ));
63
64 if (!empty($secret['tenantName'])) {
65 $credentials['auth']['tenantName'] = $secret['tenantName'];
66 } elseif (!empty($secret['tenantId'])) {
67 $credentials['auth']['tenantId'] = $secret['tenantId'];
68 }
69
70 return json_encode($credentials);
71 } else {
72 throw new CredentialError('Unrecognized credential secret');
73 }
74 }
75
76 /**
77 * Creates a new Database service. Note: this is a Rackspace-only feature.
78 *
79 * @param string $name The name of the service as it appears in the Catalog
80 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
81 * @param string $urltype The URL type ("publicURL" or "internalURL")
82 * @return \OpenCloud\Database\Service
83 */
84 public function databaseService($name = null, $region = null, $urltype = null)
85 {
86 return ServiceBuilder::factory($this, 'OpenCloud\Database\Service', array(
87 'name' => $name,
88 'region' => $region,
89 'urlType' => $urltype
90 ));
91 }
92
93 /**
94 * Creates a new Load Balancer service. Note: this is a Rackspace-only feature.
95 *
96 * @param string $name The name of the service as it appears in the Catalog
97 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
98 * @param string $urltype The URL type ("publicURL" or "internalURL")
99 * @return \OpenCloud\LoadBalancer\Service
100 */
101 public function loadBalancerService($name = null, $region = null, $urltype = null)
102 {
103 return ServiceBuilder::factory($this, 'OpenCloud\LoadBalancer\Service', array(
104 'name' => $name,
105 'region' => $region,
106 'urlType' => $urltype
107 ));
108 }
109
110 /**
111 * Creates a new DNS service. Note: this is a Rackspace-only feature.
112 *
113 * @param string $name The name of the service as it appears in the Catalog
114 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
115 * @param string $urltype The URL type ("publicURL" or "internalURL")
116 * @return OpenCloud\DNS\Service
117 */
118 public function dnsService($name = null, $region = null, $urltype = null)
119 {
120 return ServiceBuilder::factory($this, 'OpenCloud\DNS\Service', array(
121 'name' => $name,
122 'region' => $region,
123 'urlType' => $urltype
124 ));
125 }
126
127 /**
128 * Creates a new CloudMonitoring service. Note: this is a Rackspace-only feature.
129 *
130 * @param string $name The name of the service as it appears in the Catalog
131 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
132 * @param string $urltype The URL type ("publicURL" or "internalURL")
133 * @return \OpenCloud\CloudMonitoring\Service
134 */
135 public function cloudMonitoringService($name = null, $region = null, $urltype = null)
136 {
137 return ServiceBuilder::factory($this, 'OpenCloud\CloudMonitoring\Service', array(
138 'name' => $name,
139 'region' => $region,
140 'urlType' => $urltype
141 ));
142 }
143
144 /**
145 * Creates a new CloudQueues service. Note: this is a Rackspace-only feature.
146 *
147 * @param string $name The name of the service as it appears in the Catalog
148 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
149 * @param string $urltype The URL type ("publicURL" or "internalURL")
150 * @return \OpenCloud\Autoscale\Service
151 */
152 public function autoscaleService($name = null, $region = null, $urltype = null)
153 {
154 return ServiceBuilder::factory($this, 'OpenCloud\Autoscale\Service', array(
155 'name' => $name,
156 'region' => $region,
157 'urlType' => $urltype
158 ));
159 }
160
161 /**
162 * Creates a new CloudQueues service. Note: this is a Rackspace-only feature.
163 *
164 * @param string $name The name of the service as it appears in the Catalog
165 * @param string $region The region (DFW, IAD, ORD, LON, SYD)
166 * @param string $urltype The URL type ("publicURL" or "internalURL")
167 * @return \OpenCloud\Queues\Service
168 */
169 public function queuesService($name = null, $region = null, $urltype = null)
170 {
171 return ServiceBuilder::factory($this, 'OpenCloud\Queues\Service', array(
172 'name' => $name,
173 'region' => $region,
174 'urlType' => $urltype
175 ));
176 }
177 }
178