@pulumi/esc-sdk 0.9.0-pubtest → 0.9.0-pubtest3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,61 +1,20 @@
1
- # Pulumi ESC (Environments, Secrets, and Configuration)
1
+ # Pulumi ESC: Simplifying Secrets and Configurations
2
+ Pulumi ESC (Environments, Secrets, and Configurations) provides a developer-first solution to simplify how you manage sensitive data and configurations across your entire application lifecycle. It's a fully managed solution allowing teams to generate dynamic cloud provider credentials, aggregate secrets, and configurations from multiple sources, and manage them through composable collections called "environments." These environments can be consumed from anywhere, making Pulumi ESC ideal for any application and development workflow. Additionally, while Pulumi ESC works independently to eliminate duplication and reduce drift and sprawl of secrets and configuration for all your applications, it also integrates smoothly with Pulumi Infrastructure as Code (IaC) to enhance these capabilities within the Pulumi ecosystem.
2
3
 
3
- Pulumi ESC is a new product from Pulumi that manages and tames secrets and configuration complexity across all of your cloud infrastructure and application environments. Pulumi ESC introduces a new category of configuration-as-code product, motivated by our experience working with hundreds of Pulumi IaC customers to address their needs in managing secrets and configuration at scale within their Pulumi infrastructure and across other cloud applications and infrastructure projects.
4
4
 
5
- Pulumi ESC enables teams to aggregate secrets and configuration from many sources, manage hierarchical collections of configuration and secrets ("environments"), and consume those configuration and secrets from a variety of different infrastructure and application services. Pulumi ESC works hand-in-hand with Pulumi IaC to simplify configuration management, but also works independently from Pulumi IaC, as a solution for managing environments, secrets and configuration for any application or infrastructure project.
5
+ ## Introducing the Pulumi ESC SDK
6
+ We're excited to unveil the official Pulumi ESC SDK, making it even easier to harness the power of ESC directly within your applications using your favorite programming languages. The SDK provides a simple, programmatic interface to all of Pulumi ESC's robust features, allowing you to:
6
7
 
7
- For example, the Pulumi ESC CLI (`esc`) makes it possible to give your developers immediate, just-in-time authenticated and short-lived access to cloud credentials across any cloud provider with just a single command: `esc run aws-staging -- aws s3 ls`.
8
+ Manage the Entire Lifecycle of Your Environments: Create new environments, list existing ones, and easily update or delete them as your needs evolve. You can even add version tags to your environments, making it simple to track changes and roll back to previous states if needed.
9
+ Seamlessly Integrate Secrets and Configurations: Securely access and utilize secrets and configurations within your applications. The SDK provides a streamlined way to fetch the information you need, whether it's cloud credentials, database connection strings, feature flags, or any other sensitive data.
8
10
 
9
- ![Pulumi ESC Overview GIF](./assets/esc.gif)
10
-
11
- Pulumi ESC is offered as a managed service as part of Pulumi Cloud, and this repo contains the implementation of the following key components of the ESC offering:
12
-
13
- 1. The `esc` CLI: A CLI tool for managing and consuming environments, secrets and configuration using Pulumi ESC.
14
- 2. The Pulumi ESC evaluator: The core specification and implementation of the document format for defining environments, and the syntax and semantics for evaluating environments to produce a set of configuration and secrets.
15
-
16
- ## Resources
17
-
18
- * [Getting Started](https://pulumi.com/docs/pulumi-cloud/esc/get-started)
19
- * [Download and Install](https://pulumi.com/docs/install/esc/)
20
- * [Documentation](https://pulumi.com/docs/pulumi-cloud/esc)
21
- * [Community Slack](https://slack.pulumi.com/)
22
-
23
-
24
- ## How Pulumi ESC works
25
-
26
- ![Pulumi ESC Graphic V4](./assets/overview.png)
27
-
28
- 1. Pulumi ESC enables you to define environments, which are collections of secrets and configuration. Each environment can be composed from multiple environments.
29
- 2. Pulumi ESC supports a variety of configuration and secrets sources, and it has an extensible plugin model that allows third-party sources.
30
- 3. Pulumi ESC has a rich API that allows for easy integration. Every value in an environment can be accessed from any execution environment.
31
- 4. Every environment can be locked down with RBAC, versioned, and audited.
32
-
33
- ## Building the CLI Locally
34
-
35
- You can build the CLI locally for testing by running:
36
-
37
- ```shell
38
- $ make install
39
- ```
40
-
41
- This will produce an `esc` binary in your `GOBIN` directory.
42
-
43
- ## Why Pulumi ESC?
44
-
45
- Pulumi ESC was designed to address a set of challenges that many infrastructure and application development teams face in managing configuration and secrets across their various environments:
46
-
47
- * __Secrets and Configuration Sprawl__: Data in many systems. Challenging to audit. Lots of application-specific logic to acquire and compose configuration from multiple sources. Divergent solutions for Infrastructure and Application configuration.
48
- * __Duplication and Copy/Paste__: Secrets are duplicated in many places. Frequently coupled to application/system-specific configuration stores.
49
- * __Too Many Long-lived Static Secrets__: Long lived static credentials are over-used, exposing companies to significant security risk. Rotation is operationally challenging. Not all systems support direct integration with OIDC and other dynamic secrets provisioning systems.
50
-
51
- Pulumi ESC was born to address these problems and needs head on. It does so through a few core design principles:
52
-
53
- * __Hierarchical and Composable__: Environments contain collections of secrets and configuration, but can also import one or more other environments. Values can be overridden, interpolated from other values, and arbitrarily nested. This allows for flexible composition and reuse, and avoids copy paste.
54
- * __Any Secrets Provider__: Support for dynamic configuration providers allow Pulumi ESC to integrate with secrets stored in any other provider. Organizations often use AWS Secrets Manager, Vault, Azure OIDC and/or 1Password plus many more sources of truth for their secrets and configuration. Pulumi ESC supports them all, providing a single interface to your configuration and secrets, no matter where their source of truth is. Pulumi ESC works with these tools to provide improved management of secrets and configuration.
55
- * __Consume from Anywhere__: The `esc` CLI and the Pulumi ESC Rest API enables environments to be accessed from any application, infrastructure provider, automation system. At launch, first-class integrations are available with Pulumi IaC, local environment and .env files, GitHub Actions, and more.
56
- * __Auditable__: Environments must be “opened” to compute and see the set of value they provide, and this action is recorded in audit logs, including a full record of how each value was sourced from within the hierarchy of environments that contributed to it.
57
- * __Authentication and RBAC__: Pulumi ESC brokers access to secrets and configuration that live in other systems, and so authentication and granular RBAC are critical to ensure robust access controls across your organization. Pulumi ESC leverages the same Pulumi Cloud identity, RBAC, Teams, SAML/SCIM and scoped access tokens that are used for Pulumi IaC today, extending these all to managing access to Environments as well as Stacks.
58
- * __Configuration as Code__: Environments are defined as YAML documents which can describe how to project and compose secrets and configuration, integrate dynamic configuration providers, and compute new configuration from other values (construing a URL from a DNS name, or concatenating multiple configuration values into a derived value). The incredible flexibility of a code-based approach over traditional point-and-click interfaces allows Pulumi ESC to offer rich expressiveness for managing complex configuration.
59
- * __Fully Managed__: Pulumi ESC is offered as a fully managed cloud service in Pulumi Cloud (and Pulumi Cloud Self-hosted in the near future). The pulumi/esc project is open source, and contains the evaluation engine for environments, the esc CLI, and in the future, the extensible plugins for source and target integrations.
60
11
 
12
+ ## Why use the Pulumi ESC SDK?
13
+ Here's why you'll love using the Pulumi ESC SDK:
61
14
 
15
+ * Focus on Building, Not Plumbing: No more writing boilerplate code for API interactions. The SDK handles the complexities of secret retrieval and configuration management, so you can focus on your application's core functionality.
16
+ * Eliminate Hardcoded Secrets: Say goodbye to hardcoded credentials scattered throughout your codebase. With the SDK, your application can securely retrieve secrets from Pulumi ESC at runtime.
17
+ * Centralized Configuration Management: Manage all your application settings from a single source of truth. The SDK provides easy access to configurations stored in Pulumi ESC, ensuring consistency across environments.
18
+ * Enhanced Security: The Pulumi ESC SDK promotes secure secret handling best practices. It handles the secure storage and retrieval of your sensitive data, minimizing the risk of accidental exposure.
19
+ * Intuitive and Idiomatic: The SDK is built to feel like a natural extension of your chosen programming language. You'll work with familiar objects, methods, and patterns, making integration smooth and intuitive.
20
+ * Type Safety and Code Completion: Benefit from the power of your IDE. The SDK provides type safety, enabling compile-time checks and helpful code suggestions that reduce errors and speed up your development workflow.
@@ -1,5 +1,5 @@
1
- import { Environment, EnvironmentDefinitionValues, OpenEnvironment, OrgEnvironments, OrgEnvironment, EnvironmentDefinition, EscApi as EscRawApi, Configuration, Value, EnvironmentDiagnostics, CheckEnvironment, Pos, Range, Trace } from "./raw/index";
2
- export { Configuration, Environment, EnvironmentDefinitionValues, OpenEnvironment, OrgEnvironments, OrgEnvironment, EnvironmentDefinition, EscRawApi, Value, EnvironmentDiagnostics, CheckEnvironment, Pos, Range, Trace, };
1
+ import { Environment, EnvironmentDefinitionValues, OpenEnvironment, OrgEnvironments, OrgEnvironment, EnvironmentDefinition, EscApi as EscRawApi, Configuration, Value, EnvironmentDiagnostics, CheckEnvironment, Pos, Range, Trace, EnvironmentRevision, EnvironmentRevisionTag, EnvironmentRevisionTags } from "./raw/index";
2
+ export { Configuration, Environment, EnvironmentDefinitionValues, OpenEnvironment, OrgEnvironments, OrgEnvironment, EnvironmentDefinition, EscRawApi, Value, EnvironmentDiagnostics, CheckEnvironment, Pos, Range, Trace, EnvironmentRevision, EnvironmentRevisionTag, EnvironmentRevisionTags, };
3
3
  export interface EnvironmentDefinitionResponse {
4
4
  definition: EnvironmentDefinition;
5
5
  yaml: string;
@@ -23,9 +23,12 @@ export declare class EscApi {
23
23
  constructor(config: Configuration);
24
24
  listEnvironments(org: string, continuationToken?: string | undefined): Promise<OrgEnvironments | undefined>;
25
25
  getEnvironment(org: string, name: string): Promise<EnvironmentDefinitionResponse | undefined>;
26
+ getEnvironmentAtVersion(org: string, name: string, version: string): Promise<EnvironmentDefinitionResponse | undefined>;
26
27
  openEnvironment(org: string, name: string): Promise<OpenEnvironment | undefined>;
28
+ openEnvironmentAtVersion(org: string, name: string, version: string): Promise<OpenEnvironment | undefined>;
27
29
  readOpenEnvironment(org: string, name: string, openSessionID: string): Promise<EnvironmentResponse | undefined>;
28
30
  openAndReadEnvironment(org: string, name: string): Promise<EnvironmentResponse | undefined>;
31
+ openAndReadEnvironmentAtVersion(org: string, name: string, version: string): Promise<EnvironmentResponse | undefined>;
29
32
  readOpenEnvironmentProperty(org: string, name: string, openSessionID: string, property: string): Promise<EnvironmentPropertyResponse | undefined>;
30
33
  createEnvironment(org: string, name: string): Promise<void>;
31
34
  updateEnvironmentYaml(org: string, name: string, yaml: string): Promise<EnvironmentDiagnostics | undefined>;
@@ -34,4 +37,10 @@ export declare class EscApi {
34
37
  checkEnvironmentYaml(org: string, yaml: string): Promise<CheckEnvironment | undefined>;
35
38
  checkEnvironment(org: string, env: EnvironmentDefinition): Promise<CheckEnvironment | undefined>;
36
39
  decryptEnvironment(org: string, name: string): Promise<EnvironmentDefinitionResponse | undefined>;
40
+ listEnvironmentRevisions(org: string, name: string, before?: number, count?: number): Promise<Array<EnvironmentRevision> | undefined>;
41
+ listEnvironmentRevisionTags(org: string, name: string, after?: string, count?: number): Promise<EnvironmentRevisionTags | undefined>;
42
+ getEnvironmentRevisionTag(org: string, name: string, tag: string): Promise<EnvironmentRevisionTag | undefined>;
43
+ createEnvironmentRevisionTag(org: string, name: string, tag: string, revision: number): Promise<void>;
44
+ updateEnvironmentRevisionTag(org: string, name: string, tag: string, revision: number): Promise<void>;
45
+ deleteEnvironmentRevisionTag(org: string, name: string, tag: string): Promise<void>;
37
46
  }
@@ -71,6 +71,19 @@ class EscApi {
71
71
  throw new Error(`Failed to get environment: ${resp.statusText}`);
72
72
  });
73
73
  }
74
+ getEnvironmentAtVersion(org, name, version) {
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ const resp = yield this.rawApi.getEnvironmentAtVersion(org, name, version);
77
+ if (resp.status === 200) {
78
+ const doc = yaml.load(resp.data);
79
+ return {
80
+ definition: doc,
81
+ yaml: resp.data,
82
+ };
83
+ }
84
+ throw new Error(`Failed to get environment: ${resp.statusText}`);
85
+ });
86
+ }
74
87
  openEnvironment(org, name) {
75
88
  return __awaiter(this, void 0, void 0, function* () {
76
89
  const resp = yield this.rawApi.openEnvironment(org, name);
@@ -80,6 +93,15 @@ class EscApi {
80
93
  throw new Error(`Failed to open environment: ${resp.statusText}`);
81
94
  });
82
95
  }
96
+ openEnvironmentAtVersion(org, name, version) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ const resp = yield this.rawApi.openEnvironmentAtVersion(org, name, version);
99
+ if (resp.status === 200) {
100
+ return resp.data;
101
+ }
102
+ throw new Error(`Failed to open environment: ${resp.statusText}`);
103
+ });
104
+ }
83
105
  readOpenEnvironment(org, name, openSessionID) {
84
106
  return __awaiter(this, void 0, void 0, function* () {
85
107
  const resp = yield this.rawApi.readOpenEnvironment(org, name, openSessionID);
@@ -101,6 +123,15 @@ class EscApi {
101
123
  throw new Error(`Failed to open and read environment: ${open}`);
102
124
  });
103
125
  }
126
+ openAndReadEnvironmentAtVersion(org, name, version) {
127
+ return __awaiter(this, void 0, void 0, function* () {
128
+ const open = yield this.openEnvironmentAtVersion(org, name, version);
129
+ if (open === null || open === void 0 ? void 0 : open.id) {
130
+ return yield this.readOpenEnvironment(org, name, open.id);
131
+ }
132
+ throw new Error(`Failed to open and read environment: ${open}`);
133
+ });
134
+ }
104
135
  readOpenEnvironmentProperty(org, name, openSessionID, property) {
105
136
  return __awaiter(this, void 0, void 0, function* () {
106
137
  const resp = yield this.rawApi.readOpenEnvironmentProperty(org, name, openSessionID, property);
@@ -189,6 +220,66 @@ class EscApi {
189
220
  throw new Error(`Failed to decrypt environment: ${resp.statusText}`);
190
221
  });
191
222
  }
223
+ listEnvironmentRevisions(org, name, before, count) {
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ const resp = yield this.rawApi.listEnvironmentRevisions(org, name, before, count);
226
+ if (resp.status === 200) {
227
+ return resp.data;
228
+ }
229
+ throw new Error(`Failed to list environment revisions: ${resp.statusText}`);
230
+ });
231
+ }
232
+ listEnvironmentRevisionTags(org, name, after, count) {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ const resp = yield this.rawApi.listEnvironmentRevisionTags(org, name, after, count);
235
+ if (resp.status === 200) {
236
+ return resp.data;
237
+ }
238
+ throw new Error(`Failed to list environment revision tags: ${resp.statusText}`);
239
+ });
240
+ }
241
+ getEnvironmentRevisionTag(org, name, tag) {
242
+ return __awaiter(this, void 0, void 0, function* () {
243
+ const resp = yield this.rawApi.getEnvironmentRevisionTag(org, name, tag);
244
+ if (resp.status === 200) {
245
+ return resp.data;
246
+ }
247
+ throw new Error(`Failed to get environment revision tag: ${resp.statusText}`);
248
+ });
249
+ }
250
+ createEnvironmentRevisionTag(org, name, tag, revision) {
251
+ return __awaiter(this, void 0, void 0, function* () {
252
+ const updateTag = {
253
+ revision: revision,
254
+ };
255
+ const resp = yield this.rawApi.createEnvironmentRevisionTag(org, name, tag, updateTag);
256
+ if (resp.status === 204) {
257
+ return;
258
+ }
259
+ throw new Error(`Failed to create environment revision tag: ${resp.statusText}`);
260
+ });
261
+ }
262
+ updateEnvironmentRevisionTag(org, name, tag, revision) {
263
+ return __awaiter(this, void 0, void 0, function* () {
264
+ const updateTag = {
265
+ revision: revision,
266
+ };
267
+ const resp = yield this.rawApi.updateEnvironmentRevisionTag(org, name, tag, updateTag);
268
+ if (resp.status === 204) {
269
+ return;
270
+ }
271
+ throw new Error(`Failed to update environment revision tag: ${resp.statusText}`);
272
+ });
273
+ }
274
+ deleteEnvironmentRevisionTag(org, name, tag) {
275
+ return __awaiter(this, void 0, void 0, function* () {
276
+ const resp = yield this.rawApi.deleteEnvironmentRevisionTag(org, name, tag);
277
+ if (resp.status === 204) {
278
+ return;
279
+ }
280
+ throw new Error(`Failed to delete environment revision tag: ${resp.statusText}`);
281
+ });
282
+ }
192
283
  }
193
284
  exports.EscApi = EscApi;
194
285
  function convertEnvPropertiesToValues(env) {
@@ -207,7 +298,7 @@ function convertPropertyToValue(property) {
207
298
  return property;
208
299
  }
209
300
  let value = property;
210
- if ("value" in property) {
301
+ if (typeof property === "object" && "value" in property) {
211
302
  value = convertPropertyToValue(property.value);
212
303
  }
213
304
  if (!value) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../esc/index.ts"],"names":[],"mappings":"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"}