diff --git a/secretmanager/README.md b/secretmanager/README.md new file mode 100644 index 0000000000..b4d04ebfe3 --- /dev/null +++ b/secretmanager/README.md @@ -0,0 +1,65 @@ +# Google Secret Manager PHP Sample Application + +[![Open in Cloud Shell][shell_img]][shell_link] + +[shell_img]: http://gstatic.com/cloudssh/images/open-btn.svg +[shell_link]: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googlecloudplatform/php-docs-samples&page=editor&working_dir=secretmanager + +## Description + +This simple command-line application demonstrates how to invoke +[Google Secret Manager][secretmanager] from PHP. + +## Build and Run + +1. **Enable APIs** - [Enable the Secret Manager + API](https://console.cloud.google.com/flows/enableapi?apiid=secretmanager.googleapis.com) + and create a new project or select an existing project. + +1. **Download The Credentials** - Click "Go to credentials" after enabling the + APIs. Click "New Credentials" and select "Service Account Key". Create a new + service account, use the JSON key type, and select "Create". Once + downloaded, set the environment variable `GOOGLE_APPLICATION_CREDENTIALS` to + the path of the JSON key that was downloaded. + +1. **Clone the repo** and cd into this directory + + ```text + $ git clone https://github.com/GoogleCloudPlatform/php-docs-samples + $ cd php-docs-samples/secretmanager + ``` + +1. **Install dependencies** via [Composer][install-composer]. If composer is + installed locally: + + + ```text + $ php composer.phar install + ``` + + If composer is installed globally: + + ```text + $ composer install + ``` + +1. Execute the snippets in the [src/](src/) directory by running: + + ```text + $ php src/SNIPPET_NAME.php + ``` + + The usage will print for each if no arguments are provided. + +See the [Secret Manager Documentation](https://cloud.google.com/secret-manager/docs) for more information. + +## Contributing changes + +* See [CONTRIBUTING.md](../CONTRIBUTING.md) + +## Licensing + +* See [LICENSE](../LICENSE) + +[install-composer]: http://getcomposer.org/doc/00-intro.md +[secretmanager]: https://cloud.google.com/secret-manager diff --git a/secretmanager/composer.json b/secretmanager/composer.json new file mode 100644 index 0000000000..c911dca123 --- /dev/null +++ b/secretmanager/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "google/cloud-secret-manager": "^0.1.0" + } +} diff --git a/secretmanager/phpunit.xml.dist b/secretmanager/phpunit.xml.dist new file mode 100644 index 0000000000..8c72a2876d --- /dev/null +++ b/secretmanager/phpunit.xml.dist @@ -0,0 +1,37 @@ + + + + + + test + + + + + + + + ./src + + ./vendor + + + + + + + diff --git a/secretmanager/quickstart.php b/secretmanager/quickstart.php new file mode 100644 index 0000000000..c0bc4efe86 --- /dev/null +++ b/secretmanager/quickstart.php @@ -0,0 +1,68 @@ +projectName($projectId); + +// Create the parent secret. +$secret = $client->createSecret($parent, $secretId, [ + 'secret' => new Secret([ + 'replication' => new Replication([ + 'automatic' => new Automatic(), + ]), + ]), +]); + +// Add the secret version. +$version = $client->addSecretVersion($secret->getName(), new SecretPayload([ + 'data' => 'hello world', +])); + +// Access the secret version. +$response = $client->accessSecretVersion($version->getName()); + +// Print the secret payload. +// +// WARNING: Do not print the secret in a production environment - this +// snippet is showing how to access the secret material. +$payload = $response->getPayload()->getData(); +printf('Plaintext: %s' . PHP_EOL, $payload); +// [END secretmanager_quickstart] diff --git a/secretmanager/src/access_secret_version.php b/secretmanager/src/access_secret_version.php new file mode 100644 index 0000000000..47867b1b4a --- /dev/null +++ b/secretmanager/src/access_secret_version.php @@ -0,0 +1,57 @@ +secretVersionName($projectId, $secretId, $versionId); + +// Access the secret version. +$response = $client->accessSecretVersion($name); + +// Print the secret payload. +// +// WARNING: Do not print the secret in a production environment - this +// snippet is showing how to access the secret material. +$payload = $response->getPayload()->getData(); +printf('Plaintext: %s', $payload); +// [END secretmanager_access_secret_version] diff --git a/secretmanager/src/add_secret_version.php b/secretmanager/src/add_secret_version.php new file mode 100644 index 0000000000..a0113e40a0 --- /dev/null +++ b/secretmanager/src/add_secret_version.php @@ -0,0 +1,55 @@ +secretName($projectId, $secretId); + +// Access the secret version. +$response = $client->addSecretVersion($parent, new SecretPayload([ + 'data' => 'my super secret data', +])); + +// Print the new secret version name. +printf('Added secret version: %s', $response->getName()); +// [END secretmanager_add_secret_version] diff --git a/secretmanager/src/create_secret.php b/secretmanager/src/create_secret.php new file mode 100644 index 0000000000..99464e368b --- /dev/null +++ b/secretmanager/src/create_secret.php @@ -0,0 +1,61 @@ +projectName($projectId); + +// Create the secret. +$secret = $client->createSecret($parent, $secretId, [ + 'secret' => new Secret([ + 'replication' => new Replication([ + 'automatic' => new Automatic(), + ]), + ]), +]); + +// Print the new secret name. +printf('Created secret: %s', $secret->getName()); +// [END secretmanager_create_secret] diff --git a/secretmanager/src/delete_secret.php b/secretmanager/src/delete_secret.php new file mode 100644 index 0000000000..5bf396a8ff --- /dev/null +++ b/secretmanager/src/delete_secret.php @@ -0,0 +1,50 @@ +secretName($projectId, $secretId); + +// Delete the secret. +$client->deleteSecret($name); +printf('Deleted secret %s', $secretId); +// [END secretmanager_delete_secret] diff --git a/secretmanager/src/destroy_secret_version.php b/secretmanager/src/destroy_secret_version.php new file mode 100644 index 0000000000..84086d3ec1 --- /dev/null +++ b/secretmanager/src/destroy_secret_version.php @@ -0,0 +1,53 @@ +secretVersionName($projectId, $secretId, $versionId); + +// Destroy the secret version. +$response = $client->destroySecretVersion($name); + +// Print a success message. +printf('Destroyed secret version: %s', $response->getName()); +// [END secretmanager_destroy_secret_version] diff --git a/secretmanager/src/disable_secret_version.php b/secretmanager/src/disable_secret_version.php new file mode 100644 index 0000000000..8758d473ee --- /dev/null +++ b/secretmanager/src/disable_secret_version.php @@ -0,0 +1,53 @@ +secretVersionName($projectId, $secretId, $versionId); + +// Disable the secret version. +$response = $client->disableSecretVersion($name); + +// Print a success message. +printf('Disabled secret version: %s', $response->getName()); +// [END secretmanager_disable_secret_version] diff --git a/secretmanager/src/enable_secret_version.php b/secretmanager/src/enable_secret_version.php new file mode 100644 index 0000000000..fcee12ce29 --- /dev/null +++ b/secretmanager/src/enable_secret_version.php @@ -0,0 +1,53 @@ +secretVersionName($projectId, $secretId, $versionId); + +// Enable the secret version. +$response = $client->enableSecretVersion($name); + +// Print a success message. +printf('Enabled secret version: %s', $response->getName()); +// [END secretmanager_enable_secret_version] diff --git a/secretmanager/src/get_secret.php b/secretmanager/src/get_secret.php new file mode 100644 index 0000000000..25988ac311 --- /dev/null +++ b/secretmanager/src/get_secret.php @@ -0,0 +1,55 @@ +secretName($projectId, $secretId); + +// Get the secret. +$secret = $client->getSecret($name); + +// Get the replication policy. +$replication = strtoupper($secret->getReplication()->getReplication()); + +// Print data about the secret. +printf('Got secret %s with replication policy %s', $secret->getName(), $replication); +// [END secretmanager_get_secret] diff --git a/secretmanager/src/get_secret_version.php b/secretmanager/src/get_secret_version.php new file mode 100644 index 0000000000..38fd8e723d --- /dev/null +++ b/secretmanager/src/get_secret_version.php @@ -0,0 +1,57 @@ +secretVersionName($projectId, $secretId, $versionId); + +// Access the secret version. +$response = $client->getSecretVersion($name); + +// Get the state string from the enum. +$state = State::name($response->getState()); + +// Print a success message. +printf('Got secret version %s with state %s', $response->getName(), $state); +// [END secretmanager_get_secret_version] diff --git a/secretmanager/src/list_secret_versions.php b/secretmanager/src/list_secret_versions.php new file mode 100644 index 0000000000..71a5b635cd --- /dev/null +++ b/secretmanager/src/list_secret_versions.php @@ -0,0 +1,51 @@ +secretName($projectId, $secretId); + +// List all secret versions. +foreach ($client->listSecretVersions($parent) as $version) { + printf('Found secret version %s', $version->getName()); +} +// [END secretmanager_list_secret_versions] diff --git a/secretmanager/src/list_secrets.php b/secretmanager/src/list_secrets.php new file mode 100644 index 0000000000..1764fa40ea --- /dev/null +++ b/secretmanager/src/list_secrets.php @@ -0,0 +1,50 @@ +projectName($projectId); + +// List all secrets. +foreach ($client->listSecrets($parent) as $secret) { + printf('Found secret %s', $secret->getName()); +} +// [END secretmanager_list_secrets] diff --git a/secretmanager/src/update_secret.php b/secretmanager/src/update_secret.php new file mode 100644 index 0000000000..b4ca1c04ef --- /dev/null +++ b/secretmanager/src/update_secret.php @@ -0,0 +1,61 @@ +secretName($projectId, $secretId); + +// Update the secret. +$secret = (new Secret()) + ->setName($name) + ->setLabels(['secretmanager' => 'rocks']); + +$updateMask = (new FieldMask()) + ->setPaths(['labels']); + +$response = $client->updateSecret($secret, $updateMask); + +// Print the upated secret. +printf('Updated secret: %s', $response->getName()); +// [END secretmanager_update_secret] diff --git a/secretmanager/test/quickstartTest.php b/secretmanager/test/quickstartTest.php new file mode 100644 index 0000000000..eff7396568 --- /dev/null +++ b/secretmanager/test/quickstartTest.php @@ -0,0 +1,58 @@ +secretName(self::$projectId, self::$secretId); + + try { + $client->deleteSecret($name); + } catch (GaxApiException $e) { + if ($e->getStatus() != 'NOT_FOUND') { + throw $e; + } + } + } + + public function testQuickstart() + { + $output = self::runSnippet(__DIR__ . '/../quickstart.php', [ + self::$projectId, + self::$secretId, + ]); + $this->assertContains('Plaintext: hello world', $output); + } +} diff --git a/secretmanager/test/secretmanagerTest.php b/secretmanager/test/secretmanagerTest.php new file mode 100644 index 0000000000..32217919b6 --- /dev/null +++ b/secretmanager/test/secretmanagerTest.php @@ -0,0 +1,262 @@ +secretName(self::$projectId, self::randomSecretId()); + + self::$testSecretVersion = self::addSecretVersion(self::$testSecretWithVersions); + self::$testSecretVersionToDestroy = self::addSecretVersion(self::$testSecretWithVersions); + self::$testSecretVersionToDisable = self::addSecretVersion(self::$testSecretWithVersions); + self::$testSecretVersionToEnable = self::addSecretVersion(self::$testSecretWithVersions); + self::disableSecretVersion(self::$testSecretVersionToEnable); + } + + public static function tearDownAfterClass() + { + self::deleteSecret(self::$testSecret->getName()); + self::deleteSecret(self::$testSecretToDelete->getName()); + self::deleteSecret(self::$testSecretWithVersions->getName()); + self::deleteSecret(self::$testSecretToCreateName); + } + + private static function randomSecretId(): string + { + return uniqid('php-snippets-'); + } + + private static function createSecret(): Secret + { + $parent = self::$client->projectName(self::$projectId); + $secretId = self::randomSecretId(); + + return self::$client->createSecret($parent, $secretId, [ + 'secret' => new Secret([ + 'replication' => new Replication([ + 'automatic' => new Automatic(), + ]), + ]), + ]); + } + + private static function addSecretVersion(Secret $secret): SecretVersion + { + return self::$client->addSecretVersion($secret->getName(), new SecretPayload([ + 'data' => 'my super secret data', + ])); + } + + private static function disableSecretVersion(SecretVersion $version): SecretVersion + { + return self::$client->disableSecretVersion($version->getName()); + } + + private static function deleteSecret(string $name) + { + try { + self::$client->deleteSecret($name); + } catch (GaxApiException $e) { + if ($e->getStatus() != 'NOT_FOUND') { + throw $e; + } + } + } + + public function testAccessSecretVersion() + { + $name = self::$client->parseName(self::$testSecretVersion->getName()); + + $output = $this->runSnippet('access_secret_version', [ + $name['project'], + $name['secret'], + $name['secret_version'], + ]); + + $this->assertContains('my super secret data', $output); + } + + public function testAddSecretVersion() + { + $name = self::$client->parseName(self::$testSecretWithVersions->getName()); + + $output = $this->runSnippet('add_secret_version', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('Added secret version', $output); + } + + public function testCreateSecret() + { + $name = self::$client->parseName(self::$testSecretToCreateName); + + $output = $this->runSnippet('create_secret', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('Created secret', $output); + } + + public function testDeleteSecret() + { + $name = self::$client->parseName(self::$testSecretToDelete->getName()); + + $output = $this->runSnippet('delete_secret', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('Deleted secret', $output); + } + + public function testDestroySecretVersion() + { + $name = self::$client->parseName(self::$testSecretVersionToDestroy->getName()); + + $output = $this->runSnippet('destroy_secret_version', [ + $name['project'], + $name['secret'], + $name['secret_version'], + ]); + + $this->assertContains('Destroyed secret version', $output); + } + + public function testDisableSecretVersion() + { + $name = self::$client->parseName(self::$testSecretVersionToDisable->getName()); + + $output = $this->runSnippet('disable_secret_version', [ + $name['project'], + $name['secret'], + $name['secret_version'], + ]); + + $this->assertContains('Disabled secret version', $output); + } + + public function testEnableSecretVersion() + { + $name = self::$client->parseName(self::$testSecretVersionToEnable->getName()); + + $output = $this->runSnippet('enable_secret_version', [ + $name['project'], + $name['secret'], + $name['secret_version'], + ]); + + $this->assertContains('Enabled secret version', $output); + } + + public function testGetSecretVersion() + { + $name = self::$client->parseName(self::$testSecretVersion->getName()); + + $output = $this->runSnippet('get_secret_version', [ + $name['project'], + $name['secret'], + $name['secret_version'], + ]); + + $this->assertContains('Got secret version', $output); + $this->assertContains('state ENABLED', $output); + } + + public function testGetSecret() + { + $name = self::$client->parseName(self::$testSecret->getName()); + + $output = $this->runSnippet('get_secret', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('secret', $output); + $this->assertContains('replication policy AUTOMATIC', $output); + } + + public function testListSecretVersions() + { + $name = self::$client->parseName(self::$testSecretWithVersions->getName()); + + $output = $this->runSnippet('list_secret_versions', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('secret version', $output); + } + + public function testListSecrets() + { + $name = self::$client->parseName(self::$testSecret->getName()); + + $output = $this->runSnippet('list_secrets', [ + $name['project'], + ]); + + $this->assertContains('secret', $output); + $this->assertContains($name['secret'], $output); + } + + public function testUpdateSecret() + { + $name = self::$client->parseName(self::$testSecret->getName()); + + $output = $this->runSnippet('update_secret', [ + $name['project'], + $name['secret'], + ]); + + $this->assertContains('Updated secret', $output); + } +}