Skip to content

Commit f42dd25

Browse files
Merge pull request #177 from php-opencloud/micro-version
Specify service micro version
2 parents d7bf04e + f4d5e8c commit f42dd25

File tree

8 files changed

+74
-9
lines changed

8 files changed

+74
-9
lines changed

src/Common/Service/Builder.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,11 @@ private function stockHttpClient(array &$options, string $serviceName)
9797
$stack = $this->getStack($options['authHandler'], $token);
9898
}
9999

100+
$microVersion = $options['microVersion'] ?? null;
101+
100102
$this->addDebugMiddleware($options, $stack);
101103

102-
$options['httpClient'] = $this->httpClient($baseUrl, $stack);
104+
$options['httpClient'] = $this->httpClient($baseUrl, $stack, $options['catalogType'], $microVersion);
103105
}
104106
}
105107

@@ -137,17 +139,20 @@ private function getStack(callable $authHandler, Token $token = null): HandlerSt
137139
return $stack;
138140
}
139141

140-
private function httpClient(string $baseUrl, HandlerStack $stack): ClientInterface
142+
private function httpClient(string $baseUrl, HandlerStack $stack, string $serviceType = null, string $microVersion = null): ClientInterface
141143
{
142144
$clientOptions = [
143145
'base_uri' => Utils::normalizeUrl($baseUrl),
144146
'handler' => $stack,
145147
];
146148

149+
if ($microVersion && $serviceType) {
150+
$clientOptions['headers']['OpenStack-API-Version'] = sprintf('%s %s', $serviceType, $microVersion);
151+
}
152+
147153
if (isset($this->globalOptions['requestOptions'])) {
148154
$clientOptions = array_merge($this->globalOptions['requestOptions'], $clientOptions);
149155
}
150-
151156
return new Client($clientOptions);
152157
}
153158

src/Compute/v2/Api.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,8 @@ public function getKeypair(): array
600600
'method' => 'GET',
601601
'path' => 'os-keypairs/{name}',
602602
'params' => [
603-
'name' => $this->isRequired($this->params->keypairName())
603+
'name' => $this->isRequired($this->params->keypairName()),
604+
'userId' => $this->params->userId()
604605
],
605606
];
606607
}
@@ -610,7 +611,9 @@ public function getKeypairs(): array
610611
return [
611612
'method' => 'GET',
612613
'path' => 'os-keypairs',
613-
'params' => [],
614+
'params' => [
615+
'userId' => $this->params->userId()
616+
],
614617
];
615618
}
616619

src/Compute/v2/Models/Keypair.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected function getAliases(): array
6565
*/
6666
public function retrieve()
6767
{
68-
$response = $this->execute($this->api->getKeypair(), ['name' => (string) $this->name]);
68+
$response = $this->execute($this->api->getKeypair(), $this->getAttrs(['name', 'userId']));
6969
$this->populateFromResponse($response);
7070
}
7171

src/Compute/v2/Params.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,16 @@ public function keypairName(): array
451451
];
452452
}
453453

454+
public function userId(): array
455+
{
456+
return [
457+
'type' => self::STRING_TYPE,
458+
'sentAs' => 'user_id',
459+
'location' => self::QUERY,
460+
'description' => 'This allows administrative users to operate key-pairs of specified user ID. Requires micro version 2.10.'
461+
];
462+
}
463+
454464
public function flavorRam(): array
455465
{
456466
return [

src/OpenStack.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private function getDefaultIdentityService(array $options): Service
6666

6767
$clientOptions = [
6868
'base_uri' => Utils::normalizeUrl($options['authUrl']),
69-
'handler' => $stack
69+
'handler' => $stack,
7070
];
7171

7272
if (isset($options['requestOptions'])) {

tests/unit/Common/Service/BuilderTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace OpenStack\Test\Common\Service;
44

5+
use GuzzleHttp\Client;
56
use OpenStack\Common\Auth\IdentityService;
67
use OpenStack\Common\Auth\Token;
78
use OpenStack\Common\Service\Builder;
@@ -116,6 +117,30 @@ public function test_it_does_not_authenticate_for_identity_services()
116117

117118
$this->assertInstanceOf(Fixtures\Identity\Service::class, $s);
118119
}
120+
121+
public function test_it_create_service_with_micro_version()
122+
{
123+
$is = $this->prophesize(TestIdentity::class);
124+
$is->authenticate(Argument::any())->willReturn([new FakeToken(), '']);
125+
126+
$s = $this->builder->createService('Test\\Common\\Service\\Fixtures', $this->opts + [
127+
'identityService' => $is->reveal(),
128+
'microVersion' => '1.2.3'
129+
]);
130+
131+
$this->assertInstanceOf(Fixtures\Service::class, $s);
132+
133+
$refClass = new \ReflectionClass($s);
134+
$refProperty = $refClass->getProperty('client');
135+
$refProperty->setAccessible(true);
136+
137+
/** @var Client $client */
138+
$client = $refProperty->getValue($s);
139+
140+
$headers = $client->getConfig()['headers'];
141+
$this->assertArrayHasKey('OpenStack-API-Version', $headers);
142+
$this->assertEquals('7 1.2.3', $headers['OpenStack-API-Version']);
143+
}
119144
}
120145

121146
class FakeToken implements Token

tests/unit/Compute/v2/Fixtures/keypair-get.resp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Content-Type: application/json
55
"keypair": {
66
"fingerprint": "44:fe:29:6e:23:14:b9:53:5b:65:82:58:1c:fe:5a:c3",
77
"name": "keypair-test",
8-
"public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1HTrHCbb9NawNLSV8N6tSa8i637+EC2dA+lsdHHfQlT54t+N0nHhJPlKWDLhc579j87vp6RDFriFJ/smsTnDnf64O12z0kBaJpJPH2zXrBkZFK6q2rmxydURzX/z0yLSCP77SFJ0fdXWH2hMsAusflGyryHGX20n+mZK6mDrxVzGxEz228dwQ5G7Az5OoZDWygH2pqPvKjkifRw0jwUKf3BbkP0QvANACOk26cv16mNFpFJfI1N3OC5lUsZQtKGR01ptJoWijYKccqhkAKuo902tg/qup58J5kflNm7I61sy1mJon6SGqNUSfoQagqtBH6vd/tU1jnlwZ03uUroAL",
8+
"public_key": "ssh-rsa AAAAAAABBBBBBBBBCCCCCCCCCCC foo@bar.com",
99
"user_id": "fake",
1010
"deleted": false,
1111
"created_at": "2014-05-07T12:06:13.681238",

tests/unit/Compute/v2/Models/KeypairTest.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,29 @@ public function test_it_retrieves()
5353
$this->assertEquals('44:fe:29:6e:23:14:b9:53:5b:65:82:58:1c:fe:5a:c3', $this->keypair->fingerprint);
5454
$this->assertEquals(self::KEYPAIR_NAME, $this->keypair->name);
5555
$this->assertEquals(
56-
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1HTrHCbb9NawNLSV8N6tSa8i637+EC2dA+lsdHHfQlT54t+N0nHhJPlKWDLhc579j87vp6RDFriFJ/smsTnDnf64O12z0kBaJpJPH2zXrBkZFK6q2rmxydURzX/z0yLSCP77SFJ0fdXWH2hMsAusflGyryHGX20n+mZK6mDrxVzGxEz228dwQ5G7Az5OoZDWygH2pqPvKjkifRw0jwUKf3BbkP0QvANACOk26cv16mNFpFJfI1N3OC5lUsZQtKGR01ptJoWijYKccqhkAKuo902tg/qup58J5kflNm7I61sy1mJon6SGqNUSfoQagqtBH6vd/tU1jnlwZ03uUroAL',
56+
'ssh-rsa AAAAAAABBBBBBBBBCCCCCCCCCCC foo@bar.com',
57+
$this->keypair->publicKey
58+
);
59+
$this->assertFalse($this->keypair->deleted);
60+
}
61+
62+
public function test_it_retrieves_by_user_id()
63+
{
64+
$this->client
65+
->request('GET', 'os-keypairs/' . self::KEYPAIR_NAME, ['headers' => [], 'query' => ['user_id' => 'fake']])
66+
->shouldBeCalled()
67+
->willReturn($this->getFixture('keypair-get'));
68+
69+
70+
$this->keypair->userId = 'fake';
71+
$this->keypair->retrieve();
72+
73+
$this->assertEquals('1', $this->keypair->id);
74+
$this->assertEquals('fake', $this->keypair->userId);
75+
$this->assertEquals('44:fe:29:6e:23:14:b9:53:5b:65:82:58:1c:fe:5a:c3', $this->keypair->fingerprint);
76+
$this->assertEquals(self::KEYPAIR_NAME, $this->keypair->name);
77+
$this->assertEquals(
78+
'ssh-rsa AAAAAAABBBBBBBBBCCCCCCCCCCC foo@bar.com',
5779
$this->keypair->publicKey
5880
);
5981
$this->assertFalse($this->keypair->deleted);

0 commit comments

Comments
 (0)