Skip to content

Commit db21f73

Browse files
authored
(local) Add C# SDK (Pulumi.Esc.Sdk) (#118)
1 parent 53449c3 commit db21f73

File tree

97 files changed

+26641
-2
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+26641
-2
lines changed

.github/workflows/stage-publish-sdk.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,37 @@ jobs:
126126
"${{ github.workspace }}/sdk/python/bin/dist/*"
127127
--skip-existing
128128
--verbose
129+
130+
publish-csharp-sdk:
131+
runs-on: ubuntu-latest
132+
name: publish-csharp-sdk
133+
steps:
134+
- name: Fetch secrets from ESC
135+
id: esc-secrets
136+
uses: pulumi/esc-action@v1
137+
- name: Checkout Repo
138+
uses: actions/checkout@v4
139+
- name: Setup .NET
140+
uses: actions/setup-dotnet@v4
141+
with:
142+
dotnet-version: '6.0.x'
143+
- id: version
144+
name: Set SDK Version
145+
uses: pulumi/provider-version-action@v1
146+
- name: Generate SDKs
147+
uses: ./.github/actions/generate_sdk
148+
env:
149+
VERSION: ${{ inputs.version }}
150+
PULUMI_VERSION: ${{ inputs.version }}
151+
- name: Build C# SDK
152+
run: make build_csharp
153+
- name: Pack NuGet
154+
run: |
155+
cd sdk/csharp/Pulumi.Esc.Sdk
156+
dotnet pack -c Release -o nupkg /p:Version=${{ steps.version.outputs.version }}
157+
- name: Publish NuGet
158+
run: |
159+
dotnet nuget push sdk/csharp/Pulumi.Esc.Sdk/nupkg/*.nupkg \
160+
--api-key "${NUGET_PUBLISH_KEY}" \
161+
--source https://api.nuget.org/v3/index.json \
162+
--skip-duplicate

.github/workflows/stage-test.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,21 @@ jobs:
9797
if [ -f test-requirements.txt ]; then pip install -r test-requirements.txt; fi
9898
- name: Test with pytest
9999
run: make test_python
100+
test_csharp:
101+
name: Test C#
102+
runs-on: ubuntu-latest
103+
needs: test_python
104+
steps:
105+
- name: Fetch secrets from ESC
106+
id: esc-secrets
107+
uses: pulumi/esc-action@v1
108+
- name: Checkout Repo
109+
uses: actions/checkout@v2
110+
with:
111+
ref: ${{ inputs.commit-ref }}
112+
- name: Setup .NET
113+
uses: actions/setup-dotnet@v4
114+
with:
115+
dotnet-version: '6.0.x'
116+
- name: Test
117+
run: make test_csharp

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,7 @@ sdk/typescript/node_modules/*
3939
sdk/typescript/bin/*
4040
sdk/python/bin/*
4141
sdk/python/go.mod
42+
43+
# C# / .NET
44+
sdk/csharp/**/bin/
45+
sdk/csharp/**/obj/

CHANGELOG_PENDING.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
### Improvements
22

3+
- Add C# SDK with generated client, hand-written wrappers (EscClient, EscAuth, ValueMapper,
4+
EnvironmentDefinitionSerializer), and xUnit tests
5+
36
- Support proxy environment variables in Python SDK
47
[#108](https://github.com/pulumi/esc-sdk/pull/108)
58

CONTRIBUTING.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ To build the autogenerated API clients, run:
1717
make generate_sdks
1818
```
1919

20-
Additionally, ESC SDK provides wrapper clients for TypeScript/JavaScript, Python, and Go. To build these packages, run:
20+
Additionally, ESC SDK provides wrapper clients for TypeScript/JavaScript, Python, Go, and C#. To build these packages, run:
2121

2222
```shell
2323
make build_typescript
2424
make build_python
2525
make build_go
26+
make build_csharp
2627
```
2728

29+
The C# SDK requires the .NET 6.0 SDK or later.
30+
2831
### Running tests
2932

3033
First, make sure to set the following environment variables:
@@ -43,6 +46,8 @@ Now you can run the tests for the different sdks:
4346
make test_typescript
4447
make test_python
4548
make test_go
49+
make test_csharp # Unit tests only
50+
make test_csharp_integration # E2E tests (requires env vars above)
4651
```
4752

4853
## Submitting a Pull Request

Makefile

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,32 @@ generate_ts_client_sdk:
7474
generate_python_client_sdk:
7575
PYTHON_POST_PROCESS_FILE="/usr/local/bin/yapf -i" openapi-generator-cli generate -i ./sdk/swagger.yaml -p packageName=pulumi_esc_sdk,httpUserAgent=esc-sdk/python/${VERSION},packageVersion=${PYTHON_SDK_VERSION} -t ./sdk/templates/python -g python -o ./sdk/python --git-repo-id esc --git-user-id pulumi
7676

77+
.PHONY: generate_csharp_client_sdk
78+
generate_csharp_client_sdk:
79+
openapi-generator-cli generate \
80+
-i ./sdk/swagger.yaml \
81+
-g csharp \
82+
--library generichost \
83+
--additional-properties packageName=Pulumi.Esc.Sdk \
84+
--additional-properties targetFramework=net6.0 \
85+
--additional-properties nullableReferenceTypes=true \
86+
--additional-properties validatable=true \
87+
--additional-properties hideGenerationTimestamp=false \
88+
--additional-properties sourceFolder=. \
89+
--additional-properties httpUserAgent=esc-sdk/csharp/${VERSION} \
90+
-t ./sdk/templates/csharp \
91+
-o ./sdk/csharp \
92+
--git-repo-id esc \
93+
--git-user-id pulumi
94+
95+
build_csharp::
96+
cd sdk/csharp/Pulumi.Esc.Sdk && dotnet build
97+
98+
test_csharp::
99+
cd sdk/csharp && dotnet test --filter "Category!=Integration"
100+
101+
test_csharp_integration::
102+
cd sdk/csharp && dotnet test --filter "Category=Integration"
103+
77104
.phony: generate_sdks
78-
generate_sdks:: generate_go_client_sdk generate_ts_client_sdk generate_python_client_sdk
105+
generate_sdks:: generate_go_client_sdk generate_ts_client_sdk generate_python_client_sdk generate_csharp_client_sdk

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,34 @@ go get github.com/pulumi/esc-sdk/sdk
4545

4646
[Go examples](https://www.pulumi.com/docs/esc/development/languages-sdks/go/)
4747

48+
### C#/.NET
49+
50+
```shell
51+
dotnet add package Pulumi.Esc.Sdk
52+
```
53+
54+
#### Quick Example
55+
56+
```csharp
57+
using Pulumi.Esc.Sdk;
58+
59+
// Create a client using default credentials (PULUMI_ACCESS_TOKEN or CLI login)
60+
using var client = EscClient.CreateDefault();
61+
62+
// Or provide credentials explicitly
63+
// using var client = EscClient.Create("pul-abc123");
64+
65+
// Open and read an environment
66+
var (env, values) = await client.OpenAndReadEnvironmentAsync("myorg", "myproject", "dev");
67+
Console.WriteLine(values["dbConnectionString"]);
68+
69+
// Get the environment definition as parsed YAML
70+
var definition = await client.GetEnvironmentAsync("myorg", "myproject", "dev");
71+
```
72+
4873
## API Reference Documentation
4974

5075
* [TypeScript/JavaScript](https://www.pulumi.com/docs/reference/pkg/nodejs/pulumi/esc-sdk/)
5176
* [Python](https://www.pulumi.com/docs/reference/pkg/python/pulumi_esc_sdk/)
5277
* [Go](https://pkg.go.dev/github.com/pulumi/esc-sdk/sdk/go)
78+
* C# — API docs coming soon

sdk/csharp/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.vs/
2+
bin/
3+
obj/
4+
*.user
5+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# OpenAPI Generator Ignore
2+
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
3+
4+
# Use this file to prevent files from being overwritten by the generator.
5+
# The patterns follow closely to .gitignore or .dockerignore.
6+
7+
# As an example, the C# client generator defines ApiClient.cs.
8+
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
9+
#ApiClient.cs
10+
11+
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
12+
#foo/*/qux
13+
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
14+
15+
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
16+
#foo/**/qux
17+
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
18+
19+
# You can also negate patterns with an exclamation (!).
20+
# For example, you can ignore all files in a docs folder with the file extension .md:
21+
#docs/*.md
22+
# Then explicitly reverse the ignore rule for a single file:
23+
#!docs/README.md
24+
25+
git_push.sh
26+
.travis.yml
27+
.gitignore
28+
README.md
29+
Pulumi.Esc.Sdk/README.md
30+
test/*
31+
docs/**
32+
api/*
33+
appveyor.yml
34+
# Solution file has corrected project paths
35+
Pulumi.Esc.Sdk.sln
36+
Pulumi.Esc.Sdk.Test/**
37+
# Value.cs has a fix for varValue not being truly required (API returns Value without "value" when unknown=true)
38+
Pulumi.Esc.Sdk/Model/Value.cs
39+
40+
# Hand-written extension files — DO NOT overwrite
41+
Pulumi.Esc.Sdk/EscClient.cs
42+
Pulumi.Esc.Sdk/EscAuth.cs
43+
Pulumi.Esc.Sdk/EscClientFactory.cs
44+
Pulumi.Esc.Sdk/ValueMapper.cs
45+
Pulumi.Esc.Sdk/EnvironmentDefinitionSerializer.cs
46+
Pulumi.Esc.Sdk/JsonDefaults.cs
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
Pulumi.Esc.Sdk/Api/EscApi.cs
2+
Pulumi.Esc.Sdk/Api/IApi.cs
3+
Pulumi.Esc.Sdk/Client/ApiException.cs
4+
Pulumi.Esc.Sdk/Client/ApiFactory.cs
5+
Pulumi.Esc.Sdk/Client/ApiKeyToken.cs
6+
Pulumi.Esc.Sdk/Client/ApiResponseEventArgs.cs
7+
Pulumi.Esc.Sdk/Client/ApiResponse`1.cs
8+
Pulumi.Esc.Sdk/Client/ClientUtils.cs
9+
Pulumi.Esc.Sdk/Client/CookieContainer.cs
10+
Pulumi.Esc.Sdk/Client/DateOnlyJsonConverter.cs
11+
Pulumi.Esc.Sdk/Client/DateOnlyNullableJsonConverter.cs
12+
Pulumi.Esc.Sdk/Client/DateTimeJsonConverter.cs
13+
Pulumi.Esc.Sdk/Client/DateTimeNullableJsonConverter.cs
14+
Pulumi.Esc.Sdk/Client/ExceptionEventArgs.cs
15+
Pulumi.Esc.Sdk/Client/HostConfiguration.cs
16+
Pulumi.Esc.Sdk/Client/JsonSerializerOptionsProvider.cs
17+
Pulumi.Esc.Sdk/Client/Option.cs
18+
Pulumi.Esc.Sdk/Client/RateLimitProvider`1.cs
19+
Pulumi.Esc.Sdk/Client/TokenBase.cs
20+
Pulumi.Esc.Sdk/Client/TokenContainer`1.cs
21+
Pulumi.Esc.Sdk/Client/TokenProvider`1.cs
22+
Pulumi.Esc.Sdk/Extensions/IHostBuilderExtensions.cs
23+
Pulumi.Esc.Sdk/Extensions/IHttpClientBuilderExtensions.cs
24+
Pulumi.Esc.Sdk/Extensions/IServiceCollectionExtensions.cs
25+
Pulumi.Esc.Sdk/Model/Access.cs
26+
Pulumi.Esc.Sdk/Model/Accessor.cs
27+
Pulumi.Esc.Sdk/Model/CheckEnvironment.cs
28+
Pulumi.Esc.Sdk/Model/CloneEnvironment.cs
29+
Pulumi.Esc.Sdk/Model/CreateEnvironment.cs
30+
Pulumi.Esc.Sdk/Model/CreateEnvironmentRevisionTag.cs
31+
Pulumi.Esc.Sdk/Model/CreateEnvironmentTag.cs
32+
Pulumi.Esc.Sdk/Model/EnvironmentDefinition.cs
33+
Pulumi.Esc.Sdk/Model/EnvironmentDefinitionValues.cs
34+
Pulumi.Esc.Sdk/Model/EnvironmentDiagnostic.cs
35+
Pulumi.Esc.Sdk/Model/EnvironmentDiagnostics.cs
36+
Pulumi.Esc.Sdk/Model/EnvironmentRevision.cs
37+
Pulumi.Esc.Sdk/Model/EnvironmentRevisionTag.cs
38+
Pulumi.Esc.Sdk/Model/EnvironmentRevisionTags.cs
39+
Pulumi.Esc.Sdk/Model/EnvironmentTag.cs
40+
Pulumi.Esc.Sdk/Model/Error.cs
41+
Pulumi.Esc.Sdk/Model/EvaluatedExecutionContext.cs
42+
Pulumi.Esc.Sdk/Model/Expr.cs
43+
Pulumi.Esc.Sdk/Model/ExprBuiltin.cs
44+
Pulumi.Esc.Sdk/Model/Interpolation.cs
45+
Pulumi.Esc.Sdk/Model/ListEnvironmentTags.cs
46+
Pulumi.Esc.Sdk/Model/ModelEnvironment.cs
47+
Pulumi.Esc.Sdk/Model/OpenEnvironment.cs
48+
Pulumi.Esc.Sdk/Model/OrgEnvironment.cs
49+
Pulumi.Esc.Sdk/Model/OrgEnvironments.cs
50+
Pulumi.Esc.Sdk/Model/Pos.cs
51+
Pulumi.Esc.Sdk/Model/PropertyAccessor.cs
52+
Pulumi.Esc.Sdk/Model/Range.cs
53+
Pulumi.Esc.Sdk/Model/Reference.cs
54+
Pulumi.Esc.Sdk/Model/Trace.cs
55+
Pulumi.Esc.Sdk/Model/UpdateEnvironmentRevisionTag.cs
56+
Pulumi.Esc.Sdk/Model/UpdateEnvironmentTag.cs
57+
Pulumi.Esc.Sdk/Model/UpdateEnvironmentTagCurrentTag.cs
58+
Pulumi.Esc.Sdk/Model/UpdateEnvironmentTagNewTag.cs
59+
Pulumi.Esc.Sdk/Pulumi.Esc.Sdk.csproj

0 commit comments

Comments
 (0)