From bef4b4ab9093fa3eee3bdeae510752e62251a806 Mon Sep 17 00:00:00 2001 From: Towhid Khan <70368615+KnockOutEZ@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:52:02 +0530 Subject: [PATCH] Adding python and dotnet sdk (#7) * generated dotnet and python sdks * removed supported languages part from docs * updated ci from pypi and nuget * added version.txt in dotnet sdk using ci * fixed version issue with python sdk * fixed dotnet null pointer reference issue * fixing dotnet ci * fixing dotnet ci * added png logo * added logo in dotnet sdk * added python and dotnet sdks * fixed pulumi go example bug * shortened requirements.txt for python example --- .github/images/logo.png | Bin 0 -> 49135 bytes .github/workflows/release.yml | 79 +- Makefile | 8 +- README.md | 9 - examples/dotnet/.gitignore | 353 +++ examples/dotnet/Program.cs | 171 ++ examples/dotnet/Pulumi.yaml | 7 + examples/dotnet/dotnet.csproj | 14 + examples/go/main.go | 2 +- examples/python/.gitignore | 2 + examples/python/Pulumi.yaml | 11 + examples/python/__main__.py | 162 ++ examples/python/requirements.txt | 3 + .../cmd/pulumi-resource-pgedge/schema.json | 2 +- provider/resources.go | 2 +- sdk/dotnet/BackupStore.cs | 143 + sdk/dotnet/CloudAccount.cs | 128 + sdk/dotnet/Cluster.cs | 278 ++ sdk/dotnet/Config/Config.cs | 46 + sdk/dotnet/Config/README.md | 1 + sdk/dotnet/Database.cs | 325 +++ sdk/dotnet/GetBackupStores.cs | 42 + sdk/dotnet/GetCloudAccounts.cs | 48 + sdk/dotnet/GetClusters.cs | 48 + sdk/dotnet/GetDatabases.cs | 48 + sdk/dotnet/GetSSHKeys.cs | 48 + sdk/dotnet/Inputs/ClusterFirewallRuleArgs.cs | 35 + .../Inputs/ClusterFirewallRuleGetArgs.cs | 35 + sdk/dotnet/Inputs/ClusterNetworkArgs.cs | 75 + sdk/dotnet/Inputs/ClusterNetworkGetArgs.cs | 75 + sdk/dotnet/Inputs/ClusterNodeArgs.cs | 42 + sdk/dotnet/Inputs/ClusterNodeGetArgs.cs | 42 + sdk/dotnet/Inputs/DatabaseBackupsArgs.cs | 39 + .../Inputs/DatabaseBackupsConfigArgs.cs | 57 + .../Inputs/DatabaseBackupsConfigGetArgs.cs | 57 + .../DatabaseBackupsConfigRepositoryArgs.cs | 105 + .../DatabaseBackupsConfigRepositoryGetArgs.cs | 105 + .../DatabaseBackupsConfigScheduleArgs.cs | 39 + .../DatabaseBackupsConfigScheduleGetArgs.cs | 39 + sdk/dotnet/Inputs/DatabaseBackupsGetArgs.cs | 39 + sdk/dotnet/Inputs/DatabaseComponentArgs.cs | 36 + sdk/dotnet/Inputs/DatabaseComponentGetArgs.cs | 36 + sdk/dotnet/Inputs/DatabaseExtensionsArgs.cs | 40 + .../Inputs/DatabaseExtensionsGetArgs.cs | 40 + sdk/dotnet/Inputs/DatabaseNodesArgs.cs | 36 + .../Inputs/DatabaseNodesConnectionArgs.cs | 54 + .../Inputs/DatabaseNodesConnectionGetArgs.cs | 54 + .../Inputs/DatabaseNodesExtensionsArgs.cs | 37 + .../Inputs/DatabaseNodesExtensionsGetArgs.cs | 37 + sdk/dotnet/Inputs/DatabaseNodesGetArgs.cs | 36 + .../Inputs/DatabaseNodesLocationArgs.cs | 54 + .../Inputs/DatabaseNodesLocationGetArgs.cs | 54 + sdk/dotnet/Inputs/DatabaseNodesRegionArgs.cs | 44 + .../Inputs/DatabaseNodesRegionGetArgs.cs | 44 + sdk/dotnet/Inputs/DatabaseRoleArgs.cs | 48 + sdk/dotnet/Inputs/DatabaseRoleGetArgs.cs | 48 + sdk/dotnet/Outputs/ClusterFirewallRule.cs | 34 + sdk/dotnet/Outputs/ClusterNetwork.cs | 71 + sdk/dotnet/Outputs/ClusterNode.cs | 50 + sdk/dotnet/Outputs/DatabaseBackups.cs | 36 + sdk/dotnet/Outputs/DatabaseBackupsConfig.cs | 50 + .../DatabaseBackupsConfigRepository.cs | 120 + .../Outputs/DatabaseBackupsConfigSchedule.cs | 43 + sdk/dotnet/Outputs/DatabaseComponent.cs | 42 + sdk/dotnet/Outputs/DatabaseExtensions.cs | 34 + sdk/dotnet/Outputs/DatabaseNodes.cs | 42 + sdk/dotnet/Outputs/DatabaseNodesConnection.cs | 54 + sdk/dotnet/Outputs/DatabaseNodesExtensions.cs | 30 + sdk/dotnet/Outputs/DatabaseNodesLocation.cs | 66 + sdk/dotnet/Outputs/DatabaseNodesRegion.cs | 46 + sdk/dotnet/Outputs/DatabaseRole.cs | 58 + .../GetBackupStoresBackupStoreResult.cs | 54 + .../GetCloudAccountsCloudAccountResult.cs | 64 + .../GetClustersClusterFirewallRuleResult.cs | 43 + .../GetClustersClusterNetworkResult.cs | 65 + .../Outputs/GetClustersClusterNodeResult.cs | 75 + .../Outputs/GetClustersClusterResult.cs | 108 + ...esDatabaseBackupsConfigRepositoryResult.cs | 81 + ...GetDatabasesDatabaseBackupsConfigResult.cs | 50 + ...asesDatabaseBackupsConfigScheduleResult.cs | 37 + .../GetDatabasesDatabaseBackupsResult.cs | 36 + .../GetDatabasesDatabaseComponentResult.cs | 57 + .../GetDatabasesDatabaseExtensionsResult.cs | 43 + ...tDatabasesDatabaseNodesConnectionResult.cs | 54 + ...tDatabasesDatabaseNodesExtensionsResult.cs | 30 + ...GetDatabasesDatabaseNodesLocationResult.cs | 69 + .../GetDatabasesDatabaseNodesRegionResult.cs | 49 + .../GetDatabasesDatabaseNodesResult.cs | 57 + .../Outputs/GetDatabasesDatabaseResult.cs | 120 + .../Outputs/GetDatabasesDatabaseRoleResult.cs | 61 + sdk/dotnet/Outputs/GetSSHKeysSshKeyResult.cs | 50 + sdk/dotnet/Pgedge.Pgedge.csproj | 60 + sdk/dotnet/Provider.cs | 69 + sdk/dotnet/Pulumi.yaml | 0 sdk/dotnet/README.md | 1 + sdk/dotnet/SSHKey.cs | 127 + sdk/dotnet/Utilities.cs | 84 + sdk/dotnet/logo.png | Bin 0 -> 49135 bytes sdk/dotnet/pulumi-plugin.json | 5 + sdk/python/Pulumi.yaml | 0 sdk/python/README.md | 375 +++ sdk/python/pgEdge_pulumi_pgedge/README.md | 4 + sdk/python/pgEdge_pulumi_pgedge/__init__.py | 84 + sdk/python/pgEdge_pulumi_pgedge/_inputs.py | 1289 +++++++++ sdk/python/pgEdge_pulumi_pgedge/_utilities.py | 295 ++ .../pgEdge_pulumi_pgedge/backup_store.py | 300 ++ .../pgEdge_pulumi_pgedge/cloud_account.py | 254 ++ sdk/python/pgEdge_pulumi_pgedge/cluster.py | 556 ++++ .../pgEdge_pulumi_pgedge/config/__init__.py | 8 + .../pgEdge_pulumi_pgedge/config/__init__.pyi | 16 + .../pgEdge_pulumi_pgedge/config/vars.py | 24 + sdk/python/pgEdge_pulumi_pgedge/database.py | 618 ++++ .../pgEdge_pulumi_pgedge/get_backup_stores.py | 75 + .../get_cloud_accounts.py | 75 + .../pgEdge_pulumi_pgedge/get_clusters.py | 75 + .../pgEdge_pulumi_pgedge/get_databases.py | 75 + .../pgEdge_pulumi_pgedge/get_ssh_keys.py | 75 + sdk/python/pgEdge_pulumi_pgedge/outputs.py | 2567 +++++++++++++++++ sdk/python/pgEdge_pulumi_pgedge/provider.py | 110 + .../pgEdge_pulumi_pgedge/pulumi-plugin.json | 5 + sdk/python/pgEdge_pulumi_pgedge/py.typed | 0 sdk/python/pgEdge_pulumi_pgedge/ssh_key.py | 221 ++ sdk/python/setup.py | 46 + 123 files changed, 12914 insertions(+), 20 deletions(-) create mode 100644 .github/images/logo.png create mode 100644 examples/dotnet/.gitignore create mode 100644 examples/dotnet/Program.cs create mode 100644 examples/dotnet/Pulumi.yaml create mode 100644 examples/dotnet/dotnet.csproj create mode 100644 examples/python/.gitignore create mode 100644 examples/python/Pulumi.yaml create mode 100644 examples/python/__main__.py create mode 100644 examples/python/requirements.txt create mode 100644 sdk/dotnet/BackupStore.cs create mode 100644 sdk/dotnet/CloudAccount.cs create mode 100644 sdk/dotnet/Cluster.cs create mode 100644 sdk/dotnet/Config/Config.cs create mode 100644 sdk/dotnet/Config/README.md create mode 100644 sdk/dotnet/Database.cs create mode 100644 sdk/dotnet/GetBackupStores.cs create mode 100644 sdk/dotnet/GetCloudAccounts.cs create mode 100644 sdk/dotnet/GetClusters.cs create mode 100644 sdk/dotnet/GetDatabases.cs create mode 100644 sdk/dotnet/GetSSHKeys.cs create mode 100644 sdk/dotnet/Inputs/ClusterFirewallRuleArgs.cs create mode 100644 sdk/dotnet/Inputs/ClusterFirewallRuleGetArgs.cs create mode 100644 sdk/dotnet/Inputs/ClusterNetworkArgs.cs create mode 100644 sdk/dotnet/Inputs/ClusterNetworkGetArgs.cs create mode 100644 sdk/dotnet/Inputs/ClusterNodeArgs.cs create mode 100644 sdk/dotnet/Inputs/ClusterNodeGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseBackupsGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseComponentArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseComponentGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseExtensionsArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseExtensionsGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesConnectionArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesConnectionGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesExtensionsArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesExtensionsGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesLocationArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesLocationGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesRegionArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseNodesRegionGetArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseRoleArgs.cs create mode 100644 sdk/dotnet/Inputs/DatabaseRoleGetArgs.cs create mode 100644 sdk/dotnet/Outputs/ClusterFirewallRule.cs create mode 100644 sdk/dotnet/Outputs/ClusterNetwork.cs create mode 100644 sdk/dotnet/Outputs/ClusterNode.cs create mode 100644 sdk/dotnet/Outputs/DatabaseBackups.cs create mode 100644 sdk/dotnet/Outputs/DatabaseBackupsConfig.cs create mode 100644 sdk/dotnet/Outputs/DatabaseBackupsConfigRepository.cs create mode 100644 sdk/dotnet/Outputs/DatabaseBackupsConfigSchedule.cs create mode 100644 sdk/dotnet/Outputs/DatabaseComponent.cs create mode 100644 sdk/dotnet/Outputs/DatabaseExtensions.cs create mode 100644 sdk/dotnet/Outputs/DatabaseNodes.cs create mode 100644 sdk/dotnet/Outputs/DatabaseNodesConnection.cs create mode 100644 sdk/dotnet/Outputs/DatabaseNodesExtensions.cs create mode 100644 sdk/dotnet/Outputs/DatabaseNodesLocation.cs create mode 100644 sdk/dotnet/Outputs/DatabaseNodesRegion.cs create mode 100644 sdk/dotnet/Outputs/DatabaseRole.cs create mode 100644 sdk/dotnet/Outputs/GetBackupStoresBackupStoreResult.cs create mode 100644 sdk/dotnet/Outputs/GetCloudAccountsCloudAccountResult.cs create mode 100644 sdk/dotnet/Outputs/GetClustersClusterFirewallRuleResult.cs create mode 100644 sdk/dotnet/Outputs/GetClustersClusterNetworkResult.cs create mode 100644 sdk/dotnet/Outputs/GetClustersClusterNodeResult.cs create mode 100644 sdk/dotnet/Outputs/GetClustersClusterResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigRepositoryResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigScheduleResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseComponentResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseExtensionsResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseNodesConnectionResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseNodesExtensionsResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseNodesLocationResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseNodesRegionResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseNodesResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseResult.cs create mode 100644 sdk/dotnet/Outputs/GetDatabasesDatabaseRoleResult.cs create mode 100644 sdk/dotnet/Outputs/GetSSHKeysSshKeyResult.cs create mode 100644 sdk/dotnet/Pgedge.Pgedge.csproj create mode 100644 sdk/dotnet/Provider.cs create mode 100644 sdk/dotnet/Pulumi.yaml create mode 100644 sdk/dotnet/README.md create mode 100644 sdk/dotnet/SSHKey.cs create mode 100644 sdk/dotnet/Utilities.cs create mode 100644 sdk/dotnet/logo.png create mode 100644 sdk/dotnet/pulumi-plugin.json create mode 100644 sdk/python/Pulumi.yaml create mode 100644 sdk/python/README.md create mode 100644 sdk/python/pgEdge_pulumi_pgedge/README.md create mode 100644 sdk/python/pgEdge_pulumi_pgedge/__init__.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/_inputs.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/_utilities.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/backup_store.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/cloud_account.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/cluster.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/config/__init__.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/config/__init__.pyi create mode 100644 sdk/python/pgEdge_pulumi_pgedge/config/vars.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/database.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/get_backup_stores.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/get_cloud_accounts.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/get_clusters.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/get_databases.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/get_ssh_keys.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/outputs.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/provider.py create mode 100644 sdk/python/pgEdge_pulumi_pgedge/pulumi-plugin.json create mode 100644 sdk/python/pgEdge_pulumi_pgedge/py.typed create mode 100644 sdk/python/pgEdge_pulumi_pgedge/ssh_key.py create mode 100644 sdk/python/setup.py diff --git a/.github/images/logo.png b/.github/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1be4c88580e0595c26247c471b042559b4448e GIT binary patch literal 49135 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d99527..90dfb80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,25 +43,96 @@ jobs: steps: - name: Checkout Repo uses: actions/checkout@v4 + - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18.x' registry-url: https://registry.npmjs.org + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.9' + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.21.x' - - name: Get the version + + - name: Get Version id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} + run: | + # Remove the 'v' prefix from the tag + VERSION=${GITHUB_REF#refs/tags/v} + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "::set-output name=VERSION::$VERSION" + + # Create version files for various SDKs + - name: Create version files + run: | + mkdir -p sdk/dotnet + echo "$VERSION" > sdk/dotnet/version.txt + + # Update Python package version + mkdir -p sdk/python + cat > sdk/python/setup.py <=3.0.0,<4.0.0", + ], + ) + EOL + - name: Build and Publish Node.js SDK working-directory: ./sdk/nodejs run: | npm install sed -i 's/"name": "@pgEdge\/pulumi-pgedge"/"name": "@pgedge\/pulumi-pgedge"/g' package.json - npm version ${{ steps.get_version.outputs.VERSION }} --no-git-tag-version + npm version ${{ env.VERSION }} --no-git-tag-version npm run build npm publish --access=public env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Build and Publish Python SDK + working-directory: ./sdk/python + run: | + python -m pip install --upgrade pip + python -m pip install build twine + # Clean any existing builds + rm -rf dist/ build/ *.egg-info/ + # Build the package + python -m build + # Upload to PyPI + python -m twine upload dist/* + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} + + - name: Build and Publish .NET SDK + working-directory: ./sdk/dotnet + run: | + # Clean any existing artifacts + dotnet clean + # Restore packages + dotnet restore + dotnet build --configuration Release -v detailed + dotnet pack --configuration Release --no-build -o out + dotnet nuget push out/*.nupkg \ + --source https://api.nuget.org/v3/index.json \ + --api-key ${{ secrets.NUGET_TOKEN }} \ + --skip-duplicate + env: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + DOTNET_NOLOGO: true \ No newline at end of file diff --git a/Makefile b/Makefile index 39d3982..688fc94 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ WORKING_DIR := $(shell pwd) OS := $(shell uname) -.PHONY: development provider build_sdks build_nodejs build_go cleanup # build_dotnet build_python +.PHONY: development provider build_sdks build_nodejs build_go build_dotnet build_python cleanup development:: install_plugins provider lint_provider build_sdks install_sdks cleanup # Build the provider & SDKs for a development environment @@ -35,7 +35,7 @@ tfgen:: install_plugins provider:: tfgen install_plugins # build the provider binary (cd provider && go build -o $(WORKING_DIR)/bin/${PROVIDER} -ldflags "-X ${PROJECT}/${VERSION_PATH}=${VERSION}" ${PROJECT}/${PROVIDER_PATH}/cmd/${PROVIDER}) -build_sdks:: install_plugins provider build_nodejs build_go # build all the sdks except python(build_python), dotnet(build_dotnet) +build_sdks:: install_plugins provider build_nodejs build_go build_dotnet build_python build_nodejs:: VERSION := $(shell pulumictl get version --language javascript) build_nodejs:: install_plugins tfgen # build the node sdk @@ -83,7 +83,7 @@ help:: expand -t20 clean:: - rm -rf sdk/{nodejs,go} # dotnet, python + rm -rf sdk/{nodejs,go,dotnet,python} install_plugins:: [ -x $(shell which pulumi) ] || curl -fsSL https://get.pulumi.com | sh @@ -100,7 +100,7 @@ install_go_sdk:: install_nodejs_sdk:: yarn link --cwd $(WORKING_DIR)/sdk/nodejs/bin -install_sdks:: install_nodejs_sdk # install_dotnet_sdk install_python_sdk +install_sdks:: install_nodejs_sdk install_dotnet_sdk install_python_sdk test:: cd examples && go test -v -tags=all -parallel ${TESTPARALLELISM} -timeout 2h diff --git a/README.md b/README.md index 4fd37ee..8702967 100644 --- a/README.md +++ b/README.md @@ -20,15 +20,6 @@ Before you begin, ensure you have the following tools installed: - [Yarn](https://yarnpkg.com/getting-started/install) - [TypeScript](https://www.typescriptlang.org/download) -## Supported Languages - -Currently, this provider supports: - -- TypeScript -- Go - -Support for other languages like Python and .NET is planned for future releases. - ## Installation To use this provider, you need to have Pulumi installed. If you haven't already, you can [install Pulumi here](https://www.pulumi.com/docs/get-started/install/). diff --git a/examples/dotnet/.gitignore b/examples/dotnet/.gitignore new file mode 100644 index 0000000..e645270 --- /dev/null +++ b/examples/dotnet/.gitignore @@ -0,0 +1,353 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ diff --git a/examples/dotnet/Program.cs b/examples/dotnet/Program.cs new file mode 100644 index 0000000..e0e6b1f --- /dev/null +++ b/examples/dotnet/Program.cs @@ -0,0 +1,171 @@ +using System.Collections.Generic; +using Pulumi; +using Pgedge.Pgedge; + + +return await Deployment.RunAsync(() => +{ + var config = new Pulumi.Config(); + var baseUrl = config.Get("baseUrl") ?? "https://api.pgedge.com"; + + // Create SSH Key + var sshKey = new SSHKey("exampleSSHKey", new SSHKeyArgs + { + Name = "example", + PublicKey = "ssh-ed25519 AAAAC3NzaC1lZsdw877237ICXfT63i04t5fvvlGesddwed21VG7DkyxvyXbYQNhKP/rSeLY user@example.com" + }); + + // Create Cloud Account + var cloudAccount = new CloudAccount("exampleCloudAccount", new CloudAccountArgs + { + Name = "my-aws-account", + Type = "aws", + Description = "My AWS Cloud Account", + Credentials = new Dictionary + { + { "role_arn", "arn:aws:iam::21112529deae39:role/pgedge-135232c" } + } + }, new CustomResourceOptions { DependsOn = { sshKey } }); + + // Create Backup Store + var backupStore = new BackupStore("testBackupStore", new BackupStoreArgs + { + Name = "example", + CloudAccountId = cloudAccount.Id, + Region = "us-west-2" + }, new CustomResourceOptions { DependsOn = { cloudAccount } }); + + // Create Cluster + var cluster = new Cluster("exampleCluster", new ClusterArgs + { + Name = "example", + CloudAccountId = cloudAccount.Id, + Regions = new[] { "us-west-2", "us-east-1", "eu-central-1" }, + NodeLocation = "public", + SshKeyId = sshKey.Id, + Nodes = new InputList + { + new Pgedge.Pgedge.Inputs.ClusterNodeArgs + { + Name = "n1", + Region = "us-west-2", + InstanceType = "r6g.medium", + VolumeSize = 100, + VolumeType = "gp2" + }, + new Pgedge.Pgedge.Inputs.ClusterNodeArgs + { + Name = "n2", + Region = "us-east-1", + InstanceType = "r6g.medium", + VolumeSize = 100, + VolumeType = "gp2" + }, + new Pgedge.Pgedge.Inputs.ClusterNodeArgs + { + Name = "n3", + Region = "eu-central-1", + InstanceType = "r6g.medium", + VolumeSize = 100, + VolumeType = "gp2" + } + }, + Networks = new InputList + { + new Pgedge.Pgedge.Inputs.ClusterNetworkArgs + { + Region = "us-west-2", + Cidr = "10.1.0.0/16", + PublicSubnets = new[] { "10.1.0.0/24" } + // PrivateSubnets = new[] { "10.1.1.0/24" } + }, + new Pgedge.Pgedge.Inputs.ClusterNetworkArgs + { + Region = "us-east-1", + Cidr = "10.2.0.0/16", + PublicSubnets = new[] { "10.2.0.0/24" } + // PrivateSubnets = new[] { "10.2.1.0/24" } + }, + new Pgedge.Pgedge.Inputs.ClusterNetworkArgs + { + Region = "eu-central-1", + Cidr = "10.3.0.0/16", + PublicSubnets = new[] { "10.3.0.0/24" } + // PrivateSubnets = new[] { "10.3.1.0/24" } + } + }, + FirewallRules = new InputList + { + new Pgedge.Pgedge.Inputs.ClusterFirewallRuleArgs + { + Name = "postgres", + Port = 5432, + Sources = new[] { "0.0.0.0/0" } + } + } + }, new CustomResourceOptions { DependsOn = { backupStore } }); + + + // Create Database + var database = new Database("exampleDatabase", new DatabaseArgs + { + Name = "example", + ClusterId = cluster.Id, + Options = new[] { "install:northwind", "rest:enabled" }, + Nodes = new InputMap + { + { "n1", new Pgedge.Pgedge.Inputs.DatabaseNodesArgs { Name = "n1" } }, + { "n2", new Pgedge.Pgedge.Inputs.DatabaseNodesArgs { Name = "n2" } }, + { "n3", new Pgedge.Pgedge.Inputs.DatabaseNodesArgs { Name = "n3" } } + }, + Backups = new Pgedge.Pgedge.Inputs.DatabaseBackupsArgs + { + Provider = "pgbackrest", + Configs = new[] + { + new Pgedge.Pgedge.Inputs.DatabaseBackupsConfigArgs + { + Id = "default", + NodeName = "n1", + Schedules = new[] + { + new Pgedge.Pgedge.Inputs.DatabaseBackupsConfigScheduleArgs + { + Id = "daily-full-backup", + CronExpression = "0 6 * * ?", + Type = "full" + } + }, + Repositories = new[] + { + new Pgedge.Pgedge.Inputs.DatabaseBackupsConfigRepositoryArgs + { + BackupStoreId = backupStore.Id, + RetentionFull = 7 + } + } + } + } + } + }, new CustomResourceOptions { DependsOn = { cluster } }); + + + // Export values + return new Dictionary + { + ["sshKeyId"] = sshKey.Id, + ["backupStoreId"] = backupStore.Id, + ["cloudAccountId"] = cloudAccount.Id, + ["clusterId"] = cluster.Id, + ["clusterStatus"] = cluster.Status, + ["clusterCreatedAt"] = cluster.CreatedAt, + ["databaseId"] = database.Id, + ["databaseNodes"] = database.Nodes, + ["configVersion"] = database.ConfigVersion, + ["databaseBackups"] = database.Backups, + ["databaseBackupsConfigs"] = database.Backups.Apply(backups => Output.Create(backups.Configs)), + ["databaseExtensions"] = database.Extensions, + ["databaseOptions"] = database, + ["databaseDomain"] = database.Domain + }; +}); \ No newline at end of file diff --git a/examples/dotnet/Pulumi.yaml b/examples/dotnet/Pulumi.yaml new file mode 100644 index 0000000..4755e31 --- /dev/null +++ b/examples/dotnet/Pulumi.yaml @@ -0,0 +1,7 @@ +name: dotnet +description: A minimal C# Pulumi program +runtime: dotnet +config: + pulumi:tags: + value: + pulumi:template: csharp diff --git a/examples/dotnet/dotnet.csproj b/examples/dotnet/dotnet.csproj new file mode 100644 index 0000000..cf2b9ef --- /dev/null +++ b/examples/dotnet/dotnet.csproj @@ -0,0 +1,14 @@ + + + + Exe + net8.0 + enable + + + + + + + + diff --git a/examples/go/main.go b/examples/go/main.go index 9746c6a..80c1fe9 100644 --- a/examples/go/main.go +++ b/examples/go/main.go @@ -106,7 +106,7 @@ func main() { Sources: pulumi.ToStringArray([]string{"192.0.2.44/32"}), }, }, - BackupStoreIds: pulumi.ToStringArray([]string{backupStore.ID().ElementType().String()}), + BackupStoreIds: pulumi.ToStringArrayOutput([]pulumi.StringOutput{backupStore.ID().ToIDOutput().ToStringOutput()}), }, pulumi.DependsOn([]pulumi.Resource{sshKey, cloudAccount, backupStore})) if err != nil { return err diff --git a/examples/python/.gitignore b/examples/python/.gitignore new file mode 100644 index 0000000..a3807e5 --- /dev/null +++ b/examples/python/.gitignore @@ -0,0 +1,2 @@ +*.pyc +venv/ diff --git a/examples/python/Pulumi.yaml b/examples/python/Pulumi.yaml new file mode 100644 index 0000000..68b2b9e --- /dev/null +++ b/examples/python/Pulumi.yaml @@ -0,0 +1,11 @@ +name: python +description: A minimal Python Pulumi program +runtime: + name: python + options: + toolchain: pip + virtualenv: venv +config: + pulumi:tags: + value: + pulumi:template: python diff --git a/examples/python/__main__.py b/examples/python/__main__.py new file mode 100644 index 0000000..72b9d48 --- /dev/null +++ b/examples/python/__main__.py @@ -0,0 +1,162 @@ +import pulumi +from pgEdge_pulumi_pgedge import ( + SSHKey, + CloudAccount, + BackupStore, + Cluster, + Database, + CloudAccountArgs, + BackupStoreArgs, + ClusterArgs, + DatabaseArgs, + SSHKeyArgs +) + +# Get config +config = pulumi.Config() +base_url = config.get("baseUrl") or "https://api.pgedge.com" + +# Create SSH Key +ssh_key = SSHKey("exampleSSHKey", + SSHKeyArgs( + name="example", + public_key="ssh-ed25519 AAAAC3NzaC1lZsdw877237ICXfT63i04t5fvvlGesddwed21VG7DkyxvyXbYQNhKP/rSeLY user@example.com" + ) +) + +# Create Cloud Account +cloud_account = CloudAccount("exampleCloudAccount", + CloudAccountArgs( + name="my-aws-account", + type="aws", + description="My AWS Cloud Account", + credentials={ + "role_arn": "arn:aws:iam::21112529deae39:role/pgedge-135232c" + } + ), + opts=pulumi.ResourceOptions(depends_on=[ssh_key]) +) + +# Create Backup Store +backup_store = BackupStore("testBackupStore", + BackupStoreArgs( + name="example", + cloud_account_id=cloud_account.id, + region="us-west-2" + ), + opts=pulumi.ResourceOptions(depends_on=[cloud_account]) +) + +# Create Cluster +cluster = Cluster("exampleCluster", + ClusterArgs( + name="example", + cloud_account_id=cloud_account.id, + regions=["us-west-2", "us-east-1", "us-east-1"], + node_location="public", + ssh_key_id=ssh_key.id, + nodes=[ + { + "name": "n1", + "region": "us-west-2", + "instance_type": "r6g.medium", + "volume_size": 100, + "volume_type": "gp2" + }, + { + "name": "n2", + "region": "us-east-1", + "instance_type": "r6g.medium", + "volume_size": 100, + "volume_type": "gp2" + }, + { + "name": "n3", + "region": "us-east-1", + "instance_type": "r6g.medium", + "volume_size": 100, + "volume_type": "gp2" + } + ], + networks=[ + { + "region": "us-west-2", + "cidr": "10.1.0.0/16", + "public_subnets": ["10.1.0.0/24"] + }, + { + "region": "us-east-1", + "cidr": "10.2.0.0/16", + "public_subnets": ["10.2.0.0/24"] + }, + { + "region": "us-east-1", + "cidr": "10.3.0.0/16", + "public_subnets": ["10.3.0.0/24"] + } + ], + backup_store_ids=[backup_store.id], + firewall_rules=[ + { + "name": "postgres", + "port": 5432, + "sources": ["0.0.0.0/0"] + } + ] + ), + opts=pulumi.ResourceOptions(depends_on=[backup_store]) +) + +# Create Database +database = Database("exampleDatabase", + DatabaseArgs( + name="example", + cluster_id=cluster.id, + options=["install:northwind", "rest:enabled"], + nodes={ + "n1": { + "name": "n1" + }, + "n2": { + "name": "n2" + }, + "n3": { + "name": "n3" + } + }, + backups={ + "provider": "pgbackrest", + "configs": [{ + "id": "default", + "node_name": "n1", + "schedules": [{ + "id": "daily-full-backup", + "cron_expression": "0 6 * * ?", + "type": "full" + }], + "repositories": [{ + "backup_store_id": backup_store.id, + "retention_full": 7 + }] + }] + } + ), + opts=pulumi.ResourceOptions(depends_on=[cluster]) +) + +# Export values +pulumi.export("sshKeyId", ssh_key.id) +pulumi.export("backupStoreId", backup_store.id) +pulumi.export("cloudAccountId", cloud_account.id) +pulumi.export("clusterId", cluster.id) +pulumi.export("clusterStatus", cluster.status) +pulumi.export("clusterCreatedAt", cluster.created_at) +pulumi.export("databaseId", database.id) +pulumi.export("databaseNodes", database.nodes) +pulumi.export("configVersion", database.config_version) +pulumi.export("databaseBackups", database.backups) +pulumi.export("databaseBackupsConfigs", database.backups["configs"]) +pulumi.export("databaseBackupsSchedules", database.backups["configs"][0]["schedules"]) +pulumi.export("databaseExtensions", database.extensions) +pulumi.export("databaseOptions", database) +pulumi.export("databaseDomain", database.domain) \ No newline at end of file diff --git a/examples/python/requirements.txt b/examples/python/requirements.txt new file mode 100644 index 0000000..f06d6a4 --- /dev/null +++ b/examples/python/requirements.txt @@ -0,0 +1,3 @@ +parver==0.5 +pgEdge_pulumi_pgedge +pulumi>=3.0.0,<4.0.0 \ No newline at end of file diff --git a/provider/cmd/pulumi-resource-pgedge/schema.json b/provider/cmd/pulumi-resource-pgedge/schema.json index afaa214..5f180b8 100644 --- a/provider/cmd/pulumi-resource-pgedge/schema.json +++ b/provider/cmd/pulumi-resource-pgedge/schema.json @@ -12,7 +12,7 @@ "license": "Apache-2.0", "attribution": "This Pulumi package is based on the [`pgedge` Terraform Provider](https://github.com/pgEdge/terraform-provider-pgedge).", "repository": "https://github.com/pgEdge/pulumi-pgedge", - "logoUrl": "https://pgedge-public-assets.s3.amazonaws.com/product/images/pgedge_mark.svg", + "logoUrl": "https://raw.githubusercontent.com/pgEdge/pulumi-pgedge/main/.github/images/logo.png", "pluginDownloadURL": "github://api.github.com/pgEdge/pulumi-pgedge", "publisher": "pgEdge", "meta": { diff --git a/provider/resources.go b/provider/resources.go index 13fc0c1..584c7ad 100644 --- a/provider/resources.go +++ b/provider/resources.go @@ -36,7 +36,7 @@ func Provider() tfbridge.ProviderInfo { Name: "pgedge", DisplayName: "pgEdge", Publisher: "pgEdge", - LogoURL: "https://pgedge-public-assets.s3.amazonaws.com/product/images/pgedge_mark.svg", + LogoURL: "https://raw.githubusercontent.com/pgEdge/pulumi-pgedge/main/.github/images/logo.png", PluginDownloadURL: "github://api.github.com/pgEdge/pulumi-pgedge", Description: "A Pulumi package for creating and managing pgedge cloud resources.", Keywords: []string{"pulumi", "pgedge", "category/cloud", "category/database"}, diff --git a/sdk/dotnet/BackupStore.cs b/sdk/dotnet/BackupStore.cs new file mode 100644 index 0000000..9f8f11d --- /dev/null +++ b/sdk/dotnet/BackupStore.cs @@ -0,0 +1,143 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + [PgedgeResourceType("pgedge:index/backupStore:BackupStore")] + public partial class BackupStore : global::Pulumi.CustomResource + { + [Output("cloudAccountId")] + public Output CloudAccountId { get; private set; } = null!; + + [Output("cloudAccountType")] + public Output CloudAccountType { get; private set; } = null!; + + [Output("clusterIds")] + public Output> ClusterIds { get; private set; } = null!; + + [Output("createdAt")] + public Output CreatedAt { get; private set; } = null!; + + [Output("name")] + public Output Name { get; private set; } = null!; + + [Output("properties")] + public Output> Properties { get; private set; } = null!; + + [Output("region")] + public Output Region { get; private set; } = null!; + + [Output("status")] + public Output Status { get; private set; } = null!; + + + /// + /// Create a BackupStore resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public BackupStore(string name, BackupStoreArgs args, CustomResourceOptions? options = null) + : base("pgedge:index/backupStore:BackupStore", name, args ?? new BackupStoreArgs(), MakeResourceOptions(options, "")) + { + } + + private BackupStore(string name, Input id, BackupStoreState? state = null, CustomResourceOptions? options = null) + : base("pgedge:index/backupStore:BackupStore", name, state, MakeResourceOptions(options, id)) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + /// + /// Get an existing BackupStore resource's state with the given name, ID, and optional extra + /// properties used to qualify the lookup. + /// + /// + /// The unique name of the resulting resource. + /// The unique provider ID of the resource to lookup. + /// Any extra arguments used during the lookup. + /// A bag of options that control this resource's behavior + public static BackupStore Get(string name, Input id, BackupStoreState? state = null, CustomResourceOptions? options = null) + { + return new BackupStore(name, id, state, options); + } + } + + public sealed class BackupStoreArgs : global::Pulumi.ResourceArgs + { + [Input("cloudAccountId", required: true)] + public Input CloudAccountId { get; set; } = null!; + + [Input("name")] + public Input? Name { get; set; } + + [Input("region", required: true)] + public Input Region { get; set; } = null!; + + public BackupStoreArgs() + { + } + public static new BackupStoreArgs Empty => new BackupStoreArgs(); + } + + public sealed class BackupStoreState : global::Pulumi.ResourceArgs + { + [Input("cloudAccountId")] + public Input? CloudAccountId { get; set; } + + [Input("cloudAccountType")] + public Input? CloudAccountType { get; set; } + + [Input("clusterIds")] + private InputList? _clusterIds; + public InputList ClusterIds + { + get => _clusterIds ?? (_clusterIds = new InputList()); + set => _clusterIds = value; + } + + [Input("createdAt")] + public Input? CreatedAt { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("properties")] + private InputMap? _properties; + public InputMap Properties + { + get => _properties ?? (_properties = new InputMap()); + set => _properties = value; + } + + [Input("region")] + public Input? Region { get; set; } + + [Input("status")] + public Input? Status { get; set; } + + public BackupStoreState() + { + } + public static new BackupStoreState Empty => new BackupStoreState(); + } +} diff --git a/sdk/dotnet/CloudAccount.cs b/sdk/dotnet/CloudAccount.cs new file mode 100644 index 0000000..a86aa61 --- /dev/null +++ b/sdk/dotnet/CloudAccount.cs @@ -0,0 +1,128 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + [PgedgeResourceType("pgedge:index/cloudAccount:CloudAccount")] + public partial class CloudAccount : global::Pulumi.CustomResource + { + [Output("createdAt")] + public Output CreatedAt { get; private set; } = null!; + + [Output("credentials")] + public Output> Credentials { get; private set; } = null!; + + [Output("description")] + public Output Description { get; private set; } = null!; + + [Output("name")] + public Output Name { get; private set; } = null!; + + [Output("type")] + public Output Type { get; private set; } = null!; + + + /// + /// Create a CloudAccount resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public CloudAccount(string name, CloudAccountArgs args, CustomResourceOptions? options = null) + : base("pgedge:index/cloudAccount:CloudAccount", name, args ?? new CloudAccountArgs(), MakeResourceOptions(options, "")) + { + } + + private CloudAccount(string name, Input id, CloudAccountState? state = null, CustomResourceOptions? options = null) + : base("pgedge:index/cloudAccount:CloudAccount", name, state, MakeResourceOptions(options, id)) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + /// + /// Get an existing CloudAccount resource's state with the given name, ID, and optional extra + /// properties used to qualify the lookup. + /// + /// + /// The unique name of the resulting resource. + /// The unique provider ID of the resource to lookup. + /// Any extra arguments used during the lookup. + /// A bag of options that control this resource's behavior + public static CloudAccount Get(string name, Input id, CloudAccountState? state = null, CustomResourceOptions? options = null) + { + return new CloudAccount(name, id, state, options); + } + } + + public sealed class CloudAccountArgs : global::Pulumi.ResourceArgs + { + [Input("credentials", required: true)] + private InputMap? _credentials; + public InputMap Credentials + { + get => _credentials ?? (_credentials = new InputMap()); + set => _credentials = value; + } + + [Input("description")] + public Input? Description { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("type", required: true)] + public Input Type { get; set; } = null!; + + public CloudAccountArgs() + { + } + public static new CloudAccountArgs Empty => new CloudAccountArgs(); + } + + public sealed class CloudAccountState : global::Pulumi.ResourceArgs + { + [Input("createdAt")] + public Input? CreatedAt { get; set; } + + [Input("credentials")] + private InputMap? _credentials; + public InputMap Credentials + { + get => _credentials ?? (_credentials = new InputMap()); + set => _credentials = value; + } + + [Input("description")] + public Input? Description { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("type")] + public Input? Type { get; set; } + + public CloudAccountState() + { + } + public static new CloudAccountState Empty => new CloudAccountState(); + } +} diff --git a/sdk/dotnet/Cluster.cs b/sdk/dotnet/Cluster.cs new file mode 100644 index 0000000..4c0b72e --- /dev/null +++ b/sdk/dotnet/Cluster.cs @@ -0,0 +1,278 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + [PgedgeResourceType("pgedge:index/cluster:Cluster")] + public partial class Cluster : global::Pulumi.CustomResource + { + /// + /// List of backup store IDs to associate with the cluster + /// + [Output("backupStoreIds")] + public Output> BackupStoreIds { get; private set; } = null!; + + [Output("capacity")] + public Output Capacity { get; private set; } = null!; + + [Output("cloudAccountId")] + public Output CloudAccountId { get; private set; } = null!; + + [Output("createdAt")] + public Output CreatedAt { get; private set; } = null!; + + [Output("firewallRules")] + public Output> FirewallRules { get; private set; } = null!; + + [Output("name")] + public Output Name { get; private set; } = null!; + + [Output("networks")] + public Output> Networks { get; private set; } = null!; + + /// + /// Node location of the cluster. Must be either 'public' or 'private'. + /// + [Output("nodeLocation")] + public Output NodeLocation { get; private set; } = null!; + + [Output("nodes")] + public Output> Nodes { get; private set; } = null!; + + [Output("regions")] + public Output> Regions { get; private set; } = null!; + + /// + /// A map of tags to assign to the cluster + /// + [Output("resourceTags")] + public Output> ResourceTags { get; private set; } = null!; + + [Output("sshKeyId")] + public Output SshKeyId { get; private set; } = null!; + + [Output("status")] + public Output Status { get; private set; } = null!; + + + /// + /// Create a Cluster resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public Cluster(string name, ClusterArgs args, CustomResourceOptions? options = null) + : base("pgedge:index/cluster:Cluster", name, args ?? new ClusterArgs(), MakeResourceOptions(options, "")) + { + } + + private Cluster(string name, Input id, ClusterState? state = null, CustomResourceOptions? options = null) + : base("pgedge:index/cluster:Cluster", name, state, MakeResourceOptions(options, id)) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + /// + /// Get an existing Cluster resource's state with the given name, ID, and optional extra + /// properties used to qualify the lookup. + /// + /// + /// The unique name of the resulting resource. + /// The unique provider ID of the resource to lookup. + /// Any extra arguments used during the lookup. + /// A bag of options that control this resource's behavior + public static Cluster Get(string name, Input id, ClusterState? state = null, CustomResourceOptions? options = null) + { + return new Cluster(name, id, state, options); + } + } + + public sealed class ClusterArgs : global::Pulumi.ResourceArgs + { + [Input("backupStoreIds")] + private InputList? _backupStoreIds; + + /// + /// List of backup store IDs to associate with the cluster + /// + public InputList BackupStoreIds + { + get => _backupStoreIds ?? (_backupStoreIds = new InputList()); + set => _backupStoreIds = value; + } + + [Input("capacity")] + public Input? Capacity { get; set; } + + [Input("cloudAccountId", required: true)] + public Input CloudAccountId { get; set; } = null!; + + [Input("firewallRules")] + private InputList? _firewallRules; + public InputList FirewallRules + { + get => _firewallRules ?? (_firewallRules = new InputList()); + set => _firewallRules = value; + } + + [Input("name")] + public Input? Name { get; set; } + + [Input("networks", required: true)] + private InputList? _networks; + public InputList Networks + { + get => _networks ?? (_networks = new InputList()); + set => _networks = value; + } + + /// + /// Node location of the cluster. Must be either 'public' or 'private'. + /// + [Input("nodeLocation", required: true)] + public Input NodeLocation { get; set; } = null!; + + [Input("nodes", required: true)] + private InputList? _nodes; + public InputList Nodes + { + get => _nodes ?? (_nodes = new InputList()); + set => _nodes = value; + } + + [Input("regions", required: true)] + private InputList? _regions; + public InputList Regions + { + get => _regions ?? (_regions = new InputList()); + set => _regions = value; + } + + [Input("resourceTags")] + private InputMap? _resourceTags; + + /// + /// A map of tags to assign to the cluster + /// + public InputMap ResourceTags + { + get => _resourceTags ?? (_resourceTags = new InputMap()); + set => _resourceTags = value; + } + + [Input("sshKeyId")] + public Input? SshKeyId { get; set; } + + public ClusterArgs() + { + } + public static new ClusterArgs Empty => new ClusterArgs(); + } + + public sealed class ClusterState : global::Pulumi.ResourceArgs + { + [Input("backupStoreIds")] + private InputList? _backupStoreIds; + + /// + /// List of backup store IDs to associate with the cluster + /// + public InputList BackupStoreIds + { + get => _backupStoreIds ?? (_backupStoreIds = new InputList()); + set => _backupStoreIds = value; + } + + [Input("capacity")] + public Input? Capacity { get; set; } + + [Input("cloudAccountId")] + public Input? CloudAccountId { get; set; } + + [Input("createdAt")] + public Input? CreatedAt { get; set; } + + [Input("firewallRules")] + private InputList? _firewallRules; + public InputList FirewallRules + { + get => _firewallRules ?? (_firewallRules = new InputList()); + set => _firewallRules = value; + } + + [Input("name")] + public Input? Name { get; set; } + + [Input("networks")] + private InputList? _networks; + public InputList Networks + { + get => _networks ?? (_networks = new InputList()); + set => _networks = value; + } + + /// + /// Node location of the cluster. Must be either 'public' or 'private'. + /// + [Input("nodeLocation")] + public Input? NodeLocation { get; set; } + + [Input("nodes")] + private InputList? _nodes; + public InputList Nodes + { + get => _nodes ?? (_nodes = new InputList()); + set => _nodes = value; + } + + [Input("regions")] + private InputList? _regions; + public InputList Regions + { + get => _regions ?? (_regions = new InputList()); + set => _regions = value; + } + + [Input("resourceTags")] + private InputMap? _resourceTags; + + /// + /// A map of tags to assign to the cluster + /// + public InputMap ResourceTags + { + get => _resourceTags ?? (_resourceTags = new InputMap()); + set => _resourceTags = value; + } + + [Input("sshKeyId")] + public Input? SshKeyId { get; set; } + + [Input("status")] + public Input? Status { get; set; } + + public ClusterState() + { + } + public static new ClusterState Empty => new ClusterState(); + } +} diff --git a/sdk/dotnet/Config/Config.cs b/sdk/dotnet/Config/Config.cs new file mode 100644 index 0000000..1e3e43c --- /dev/null +++ b/sdk/dotnet/Config/Config.cs @@ -0,0 +1,46 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Immutable; + +namespace Pgedge.Pgedge +{ + public static class Config + { + [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "IDE1006", Justification = + "Double underscore prefix used to avoid conflicts with variable names.")] + private sealed class __Value + { + private readonly Func _getter; + private T _value = default!; + private bool _set; + + public __Value(Func getter) + { + _getter = getter; + } + + public T Get() => _set ? _value : _getter(); + + public void Set(T value) + { + _value = value; + _set = true; + } + } + + private static readonly global::Pulumi.Config __config = new global::Pulumi.Config("pgedge"); + + private static readonly __Value _baseUrl = new __Value(() => __config.Get("baseUrl") ?? Utilities.GetEnv("PGEDGE_BASE_URL")); + /// + /// Base Url to use when connecting to the PgEdge service. + /// + public static string? BaseUrl + { + get => _baseUrl.Get(); + set => _baseUrl.Set(value); + } + + } +} diff --git a/sdk/dotnet/Config/README.md b/sdk/dotnet/Config/README.md new file mode 100644 index 0000000..3176ab6 --- /dev/null +++ b/sdk/dotnet/Config/README.md @@ -0,0 +1 @@ +A Pulumi package for creating and managing pgedge cloud resources. diff --git a/sdk/dotnet/Database.cs b/sdk/dotnet/Database.cs new file mode 100644 index 0000000..66e4a8a --- /dev/null +++ b/sdk/dotnet/Database.cs @@ -0,0 +1,325 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + /// + /// Manages a pgEdge database. + /// + [PgedgeResourceType("pgedge:index/database:Database")] + public partial class Database : global::Pulumi.CustomResource + { + /// + /// Backup configuration for the database. + /// + [Output("backups")] + public Output Backups { get; private set; } = null!; + + /// + /// The ID of the cluster this database belongs to. + /// + [Output("clusterId")] + public Output ClusterId { get; private set; } = null!; + + /// + /// List of components in the database. + /// + [Output("components")] + public Output> Components { get; private set; } = null!; + + /// + /// The configuration version of the database. + /// + [Output("configVersion")] + public Output ConfigVersion { get; private set; } = null!; + + /// + /// The timestamp when the database was created. + /// + [Output("createdAt")] + public Output CreatedAt { get; private set; } = null!; + + /// + /// The domain associated with the database. + /// + [Output("domain")] + public Output Domain { get; private set; } = null!; + + /// + /// Extensions configuration for the database. + /// + [Output("extensions")] + public Output Extensions { get; private set; } = null!; + + /// + /// The name of the database. + /// + [Output("name")] + public Output Name { get; private set; } = null!; + + /// + /// Map of nodes in the database. + /// + [Output("nodes")] + public Output> Nodes { get; private set; } = null!; + + /// + /// A list of options for the database. + /// + [Output("options")] + public Output> Options { get; private set; } = null!; + + /// + /// The PostgreSQL version of the database. + /// + [Output("pgVersion")] + public Output PgVersion { get; private set; } = null!; + + /// + /// List of roles in the database. + /// + [Output("roles")] + public Output> Roles { get; private set; } = null!; + + /// + /// The current status of the database. + /// + [Output("status")] + public Output Status { get; private set; } = null!; + + + /// + /// Create a Database resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public Database(string name, DatabaseArgs args, CustomResourceOptions? options = null) + : base("pgedge:index/database:Database", name, args ?? new DatabaseArgs(), MakeResourceOptions(options, "")) + { + } + + private Database(string name, Input id, DatabaseState? state = null, CustomResourceOptions? options = null) + : base("pgedge:index/database:Database", name, state, MakeResourceOptions(options, id)) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + /// + /// Get an existing Database resource's state with the given name, ID, and optional extra + /// properties used to qualify the lookup. + /// + /// + /// The unique name of the resulting resource. + /// The unique provider ID of the resource to lookup. + /// Any extra arguments used during the lookup. + /// A bag of options that control this resource's behavior + public static Database Get(string name, Input id, DatabaseState? state = null, CustomResourceOptions? options = null) + { + return new Database(name, id, state, options); + } + } + + public sealed class DatabaseArgs : global::Pulumi.ResourceArgs + { + /// + /// Backup configuration for the database. + /// + [Input("backups")] + public Input? Backups { get; set; } + + /// + /// The ID of the cluster this database belongs to. + /// + [Input("clusterId", required: true)] + public Input ClusterId { get; set; } = null!; + + /// + /// The configuration version of the database. + /// + [Input("configVersion")] + public Input? ConfigVersion { get; set; } + + /// + /// Extensions configuration for the database. + /// + [Input("extensions")] + public Input? Extensions { get; set; } + + /// + /// The name of the database. + /// + [Input("name")] + public Input? Name { get; set; } + + [Input("nodes", required: true)] + private InputMap? _nodes; + + /// + /// Map of nodes in the database. + /// + public InputMap Nodes + { + get => _nodes ?? (_nodes = new InputMap()); + set => _nodes = value; + } + + [Input("options")] + private InputList? _options; + + /// + /// A list of options for the database. + /// + public InputList Options + { + get => _options ?? (_options = new InputList()); + set => _options = value; + } + + [Input("roles")] + private InputList? _roles; + + /// + /// List of roles in the database. + /// + public InputList Roles + { + get => _roles ?? (_roles = new InputList()); + set => _roles = value; + } + + public DatabaseArgs() + { + } + public static new DatabaseArgs Empty => new DatabaseArgs(); + } + + public sealed class DatabaseState : global::Pulumi.ResourceArgs + { + /// + /// Backup configuration for the database. + /// + [Input("backups")] + public Input? Backups { get; set; } + + /// + /// The ID of the cluster this database belongs to. + /// + [Input("clusterId")] + public Input? ClusterId { get; set; } + + [Input("components")] + private InputList? _components; + + /// + /// List of components in the database. + /// + public InputList Components + { + get => _components ?? (_components = new InputList()); + set => _components = value; + } + + /// + /// The configuration version of the database. + /// + [Input("configVersion")] + public Input? ConfigVersion { get; set; } + + /// + /// The timestamp when the database was created. + /// + [Input("createdAt")] + public Input? CreatedAt { get; set; } + + /// + /// The domain associated with the database. + /// + [Input("domain")] + public Input? Domain { get; set; } + + /// + /// Extensions configuration for the database. + /// + [Input("extensions")] + public Input? Extensions { get; set; } + + /// + /// The name of the database. + /// + [Input("name")] + public Input? Name { get; set; } + + [Input("nodes")] + private InputMap? _nodes; + + /// + /// Map of nodes in the database. + /// + public InputMap Nodes + { + get => _nodes ?? (_nodes = new InputMap()); + set => _nodes = value; + } + + [Input("options")] + private InputList? _options; + + /// + /// A list of options for the database. + /// + public InputList Options + { + get => _options ?? (_options = new InputList()); + set => _options = value; + } + + /// + /// The PostgreSQL version of the database. + /// + [Input("pgVersion")] + public Input? PgVersion { get; set; } + + [Input("roles")] + private InputList? _roles; + + /// + /// List of roles in the database. + /// + public InputList Roles + { + get => _roles ?? (_roles = new InputList()); + set => _roles = value; + } + + /// + /// The current status of the database. + /// + [Input("status")] + public Input? Status { get; set; } + + public DatabaseState() + { + } + public static new DatabaseState Empty => new DatabaseState(); + } +} diff --git a/sdk/dotnet/GetBackupStores.cs b/sdk/dotnet/GetBackupStores.cs new file mode 100644 index 0000000..522dd04 --- /dev/null +++ b/sdk/dotnet/GetBackupStores.cs @@ -0,0 +1,42 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + public static class GetBackupStores + { + public static Task InvokeAsync(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.InvokeAsync("pgedge:index/getBackupStores:getBackupStores", InvokeArgs.Empty, options.WithDefaults()); + + public static Output Invoke(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.Invoke("pgedge:index/getBackupStores:getBackupStores", InvokeArgs.Empty, options.WithDefaults()); + } + + + [OutputType] + public sealed class GetBackupStoresResult + { + public readonly ImmutableArray BackupStores; + /// + /// The provider-assigned unique ID for this managed resource. + /// + public readonly string Id; + + [OutputConstructor] + private GetBackupStoresResult( + ImmutableArray backupStores, + + string id) + { + BackupStores = backupStores; + Id = id; + } + } +} diff --git a/sdk/dotnet/GetCloudAccounts.cs b/sdk/dotnet/GetCloudAccounts.cs new file mode 100644 index 0000000..b91031e --- /dev/null +++ b/sdk/dotnet/GetCloudAccounts.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + public static class GetCloudAccounts + { + /// + /// Data source for pgEdge cloud accounts. + /// + public static Task InvokeAsync(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.InvokeAsync("pgedge:index/getCloudAccounts:getCloudAccounts", InvokeArgs.Empty, options.WithDefaults()); + + /// + /// Data source for pgEdge cloud accounts. + /// + public static Output Invoke(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.Invoke("pgedge:index/getCloudAccounts:getCloudAccounts", InvokeArgs.Empty, options.WithDefaults()); + } + + + [OutputType] + public sealed class GetCloudAccountsResult + { + public readonly ImmutableArray CloudAccounts; + /// + /// The provider-assigned unique ID for this managed resource. + /// + public readonly string Id; + + [OutputConstructor] + private GetCloudAccountsResult( + ImmutableArray cloudAccounts, + + string id) + { + CloudAccounts = cloudAccounts; + Id = id; + } + } +} diff --git a/sdk/dotnet/GetClusters.cs b/sdk/dotnet/GetClusters.cs new file mode 100644 index 0000000..69b2f14 --- /dev/null +++ b/sdk/dotnet/GetClusters.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + public static class GetClusters + { + /// + /// Data source for pgEdge clusters. + /// + public static Task InvokeAsync(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.InvokeAsync("pgedge:index/getClusters:getClusters", InvokeArgs.Empty, options.WithDefaults()); + + /// + /// Data source for pgEdge clusters. + /// + public static Output Invoke(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.Invoke("pgedge:index/getClusters:getClusters", InvokeArgs.Empty, options.WithDefaults()); + } + + + [OutputType] + public sealed class GetClustersResult + { + public readonly ImmutableArray Clusters; + /// + /// The provider-assigned unique ID for this managed resource. + /// + public readonly string Id; + + [OutputConstructor] + private GetClustersResult( + ImmutableArray clusters, + + string id) + { + Clusters = clusters; + Id = id; + } + } +} diff --git a/sdk/dotnet/GetDatabases.cs b/sdk/dotnet/GetDatabases.cs new file mode 100644 index 0000000..7941265 --- /dev/null +++ b/sdk/dotnet/GetDatabases.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + public static class GetDatabases + { + /// + /// Data source for pgEdge databases + /// + public static Task InvokeAsync(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.InvokeAsync("pgedge:index/getDatabases:getDatabases", InvokeArgs.Empty, options.WithDefaults()); + + /// + /// Data source for pgEdge databases + /// + public static Output Invoke(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.Invoke("pgedge:index/getDatabases:getDatabases", InvokeArgs.Empty, options.WithDefaults()); + } + + + [OutputType] + public sealed class GetDatabasesResult + { + public readonly ImmutableArray Databases; + /// + /// The provider-assigned unique ID for this managed resource. + /// + public readonly string Id; + + [OutputConstructor] + private GetDatabasesResult( + ImmutableArray databases, + + string id) + { + Databases = databases; + Id = id; + } + } +} diff --git a/sdk/dotnet/GetSSHKeys.cs b/sdk/dotnet/GetSSHKeys.cs new file mode 100644 index 0000000..4721c98 --- /dev/null +++ b/sdk/dotnet/GetSSHKeys.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + public static class GetSSHKeys + { + /// + /// Data source for pgEdge SSH keys. + /// + public static Task InvokeAsync(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.InvokeAsync("pgedge:index/getSSHKeys:getSSHKeys", InvokeArgs.Empty, options.WithDefaults()); + + /// + /// Data source for pgEdge SSH keys. + /// + public static Output Invoke(InvokeOptions? options = null) + => global::Pulumi.Deployment.Instance.Invoke("pgedge:index/getSSHKeys:getSSHKeys", InvokeArgs.Empty, options.WithDefaults()); + } + + + [OutputType] + public sealed class GetSSHKeysResult + { + /// + /// The provider-assigned unique ID for this managed resource. + /// + public readonly string Id; + public readonly ImmutableArray SshKeys; + + [OutputConstructor] + private GetSSHKeysResult( + string id, + + ImmutableArray sshKeys) + { + Id = id; + SshKeys = sshKeys; + } + } +} diff --git a/sdk/dotnet/Inputs/ClusterFirewallRuleArgs.cs b/sdk/dotnet/Inputs/ClusterFirewallRuleArgs.cs new file mode 100644 index 0000000..563353d --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterFirewallRuleArgs.cs @@ -0,0 +1,35 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterFirewallRuleArgs : global::Pulumi.ResourceArgs + { + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("port", required: true)] + public Input Port { get; set; } = null!; + + [Input("sources", required: true)] + private InputList? _sources; + public InputList Sources + { + get => _sources ?? (_sources = new InputList()); + set => _sources = value; + } + + public ClusterFirewallRuleArgs() + { + } + public static new ClusterFirewallRuleArgs Empty => new ClusterFirewallRuleArgs(); + } +} diff --git a/sdk/dotnet/Inputs/ClusterFirewallRuleGetArgs.cs b/sdk/dotnet/Inputs/ClusterFirewallRuleGetArgs.cs new file mode 100644 index 0000000..bb41431 --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterFirewallRuleGetArgs.cs @@ -0,0 +1,35 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterFirewallRuleGetArgs : global::Pulumi.ResourceArgs + { + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("port", required: true)] + public Input Port { get; set; } = null!; + + [Input("sources", required: true)] + private InputList? _sources; + public InputList Sources + { + get => _sources ?? (_sources = new InputList()); + set => _sources = value; + } + + public ClusterFirewallRuleGetArgs() + { + } + public static new ClusterFirewallRuleGetArgs Empty => new ClusterFirewallRuleGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/ClusterNetworkArgs.cs b/sdk/dotnet/Inputs/ClusterNetworkArgs.cs new file mode 100644 index 0000000..de8d78e --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterNetworkArgs.cs @@ -0,0 +1,75 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterNetworkArgs : global::Pulumi.ResourceArgs + { + /// + /// CIDR of the network + /// + [Input("cidr", required: true)] + public Input Cidr { get; set; } = null!; + + /// + /// Whether the network is external + /// + [Input("external")] + public Input? External { get; set; } + + /// + /// External ID of the network + /// + [Input("externalId")] + public Input? ExternalId { get; set; } + + /// + /// Name of the network + /// + [Input("name")] + public Input? Name { get; set; } + + [Input("privateSubnets")] + private InputList? _privateSubnets; + + /// + /// List of private subnets + /// + public InputList PrivateSubnets + { + get => _privateSubnets ?? (_privateSubnets = new InputList()); + set => _privateSubnets = value; + } + + [Input("publicSubnets", required: true)] + private InputList? _publicSubnets; + + /// + /// List of public subnets + /// + public InputList PublicSubnets + { + get => _publicSubnets ?? (_publicSubnets = new InputList()); + set => _publicSubnets = value; + } + + /// + /// Region of the network + /// + [Input("region", required: true)] + public Input Region { get; set; } = null!; + + public ClusterNetworkArgs() + { + } + public static new ClusterNetworkArgs Empty => new ClusterNetworkArgs(); + } +} diff --git a/sdk/dotnet/Inputs/ClusterNetworkGetArgs.cs b/sdk/dotnet/Inputs/ClusterNetworkGetArgs.cs new file mode 100644 index 0000000..cbcca08 --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterNetworkGetArgs.cs @@ -0,0 +1,75 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterNetworkGetArgs : global::Pulumi.ResourceArgs + { + /// + /// CIDR of the network + /// + [Input("cidr", required: true)] + public Input Cidr { get; set; } = null!; + + /// + /// Whether the network is external + /// + [Input("external")] + public Input? External { get; set; } + + /// + /// External ID of the network + /// + [Input("externalId")] + public Input? ExternalId { get; set; } + + /// + /// Name of the network + /// + [Input("name")] + public Input? Name { get; set; } + + [Input("privateSubnets")] + private InputList? _privateSubnets; + + /// + /// List of private subnets + /// + public InputList PrivateSubnets + { + get => _privateSubnets ?? (_privateSubnets = new InputList()); + set => _privateSubnets = value; + } + + [Input("publicSubnets", required: true)] + private InputList? _publicSubnets; + + /// + /// List of public subnets + /// + public InputList PublicSubnets + { + get => _publicSubnets ?? (_publicSubnets = new InputList()); + set => _publicSubnets = value; + } + + /// + /// Region of the network + /// + [Input("region", required: true)] + public Input Region { get; set; } = null!; + + public ClusterNetworkGetArgs() + { + } + public static new ClusterNetworkGetArgs Empty => new ClusterNetworkGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/ClusterNodeArgs.cs b/sdk/dotnet/Inputs/ClusterNodeArgs.cs new file mode 100644 index 0000000..317856b --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterNodeArgs.cs @@ -0,0 +1,42 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterNodeArgs : global::Pulumi.ResourceArgs + { + [Input("availabilityZone")] + public Input? AvailabilityZone { get; set; } + + [Input("instanceType", required: true)] + public Input InstanceType { get; set; } = null!; + + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("region", required: true)] + public Input Region { get; set; } = null!; + + [Input("volumeIops")] + public Input? VolumeIops { get; set; } + + [Input("volumeSize")] + public Input? VolumeSize { get; set; } + + [Input("volumeType")] + public Input? VolumeType { get; set; } + + public ClusterNodeArgs() + { + } + public static new ClusterNodeArgs Empty => new ClusterNodeArgs(); + } +} diff --git a/sdk/dotnet/Inputs/ClusterNodeGetArgs.cs b/sdk/dotnet/Inputs/ClusterNodeGetArgs.cs new file mode 100644 index 0000000..09879b8 --- /dev/null +++ b/sdk/dotnet/Inputs/ClusterNodeGetArgs.cs @@ -0,0 +1,42 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class ClusterNodeGetArgs : global::Pulumi.ResourceArgs + { + [Input("availabilityZone")] + public Input? AvailabilityZone { get; set; } + + [Input("instanceType", required: true)] + public Input InstanceType { get; set; } = null!; + + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("region", required: true)] + public Input Region { get; set; } = null!; + + [Input("volumeIops")] + public Input? VolumeIops { get; set; } + + [Input("volumeSize")] + public Input? VolumeSize { get; set; } + + [Input("volumeType")] + public Input? VolumeType { get; set; } + + public ClusterNodeGetArgs() + { + } + public static new ClusterNodeGetArgs Empty => new ClusterNodeGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsArgs.cs new file mode 100644 index 0000000..d6d658b --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsArgs.cs @@ -0,0 +1,39 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsArgs : global::Pulumi.ResourceArgs + { + [Input("configs")] + private InputList? _configs; + + /// + /// List of backup configurations. + /// + public InputList Configs + { + get => _configs ?? (_configs = new InputList()); + set => _configs = value; + } + + /// + /// The backup provider. + /// + [Input("provider")] + public Input? Provider { get; set; } + + public DatabaseBackupsArgs() + { + } + public static new DatabaseBackupsArgs Empty => new DatabaseBackupsArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigArgs.cs new file mode 100644 index 0000000..3440772 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigArgs.cs @@ -0,0 +1,57 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigArgs : global::Pulumi.ResourceArgs + { + /// + /// Unique identifier for the backup config. + /// + [Input("id")] + public Input? Id { get; set; } + + /// + /// Name of the node. + /// + [Input("nodeName")] + public Input? NodeName { get; set; } + + [Input("repositories")] + private InputList? _repositories; + + /// + /// List of backup repositories. + /// + public InputList Repositories + { + get => _repositories ?? (_repositories = new InputList()); + set => _repositories = value; + } + + [Input("schedules")] + private InputList? _schedules; + + /// + /// List of backup schedules. + /// + public InputList Schedules + { + get => _schedules ?? (_schedules = new InputList()); + set => _schedules = value; + } + + public DatabaseBackupsConfigArgs() + { + } + public static new DatabaseBackupsConfigArgs Empty => new DatabaseBackupsConfigArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigGetArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigGetArgs.cs new file mode 100644 index 0000000..1d516b6 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigGetArgs.cs @@ -0,0 +1,57 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigGetArgs : global::Pulumi.ResourceArgs + { + /// + /// Unique identifier for the backup config. + /// + [Input("id")] + public Input? Id { get; set; } + + /// + /// Name of the node. + /// + [Input("nodeName")] + public Input? NodeName { get; set; } + + [Input("repositories")] + private InputList? _repositories; + + /// + /// List of backup repositories. + /// + public InputList Repositories + { + get => _repositories ?? (_repositories = new InputList()); + set => _repositories = value; + } + + [Input("schedules")] + private InputList? _schedules; + + /// + /// List of backup schedules. + /// + public InputList Schedules + { + get => _schedules ?? (_schedules = new InputList()); + set => _schedules = value; + } + + public DatabaseBackupsConfigGetArgs() + { + } + public static new DatabaseBackupsConfigGetArgs Empty => new DatabaseBackupsConfigGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryArgs.cs new file mode 100644 index 0000000..f7b587f --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryArgs.cs @@ -0,0 +1,105 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigRepositoryArgs : global::Pulumi.ResourceArgs + { + /// + /// Azure account for azure-type repositories. + /// + [Input("azureAccount")] + public Input? AzureAccount { get; set; } + + /// + /// Azure container for azure-type repositories. + /// + [Input("azureContainer")] + public Input? AzureContainer { get; set; } + + /// + /// Azure endpoint for azure-type repositories. + /// + [Input("azureEndpoint")] + public Input? AzureEndpoint { get; set; } + + /// + /// ID of the backup store to use. If specified, other fields will be automatically populated. + /// + [Input("backupStoreId")] + public Input? BackupStoreId { get; set; } + + /// + /// Base path for the repository. + /// + [Input("basePath")] + public Input? BasePath { get; set; } + + /// + /// GCS bucket name for gcs-type repositories. + /// + [Input("gcsBucket")] + public Input? GcsBucket { get; set; } + + /// + /// GCS endpoint for gcs-type repositories. + /// + [Input("gcsEndpoint")] + public Input? GcsEndpoint { get; set; } + + /// + /// Unique identifier for the backup config. + /// + [Input("id")] + public Input? Id { get; set; } + + /// + /// Retention period for full backups. + /// + [Input("retentionFull")] + public Input? RetentionFull { get; set; } + + /// + /// Type of retention for full backups. + /// + [Input("retentionFullType")] + public Input? RetentionFullType { get; set; } + + /// + /// S3 bucket name for s3-type repositories. + /// + [Input("s3Bucket")] + public Input? S3Bucket { get; set; } + + /// + /// S3 endpoint for s3-type repositories. + /// + [Input("s3Endpoint")] + public Input? S3Endpoint { get; set; } + + /// + /// S3 region for s3-type repositories. + /// + [Input("s3Region")] + public Input? S3Region { get; set; } + + /// + /// Repository type (e.g., s3, gcs, azure). + /// + [Input("type")] + public Input? Type { get; set; } + + public DatabaseBackupsConfigRepositoryArgs() + { + } + public static new DatabaseBackupsConfigRepositoryArgs Empty => new DatabaseBackupsConfigRepositoryArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryGetArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryGetArgs.cs new file mode 100644 index 0000000..7e1b231 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigRepositoryGetArgs.cs @@ -0,0 +1,105 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigRepositoryGetArgs : global::Pulumi.ResourceArgs + { + /// + /// Azure account for azure-type repositories. + /// + [Input("azureAccount")] + public Input? AzureAccount { get; set; } + + /// + /// Azure container for azure-type repositories. + /// + [Input("azureContainer")] + public Input? AzureContainer { get; set; } + + /// + /// Azure endpoint for azure-type repositories. + /// + [Input("azureEndpoint")] + public Input? AzureEndpoint { get; set; } + + /// + /// ID of the backup store to use. If specified, other fields will be automatically populated. + /// + [Input("backupStoreId")] + public Input? BackupStoreId { get; set; } + + /// + /// Base path for the repository. + /// + [Input("basePath")] + public Input? BasePath { get; set; } + + /// + /// GCS bucket name for gcs-type repositories. + /// + [Input("gcsBucket")] + public Input? GcsBucket { get; set; } + + /// + /// GCS endpoint for gcs-type repositories. + /// + [Input("gcsEndpoint")] + public Input? GcsEndpoint { get; set; } + + /// + /// Unique identifier for the backup config. + /// + [Input("id")] + public Input? Id { get; set; } + + /// + /// Retention period for full backups. + /// + [Input("retentionFull")] + public Input? RetentionFull { get; set; } + + /// + /// Type of retention for full backups. + /// + [Input("retentionFullType")] + public Input? RetentionFullType { get; set; } + + /// + /// S3 bucket name for s3-type repositories. + /// + [Input("s3Bucket")] + public Input? S3Bucket { get; set; } + + /// + /// S3 endpoint for s3-type repositories. + /// + [Input("s3Endpoint")] + public Input? S3Endpoint { get; set; } + + /// + /// S3 region for s3-type repositories. + /// + [Input("s3Region")] + public Input? S3Region { get; set; } + + /// + /// Repository type (e.g., s3, gcs, azure). + /// + [Input("type")] + public Input? Type { get; set; } + + public DatabaseBackupsConfigRepositoryGetArgs() + { + } + public static new DatabaseBackupsConfigRepositoryGetArgs Empty => new DatabaseBackupsConfigRepositoryGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleArgs.cs new file mode 100644 index 0000000..ea7cedb --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleArgs.cs @@ -0,0 +1,39 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigScheduleArgs : global::Pulumi.ResourceArgs + { + /// + /// Cron expression for the schedule. + /// + [Input("cronExpression", required: true)] + public Input CronExpression { get; set; } = null!; + + /// + /// Unique identifier for the backup config. + /// + [Input("id", required: true)] + public Input Id { get; set; } = null!; + + /// + /// Repository type (e.g., s3, gcs, azure). + /// + [Input("type", required: true)] + public Input Type { get; set; } = null!; + + public DatabaseBackupsConfigScheduleArgs() + { + } + public static new DatabaseBackupsConfigScheduleArgs Empty => new DatabaseBackupsConfigScheduleArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleGetArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleGetArgs.cs new file mode 100644 index 0000000..0fca229 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsConfigScheduleGetArgs.cs @@ -0,0 +1,39 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsConfigScheduleGetArgs : global::Pulumi.ResourceArgs + { + /// + /// Cron expression for the schedule. + /// + [Input("cronExpression", required: true)] + public Input CronExpression { get; set; } = null!; + + /// + /// Unique identifier for the backup config. + /// + [Input("id", required: true)] + public Input Id { get; set; } = null!; + + /// + /// Repository type (e.g., s3, gcs, azure). + /// + [Input("type", required: true)] + public Input Type { get; set; } = null!; + + public DatabaseBackupsConfigScheduleGetArgs() + { + } + public static new DatabaseBackupsConfigScheduleGetArgs Empty => new DatabaseBackupsConfigScheduleGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseBackupsGetArgs.cs b/sdk/dotnet/Inputs/DatabaseBackupsGetArgs.cs new file mode 100644 index 0000000..b2391ab --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseBackupsGetArgs.cs @@ -0,0 +1,39 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseBackupsGetArgs : global::Pulumi.ResourceArgs + { + [Input("configs")] + private InputList? _configs; + + /// + /// List of backup configurations. + /// + public InputList Configs + { + get => _configs ?? (_configs = new InputList()); + set => _configs = value; + } + + /// + /// The backup provider. + /// + [Input("provider")] + public Input? Provider { get; set; } + + public DatabaseBackupsGetArgs() + { + } + public static new DatabaseBackupsGetArgs Empty => new DatabaseBackupsGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseComponentArgs.cs b/sdk/dotnet/Inputs/DatabaseComponentArgs.cs new file mode 100644 index 0000000..cddd4a6 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseComponentArgs.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseComponentArgs : global::Pulumi.ResourceArgs + { + [Input("id")] + public Input? Id { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("releaseDate")] + public Input? ReleaseDate { get; set; } + + [Input("status")] + public Input? Status { get; set; } + + [Input("version")] + public Input? Version { get; set; } + + public DatabaseComponentArgs() + { + } + public static new DatabaseComponentArgs Empty => new DatabaseComponentArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseComponentGetArgs.cs b/sdk/dotnet/Inputs/DatabaseComponentGetArgs.cs new file mode 100644 index 0000000..7c7c71e --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseComponentGetArgs.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseComponentGetArgs : global::Pulumi.ResourceArgs + { + [Input("id")] + public Input? Id { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("releaseDate")] + public Input? ReleaseDate { get; set; } + + [Input("status")] + public Input? Status { get; set; } + + [Input("version")] + public Input? Version { get; set; } + + public DatabaseComponentGetArgs() + { + } + public static new DatabaseComponentGetArgs Empty => new DatabaseComponentGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseExtensionsArgs.cs b/sdk/dotnet/Inputs/DatabaseExtensionsArgs.cs new file mode 100644 index 0000000..9fe9a7f --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseExtensionsArgs.cs @@ -0,0 +1,40 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseExtensionsArgs : global::Pulumi.ResourceArgs + { + [Input("autoManage")] + public Input? AutoManage { get; set; } + + [Input("availables")] + private InputList? _availables; + public InputList Availables + { + get => _availables ?? (_availables = new InputList()); + set => _availables = value; + } + + [Input("requesteds")] + private InputList? _requesteds; + public InputList Requesteds + { + get => _requesteds ?? (_requesteds = new InputList()); + set => _requesteds = value; + } + + public DatabaseExtensionsArgs() + { + } + public static new DatabaseExtensionsArgs Empty => new DatabaseExtensionsArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseExtensionsGetArgs.cs b/sdk/dotnet/Inputs/DatabaseExtensionsGetArgs.cs new file mode 100644 index 0000000..cb99341 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseExtensionsGetArgs.cs @@ -0,0 +1,40 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseExtensionsGetArgs : global::Pulumi.ResourceArgs + { + [Input("autoManage")] + public Input? AutoManage { get; set; } + + [Input("availables")] + private InputList? _availables; + public InputList Availables + { + get => _availables ?? (_availables = new InputList()); + set => _availables = value; + } + + [Input("requesteds")] + private InputList? _requesteds; + public InputList Requesteds + { + get => _requesteds ?? (_requesteds = new InputList()); + set => _requesteds = value; + } + + public DatabaseExtensionsGetArgs() + { + } + public static new DatabaseExtensionsGetArgs Empty => new DatabaseExtensionsGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesArgs.cs new file mode 100644 index 0000000..d0a5bbb --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesArgs.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesArgs : global::Pulumi.ResourceArgs + { + [Input("connection")] + public Input? Connection { get; set; } + + [Input("extensions")] + public Input? Extensions { get; set; } + + [Input("location")] + public Input? Location { get; set; } + + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("region")] + public Input? Region { get; set; } + + public DatabaseNodesArgs() + { + } + public static new DatabaseNodesArgs Empty => new DatabaseNodesArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesConnectionArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesConnectionArgs.cs new file mode 100644 index 0000000..db546af --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesConnectionArgs.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesConnectionArgs : global::Pulumi.ResourceArgs + { + [Input("database")] + public Input? Database { get; set; } + + [Input("externalIpAddress")] + public Input? ExternalIpAddress { get; set; } + + [Input("host")] + public Input? Host { get; set; } + + [Input("internalHost")] + public Input? InternalHost { get; set; } + + [Input("internalIpAddress")] + public Input? InternalIpAddress { get; set; } + + [Input("password")] + private Input? _password; + public Input? Password + { + get => _password; + set + { + var emptySecret = Output.CreateSecret(0); + _password = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); + } + } + + [Input("port")] + public Input? Port { get; set; } + + [Input("username")] + public Input? Username { get; set; } + + public DatabaseNodesConnectionArgs() + { + } + public static new DatabaseNodesConnectionArgs Empty => new DatabaseNodesConnectionArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesConnectionGetArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesConnectionGetArgs.cs new file mode 100644 index 0000000..ed19a96 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesConnectionGetArgs.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesConnectionGetArgs : global::Pulumi.ResourceArgs + { + [Input("database")] + public Input? Database { get; set; } + + [Input("externalIpAddress")] + public Input? ExternalIpAddress { get; set; } + + [Input("host")] + public Input? Host { get; set; } + + [Input("internalHost")] + public Input? InternalHost { get; set; } + + [Input("internalIpAddress")] + public Input? InternalIpAddress { get; set; } + + [Input("password")] + private Input? _password; + public Input? Password + { + get => _password; + set + { + var emptySecret = Output.CreateSecret(0); + _password = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); + } + } + + [Input("port")] + public Input? Port { get; set; } + + [Input("username")] + public Input? Username { get; set; } + + public DatabaseNodesConnectionGetArgs() + { + } + public static new DatabaseNodesConnectionGetArgs Empty => new DatabaseNodesConnectionGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesExtensionsArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesExtensionsArgs.cs new file mode 100644 index 0000000..4bca93e --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesExtensionsArgs.cs @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesExtensionsArgs : global::Pulumi.ResourceArgs + { + [Input("errors")] + private InputMap? _errors; + public InputMap Errors + { + get => _errors ?? (_errors = new InputMap()); + set => _errors = value; + } + + [Input("installeds")] + private InputList? _installeds; + public InputList Installeds + { + get => _installeds ?? (_installeds = new InputList()); + set => _installeds = value; + } + + public DatabaseNodesExtensionsArgs() + { + } + public static new DatabaseNodesExtensionsArgs Empty => new DatabaseNodesExtensionsArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesExtensionsGetArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesExtensionsGetArgs.cs new file mode 100644 index 0000000..043b290 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesExtensionsGetArgs.cs @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesExtensionsGetArgs : global::Pulumi.ResourceArgs + { + [Input("errors")] + private InputMap? _errors; + public InputMap Errors + { + get => _errors ?? (_errors = new InputMap()); + set => _errors = value; + } + + [Input("installeds")] + private InputList? _installeds; + public InputList Installeds + { + get => _installeds ?? (_installeds = new InputList()); + set => _installeds = value; + } + + public DatabaseNodesExtensionsGetArgs() + { + } + public static new DatabaseNodesExtensionsGetArgs Empty => new DatabaseNodesExtensionsGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesGetArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesGetArgs.cs new file mode 100644 index 0000000..7dbc2a7 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesGetArgs.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesGetArgs : global::Pulumi.ResourceArgs + { + [Input("connection")] + public Input? Connection { get; set; } + + [Input("extensions")] + public Input? Extensions { get; set; } + + [Input("location")] + public Input? Location { get; set; } + + [Input("name", required: true)] + public Input Name { get; set; } = null!; + + [Input("region")] + public Input? Region { get; set; } + + public DatabaseNodesGetArgs() + { + } + public static new DatabaseNodesGetArgs Empty => new DatabaseNodesGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesLocationArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesLocationArgs.cs new file mode 100644 index 0000000..b37beaf --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesLocationArgs.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesLocationArgs : global::Pulumi.ResourceArgs + { + [Input("city")] + public Input? City { get; set; } + + [Input("code")] + public Input? Code { get; set; } + + [Input("country")] + public Input? Country { get; set; } + + [Input("latitude")] + public Input? Latitude { get; set; } + + [Input("longitude")] + public Input? Longitude { get; set; } + + [Input("metroCode")] + public Input? MetroCode { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("postalCode")] + public Input? PostalCode { get; set; } + + [Input("region")] + public Input? Region { get; set; } + + [Input("regionCode")] + public Input? RegionCode { get; set; } + + [Input("timezone")] + public Input? Timezone { get; set; } + + public DatabaseNodesLocationArgs() + { + } + public static new DatabaseNodesLocationArgs Empty => new DatabaseNodesLocationArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesLocationGetArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesLocationGetArgs.cs new file mode 100644 index 0000000..4ee7cb1 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesLocationGetArgs.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesLocationGetArgs : global::Pulumi.ResourceArgs + { + [Input("city")] + public Input? City { get; set; } + + [Input("code")] + public Input? Code { get; set; } + + [Input("country")] + public Input? Country { get; set; } + + [Input("latitude")] + public Input? Latitude { get; set; } + + [Input("longitude")] + public Input? Longitude { get; set; } + + [Input("metroCode")] + public Input? MetroCode { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("postalCode")] + public Input? PostalCode { get; set; } + + [Input("region")] + public Input? Region { get; set; } + + [Input("regionCode")] + public Input? RegionCode { get; set; } + + [Input("timezone")] + public Input? Timezone { get; set; } + + public DatabaseNodesLocationGetArgs() + { + } + public static new DatabaseNodesLocationGetArgs Empty => new DatabaseNodesLocationGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesRegionArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesRegionArgs.cs new file mode 100644 index 0000000..0bdddec --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesRegionArgs.cs @@ -0,0 +1,44 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesRegionArgs : global::Pulumi.ResourceArgs + { + [Input("active")] + public Input? Active { get; set; } + + [Input("availabilityZones")] + private InputList? _availabilityZones; + public InputList AvailabilityZones + { + get => _availabilityZones ?? (_availabilityZones = new InputList()); + set => _availabilityZones = value; + } + + [Input("cloud")] + public Input? Cloud { get; set; } + + [Input("code")] + public Input? Code { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("parent")] + public Input? Parent { get; set; } + + public DatabaseNodesRegionArgs() + { + } + public static new DatabaseNodesRegionArgs Empty => new DatabaseNodesRegionArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseNodesRegionGetArgs.cs b/sdk/dotnet/Inputs/DatabaseNodesRegionGetArgs.cs new file mode 100644 index 0000000..7c38d8d --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseNodesRegionGetArgs.cs @@ -0,0 +1,44 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseNodesRegionGetArgs : global::Pulumi.ResourceArgs + { + [Input("active")] + public Input? Active { get; set; } + + [Input("availabilityZones")] + private InputList? _availabilityZones; + public InputList AvailabilityZones + { + get => _availabilityZones ?? (_availabilityZones = new InputList()); + set => _availabilityZones = value; + } + + [Input("cloud")] + public Input? Cloud { get; set; } + + [Input("code")] + public Input? Code { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("parent")] + public Input? Parent { get; set; } + + public DatabaseNodesRegionGetArgs() + { + } + public static new DatabaseNodesRegionGetArgs Empty => new DatabaseNodesRegionGetArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseRoleArgs.cs b/sdk/dotnet/Inputs/DatabaseRoleArgs.cs new file mode 100644 index 0000000..e612a79 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseRoleArgs.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseRoleArgs : global::Pulumi.ResourceArgs + { + [Input("bypassRls")] + public Input? BypassRls { get; set; } + + [Input("connectionLimit")] + public Input? ConnectionLimit { get; set; } + + [Input("createDb")] + public Input? CreateDb { get; set; } + + [Input("createRole")] + public Input? CreateRole { get; set; } + + [Input("inherit")] + public Input? Inherit { get; set; } + + [Input("login")] + public Input? Login { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("replication")] + public Input? Replication { get; set; } + + [Input("superuser")] + public Input? Superuser { get; set; } + + public DatabaseRoleArgs() + { + } + public static new DatabaseRoleArgs Empty => new DatabaseRoleArgs(); + } +} diff --git a/sdk/dotnet/Inputs/DatabaseRoleGetArgs.cs b/sdk/dotnet/Inputs/DatabaseRoleGetArgs.cs new file mode 100644 index 0000000..f8ac6f2 --- /dev/null +++ b/sdk/dotnet/Inputs/DatabaseRoleGetArgs.cs @@ -0,0 +1,48 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Inputs +{ + + public sealed class DatabaseRoleGetArgs : global::Pulumi.ResourceArgs + { + [Input("bypassRls")] + public Input? BypassRls { get; set; } + + [Input("connectionLimit")] + public Input? ConnectionLimit { get; set; } + + [Input("createDb")] + public Input? CreateDb { get; set; } + + [Input("createRole")] + public Input? CreateRole { get; set; } + + [Input("inherit")] + public Input? Inherit { get; set; } + + [Input("login")] + public Input? Login { get; set; } + + [Input("name")] + public Input? Name { get; set; } + + [Input("replication")] + public Input? Replication { get; set; } + + [Input("superuser")] + public Input? Superuser { get; set; } + + public DatabaseRoleGetArgs() + { + } + public static new DatabaseRoleGetArgs Empty => new DatabaseRoleGetArgs(); + } +} diff --git a/sdk/dotnet/Outputs/ClusterFirewallRule.cs b/sdk/dotnet/Outputs/ClusterFirewallRule.cs new file mode 100644 index 0000000..3d2db51 --- /dev/null +++ b/sdk/dotnet/Outputs/ClusterFirewallRule.cs @@ -0,0 +1,34 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class ClusterFirewallRule + { + public readonly string Name; + public readonly int Port; + public readonly ImmutableArray Sources; + + [OutputConstructor] + private ClusterFirewallRule( + string name, + + int port, + + ImmutableArray sources) + { + Name = name; + Port = port; + Sources = sources; + } + } +} diff --git a/sdk/dotnet/Outputs/ClusterNetwork.cs b/sdk/dotnet/Outputs/ClusterNetwork.cs new file mode 100644 index 0000000..78af0b8 --- /dev/null +++ b/sdk/dotnet/Outputs/ClusterNetwork.cs @@ -0,0 +1,71 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class ClusterNetwork + { + /// + /// CIDR of the network + /// + public readonly string Cidr; + /// + /// Whether the network is external + /// + public readonly bool? External; + /// + /// External ID of the network + /// + public readonly string? ExternalId; + /// + /// Name of the network + /// + public readonly string? Name; + /// + /// List of private subnets + /// + public readonly ImmutableArray PrivateSubnets; + /// + /// List of public subnets + /// + public readonly ImmutableArray PublicSubnets; + /// + /// Region of the network + /// + public readonly string Region; + + [OutputConstructor] + private ClusterNetwork( + string cidr, + + bool? external, + + string? externalId, + + string? name, + + ImmutableArray privateSubnets, + + ImmutableArray publicSubnets, + + string region) + { + Cidr = cidr; + External = external; + ExternalId = externalId; + Name = name; + PrivateSubnets = privateSubnets; + PublicSubnets = publicSubnets; + Region = region; + } + } +} diff --git a/sdk/dotnet/Outputs/ClusterNode.cs b/sdk/dotnet/Outputs/ClusterNode.cs new file mode 100644 index 0000000..dbfe904 --- /dev/null +++ b/sdk/dotnet/Outputs/ClusterNode.cs @@ -0,0 +1,50 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class ClusterNode + { + public readonly string? AvailabilityZone; + public readonly string InstanceType; + public readonly string Name; + public readonly string Region; + public readonly int? VolumeIops; + public readonly int? VolumeSize; + public readonly string? VolumeType; + + [OutputConstructor] + private ClusterNode( + string? availabilityZone, + + string instanceType, + + string name, + + string region, + + int? volumeIops, + + int? volumeSize, + + string? volumeType) + { + AvailabilityZone = availabilityZone; + InstanceType = instanceType; + Name = name; + Region = region; + VolumeIops = volumeIops; + VolumeSize = volumeSize; + VolumeType = volumeType; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseBackups.cs b/sdk/dotnet/Outputs/DatabaseBackups.cs new file mode 100644 index 0000000..51839f1 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseBackups.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseBackups + { + /// + /// List of backup configurations. + /// + public readonly ImmutableArray Configs; + /// + /// The backup provider. + /// + public readonly string? Provider; + + [OutputConstructor] + private DatabaseBackups( + ImmutableArray configs, + + string? provider) + { + Configs = configs; + Provider = provider; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseBackupsConfig.cs b/sdk/dotnet/Outputs/DatabaseBackupsConfig.cs new file mode 100644 index 0000000..dc54d61 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseBackupsConfig.cs @@ -0,0 +1,50 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseBackupsConfig + { + /// + /// Unique identifier for the backup config. + /// + public readonly string? Id; + /// + /// Name of the node. + /// + public readonly string? NodeName; + /// + /// List of backup repositories. + /// + public readonly ImmutableArray Repositories; + /// + /// List of backup schedules. + /// + public readonly ImmutableArray Schedules; + + [OutputConstructor] + private DatabaseBackupsConfig( + string? id, + + string? nodeName, + + ImmutableArray repositories, + + ImmutableArray schedules) + { + Id = id; + NodeName = nodeName; + Repositories = repositories; + Schedules = schedules; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseBackupsConfigRepository.cs b/sdk/dotnet/Outputs/DatabaseBackupsConfigRepository.cs new file mode 100644 index 0000000..054f156 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseBackupsConfigRepository.cs @@ -0,0 +1,120 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseBackupsConfigRepository + { + /// + /// Azure account for azure-type repositories. + /// + public readonly string? AzureAccount; + /// + /// Azure container for azure-type repositories. + /// + public readonly string? AzureContainer; + /// + /// Azure endpoint for azure-type repositories. + /// + public readonly string? AzureEndpoint; + /// + /// ID of the backup store to use. If specified, other fields will be automatically populated. + /// + public readonly string? BackupStoreId; + /// + /// Base path for the repository. + /// + public readonly string? BasePath; + /// + /// GCS bucket name for gcs-type repositories. + /// + public readonly string? GcsBucket; + /// + /// GCS endpoint for gcs-type repositories. + /// + public readonly string? GcsEndpoint; + /// + /// Unique identifier for the backup config. + /// + public readonly string? Id; + /// + /// Retention period for full backups. + /// + public readonly int? RetentionFull; + /// + /// Type of retention for full backups. + /// + public readonly string? RetentionFullType; + /// + /// S3 bucket name for s3-type repositories. + /// + public readonly string? S3Bucket; + /// + /// S3 endpoint for s3-type repositories. + /// + public readonly string? S3Endpoint; + /// + /// S3 region for s3-type repositories. + /// + public readonly string? S3Region; + /// + /// Repository type (e.g., s3, gcs, azure). + /// + public readonly string? Type; + + [OutputConstructor] + private DatabaseBackupsConfigRepository( + string? azureAccount, + + string? azureContainer, + + string? azureEndpoint, + + string? backupStoreId, + + string? basePath, + + string? gcsBucket, + + string? gcsEndpoint, + + string? id, + + int? retentionFull, + + string? retentionFullType, + + string? s3Bucket, + + string? s3Endpoint, + + string? s3Region, + + string? type) + { + AzureAccount = azureAccount; + AzureContainer = azureContainer; + AzureEndpoint = azureEndpoint; + BackupStoreId = backupStoreId; + BasePath = basePath; + GcsBucket = gcsBucket; + GcsEndpoint = gcsEndpoint; + Id = id; + RetentionFull = retentionFull; + RetentionFullType = retentionFullType; + S3Bucket = s3Bucket; + S3Endpoint = s3Endpoint; + S3Region = s3Region; + Type = type; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseBackupsConfigSchedule.cs b/sdk/dotnet/Outputs/DatabaseBackupsConfigSchedule.cs new file mode 100644 index 0000000..3510d4b --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseBackupsConfigSchedule.cs @@ -0,0 +1,43 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseBackupsConfigSchedule + { + /// + /// Cron expression for the schedule. + /// + public readonly string CronExpression; + /// + /// Unique identifier for the backup config. + /// + public readonly string Id; + /// + /// Repository type (e.g., s3, gcs, azure). + /// + public readonly string Type; + + [OutputConstructor] + private DatabaseBackupsConfigSchedule( + string cronExpression, + + string id, + + string type) + { + CronExpression = cronExpression; + Id = id; + Type = type; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseComponent.cs b/sdk/dotnet/Outputs/DatabaseComponent.cs new file mode 100644 index 0000000..3eb8f72 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseComponent.cs @@ -0,0 +1,42 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseComponent + { + public readonly string? Id; + public readonly string? Name; + public readonly string? ReleaseDate; + public readonly string? Status; + public readonly string? Version; + + [OutputConstructor] + private DatabaseComponent( + string? id, + + string? name, + + string? releaseDate, + + string? status, + + string? version) + { + Id = id; + Name = name; + ReleaseDate = releaseDate; + Status = status; + Version = version; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseExtensions.cs b/sdk/dotnet/Outputs/DatabaseExtensions.cs new file mode 100644 index 0000000..e231f57 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseExtensions.cs @@ -0,0 +1,34 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseExtensions + { + public readonly bool? AutoManage; + public readonly ImmutableArray Availables; + public readonly ImmutableArray Requesteds; + + [OutputConstructor] + private DatabaseExtensions( + bool? autoManage, + + ImmutableArray availables, + + ImmutableArray requesteds) + { + AutoManage = autoManage; + Availables = availables; + Requesteds = requesteds; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseNodes.cs b/sdk/dotnet/Outputs/DatabaseNodes.cs new file mode 100644 index 0000000..61851fc --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseNodes.cs @@ -0,0 +1,42 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseNodes + { + public readonly Outputs.DatabaseNodesConnection? Connection; + public readonly Outputs.DatabaseNodesExtensions? Extensions; + public readonly Outputs.DatabaseNodesLocation? Location; + public readonly string Name; + public readonly Outputs.DatabaseNodesRegion? Region; + + [OutputConstructor] + private DatabaseNodes( + Outputs.DatabaseNodesConnection? connection, + + Outputs.DatabaseNodesExtensions? extensions, + + Outputs.DatabaseNodesLocation? location, + + string name, + + Outputs.DatabaseNodesRegion? region) + { + Connection = connection; + Extensions = extensions; + Location = location; + Name = name; + Region = region; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseNodesConnection.cs b/sdk/dotnet/Outputs/DatabaseNodesConnection.cs new file mode 100644 index 0000000..87da531 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseNodesConnection.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseNodesConnection + { + public readonly string? Database; + public readonly string? ExternalIpAddress; + public readonly string? Host; + public readonly string? InternalHost; + public readonly string? InternalIpAddress; + public readonly string? Password; + public readonly int? Port; + public readonly string? Username; + + [OutputConstructor] + private DatabaseNodesConnection( + string? database, + + string? externalIpAddress, + + string? host, + + string? internalHost, + + string? internalIpAddress, + + string? password, + + int? port, + + string? username) + { + Database = database; + ExternalIpAddress = externalIpAddress; + Host = host; + InternalHost = internalHost; + InternalIpAddress = internalIpAddress; + Password = password; + Port = port; + Username = username; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseNodesExtensions.cs b/sdk/dotnet/Outputs/DatabaseNodesExtensions.cs new file mode 100644 index 0000000..dee2405 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseNodesExtensions.cs @@ -0,0 +1,30 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseNodesExtensions + { + public readonly ImmutableDictionary? Errors; + public readonly ImmutableArray Installeds; + + [OutputConstructor] + private DatabaseNodesExtensions( + ImmutableDictionary? errors, + + ImmutableArray installeds) + { + Errors = errors; + Installeds = installeds; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseNodesLocation.cs b/sdk/dotnet/Outputs/DatabaseNodesLocation.cs new file mode 100644 index 0000000..8113b0c --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseNodesLocation.cs @@ -0,0 +1,66 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseNodesLocation + { + public readonly string? City; + public readonly string? Code; + public readonly string? Country; + public readonly double? Latitude; + public readonly double? Longitude; + public readonly string? MetroCode; + public readonly string? Name; + public readonly string? PostalCode; + public readonly string? Region; + public readonly string? RegionCode; + public readonly string? Timezone; + + [OutputConstructor] + private DatabaseNodesLocation( + string? city, + + string? code, + + string? country, + + double? latitude, + + double? longitude, + + string? metroCode, + + string? name, + + string? postalCode, + + string? region, + + string? regionCode, + + string? timezone) + { + City = city; + Code = code; + Country = country; + Latitude = latitude; + Longitude = longitude; + MetroCode = metroCode; + Name = name; + PostalCode = postalCode; + Region = region; + RegionCode = regionCode; + Timezone = timezone; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseNodesRegion.cs b/sdk/dotnet/Outputs/DatabaseNodesRegion.cs new file mode 100644 index 0000000..6bc3884 --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseNodesRegion.cs @@ -0,0 +1,46 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseNodesRegion + { + public readonly bool? Active; + public readonly ImmutableArray AvailabilityZones; + public readonly string? Cloud; + public readonly string? Code; + public readonly string? Name; + public readonly string? Parent; + + [OutputConstructor] + private DatabaseNodesRegion( + bool? active, + + ImmutableArray availabilityZones, + + string? cloud, + + string? code, + + string? name, + + string? parent) + { + Active = active; + AvailabilityZones = availabilityZones; + Cloud = cloud; + Code = code; + Name = name; + Parent = parent; + } + } +} diff --git a/sdk/dotnet/Outputs/DatabaseRole.cs b/sdk/dotnet/Outputs/DatabaseRole.cs new file mode 100644 index 0000000..c8ae5ed --- /dev/null +++ b/sdk/dotnet/Outputs/DatabaseRole.cs @@ -0,0 +1,58 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class DatabaseRole + { + public readonly bool? BypassRls; + public readonly int? ConnectionLimit; + public readonly bool? CreateDb; + public readonly bool? CreateRole; + public readonly bool? Inherit; + public readonly bool? Login; + public readonly string? Name; + public readonly bool? Replication; + public readonly bool? Superuser; + + [OutputConstructor] + private DatabaseRole( + bool? bypassRls, + + int? connectionLimit, + + bool? createDb, + + bool? createRole, + + bool? inherit, + + bool? login, + + string? name, + + bool? replication, + + bool? superuser) + { + BypassRls = bypassRls; + ConnectionLimit = connectionLimit; + CreateDb = createDb; + CreateRole = createRole; + Inherit = inherit; + Login = login; + Name = name; + Replication = replication; + Superuser = superuser; + } + } +} diff --git a/sdk/dotnet/Outputs/GetBackupStoresBackupStoreResult.cs b/sdk/dotnet/Outputs/GetBackupStoresBackupStoreResult.cs new file mode 100644 index 0000000..e28cbd6 --- /dev/null +++ b/sdk/dotnet/Outputs/GetBackupStoresBackupStoreResult.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetBackupStoresBackupStoreResult + { + public readonly string CloudAccountId; + public readonly string CloudAccountType; + public readonly ImmutableArray ClusterIds; + public readonly string CreatedAt; + public readonly string Id; + public readonly string Name; + public readonly ImmutableDictionary Properties; + public readonly string Status; + + [OutputConstructor] + private GetBackupStoresBackupStoreResult( + string cloudAccountId, + + string cloudAccountType, + + ImmutableArray clusterIds, + + string createdAt, + + string id, + + string name, + + ImmutableDictionary properties, + + string status) + { + CloudAccountId = cloudAccountId; + CloudAccountType = cloudAccountType; + ClusterIds = clusterIds; + CreatedAt = createdAt; + Id = id; + Name = name; + Properties = properties; + Status = status; + } + } +} diff --git a/sdk/dotnet/Outputs/GetCloudAccountsCloudAccountResult.cs b/sdk/dotnet/Outputs/GetCloudAccountsCloudAccountResult.cs new file mode 100644 index 0000000..f907283 --- /dev/null +++ b/sdk/dotnet/Outputs/GetCloudAccountsCloudAccountResult.cs @@ -0,0 +1,64 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetCloudAccountsCloudAccountResult + { + /// + /// Creation time of the cloud account + /// + public readonly string CreatedAt; + /// + /// Description of the cloud account + /// + public readonly string Description; + /// + /// ID of the cloud account + /// + public readonly string Id; + /// + /// Name of the cloud account + /// + public readonly string Name; + /// + /// Additional properties of the cloud account + /// + public readonly ImmutableDictionary Properties; + /// + /// Type of the cloud account (e.g., AWS, Azure, GCP) + /// + public readonly string Type; + + [OutputConstructor] + private GetCloudAccountsCloudAccountResult( + string createdAt, + + string description, + + string id, + + string name, + + ImmutableDictionary properties, + + string type) + { + CreatedAt = createdAt; + Description = description; + Id = id; + Name = name; + Properties = properties; + Type = type; + } + } +} diff --git a/sdk/dotnet/Outputs/GetClustersClusterFirewallRuleResult.cs b/sdk/dotnet/Outputs/GetClustersClusterFirewallRuleResult.cs new file mode 100644 index 0000000..e1fb0e2 --- /dev/null +++ b/sdk/dotnet/Outputs/GetClustersClusterFirewallRuleResult.cs @@ -0,0 +1,43 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetClustersClusterFirewallRuleResult + { + /// + /// Name of the firewall rule + /// + public readonly string Name; + /// + /// Port for the firewall rule + /// + public readonly int Port; + /// + /// Sources for the firewall rule + /// + public readonly ImmutableArray Sources; + + [OutputConstructor] + private GetClustersClusterFirewallRuleResult( + string name, + + int port, + + ImmutableArray sources) + { + Name = name; + Port = port; + Sources = sources; + } + } +} diff --git a/sdk/dotnet/Outputs/GetClustersClusterNetworkResult.cs b/sdk/dotnet/Outputs/GetClustersClusterNetworkResult.cs new file mode 100644 index 0000000..9882c1c --- /dev/null +++ b/sdk/dotnet/Outputs/GetClustersClusterNetworkResult.cs @@ -0,0 +1,65 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetClustersClusterNetworkResult + { + /// + /// CIDR of the network + /// + public readonly string Cidr; + /// + /// Is the network external + /// + public readonly bool External; + /// + /// External ID of the network + /// + public readonly string ExternalId; + /// + /// Name of the firewall rule + /// + public readonly string Name; + public readonly ImmutableArray PrivateSubnets; + public readonly ImmutableArray PublicSubnets; + /// + /// Region of the network + /// + public readonly string Region; + + [OutputConstructor] + private GetClustersClusterNetworkResult( + string cidr, + + bool external, + + string externalId, + + string name, + + ImmutableArray privateSubnets, + + ImmutableArray publicSubnets, + + string region) + { + Cidr = cidr; + External = external; + ExternalId = externalId; + Name = name; + PrivateSubnets = privateSubnets; + PublicSubnets = publicSubnets; + Region = region; + } + } +} diff --git a/sdk/dotnet/Outputs/GetClustersClusterNodeResult.cs b/sdk/dotnet/Outputs/GetClustersClusterNodeResult.cs new file mode 100644 index 0000000..8d88dca --- /dev/null +++ b/sdk/dotnet/Outputs/GetClustersClusterNodeResult.cs @@ -0,0 +1,75 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetClustersClusterNodeResult + { + /// + /// Cloud provider availability zone name + /// + public readonly string AvailabilityZone; + /// + /// Instance type used for the node + /// + public readonly string InstanceType; + /// + /// Name of the firewall rule + /// + public readonly string Name; + public readonly ImmutableArray Options; + /// + /// Region of the network + /// + public readonly string Region; + /// + /// Volume IOPS of the node data volume + /// + public readonly int VolumeIops; + /// + /// Volume size of the node data volume + /// + public readonly int VolumeSize; + /// + /// Volume type of the node data volume + /// + public readonly string VolumeType; + + [OutputConstructor] + private GetClustersClusterNodeResult( + string availabilityZone, + + string instanceType, + + string name, + + ImmutableArray options, + + string region, + + int volumeIops, + + int volumeSize, + + string volumeType) + { + AvailabilityZone = availabilityZone; + InstanceType = instanceType; + Name = name; + Options = options; + Region = region; + VolumeIops = volumeIops; + VolumeSize = volumeSize; + VolumeType = volumeType; + } + } +} diff --git a/sdk/dotnet/Outputs/GetClustersClusterResult.cs b/sdk/dotnet/Outputs/GetClustersClusterResult.cs new file mode 100644 index 0000000..205fd70 --- /dev/null +++ b/sdk/dotnet/Outputs/GetClustersClusterResult.cs @@ -0,0 +1,108 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetClustersClusterResult + { + /// + /// Backup store IDs of the cluster + /// + public readonly ImmutableArray BackupStoreIds; + /// + /// Capacity of the cluster + /// + public readonly int Capacity; + /// + /// Cloud account ID of the cluster + /// + public readonly string CloudAccountId; + /// + /// Created at of the cluster + /// + public readonly string CreatedAt; + public readonly ImmutableArray FirewallRules; + /// + /// ID of the cluster + /// + public readonly string Id; + /// + /// Name of the cluster + /// + public readonly string Name; + public readonly ImmutableArray Networks; + /// + /// Node location of the cluster. Must be either 'public' or 'private'. + /// + public readonly string NodeLocation; + public readonly ImmutableArray Nodes; + public readonly ImmutableArray Regions; + /// + /// Resource tags of the cluster + /// + public readonly ImmutableDictionary ResourceTags; + /// + /// SSH key ID of the cluster + /// + public readonly string SshKeyId; + /// + /// Status of the cluster + /// + public readonly string Status; + + [OutputConstructor] + private GetClustersClusterResult( + ImmutableArray backupStoreIds, + + int capacity, + + string cloudAccountId, + + string createdAt, + + ImmutableArray firewallRules, + + string id, + + string name, + + ImmutableArray networks, + + string nodeLocation, + + ImmutableArray nodes, + + ImmutableArray regions, + + ImmutableDictionary resourceTags, + + string sshKeyId, + + string status) + { + BackupStoreIds = backupStoreIds; + Capacity = capacity; + CloudAccountId = cloudAccountId; + CreatedAt = createdAt; + FirewallRules = firewallRules; + Id = id; + Name = name; + Networks = networks; + NodeLocation = nodeLocation; + Nodes = nodes; + Regions = regions; + ResourceTags = resourceTags; + SshKeyId = sshKeyId; + Status = status; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigRepositoryResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigRepositoryResult.cs new file mode 100644 index 0000000..a4b7792 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigRepositoryResult.cs @@ -0,0 +1,81 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseBackupsConfigRepositoryResult + { + public readonly string AzureAccount; + public readonly string AzureContainer; + public readonly string AzureEndpoint; + public readonly string BackupStoreId; + public readonly string BasePath; + public readonly string GcsBucket; + public readonly string GcsEndpoint; + /// + /// Backup configuration ID + /// + public readonly string Id; + public readonly int RetentionFull; + public readonly string RetentionFullType; + public readonly string S3Bucket; + public readonly string S3Endpoint; + public readonly string S3Region; + public readonly string Type; + + [OutputConstructor] + private GetDatabasesDatabaseBackupsConfigRepositoryResult( + string azureAccount, + + string azureContainer, + + string azureEndpoint, + + string backupStoreId, + + string basePath, + + string gcsBucket, + + string gcsEndpoint, + + string id, + + int retentionFull, + + string retentionFullType, + + string s3Bucket, + + string s3Endpoint, + + string s3Region, + + string type) + { + AzureAccount = azureAccount; + AzureContainer = azureContainer; + AzureEndpoint = azureEndpoint; + BackupStoreId = backupStoreId; + BasePath = basePath; + GcsBucket = gcsBucket; + GcsEndpoint = gcsEndpoint; + Id = id; + RetentionFull = retentionFull; + RetentionFullType = retentionFullType; + S3Bucket = s3Bucket; + S3Endpoint = s3Endpoint; + S3Region = s3Region; + Type = type; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigResult.cs new file mode 100644 index 0000000..2d86f6b --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigResult.cs @@ -0,0 +1,50 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseBackupsConfigResult + { + /// + /// Backup configuration ID + /// + public readonly string Id; + /// + /// Node name + /// + public readonly string NodeName; + /// + /// Backup repositories + /// + public readonly ImmutableArray Repositories; + /// + /// Backup schedules + /// + public readonly ImmutableArray Schedules; + + [OutputConstructor] + private GetDatabasesDatabaseBackupsConfigResult( + string id, + + string nodeName, + + ImmutableArray repositories, + + ImmutableArray schedules) + { + Id = id; + NodeName = nodeName; + Repositories = repositories; + Schedules = schedules; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigScheduleResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigScheduleResult.cs new file mode 100644 index 0000000..6f27033 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsConfigScheduleResult.cs @@ -0,0 +1,37 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseBackupsConfigScheduleResult + { + public readonly string CronExpression; + /// + /// Backup configuration ID + /// + public readonly string Id; + public readonly string Type; + + [OutputConstructor] + private GetDatabasesDatabaseBackupsConfigScheduleResult( + string cronExpression, + + string id, + + string type) + { + CronExpression = cronExpression; + Id = id; + Type = type; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsResult.cs new file mode 100644 index 0000000..f60666d --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseBackupsResult.cs @@ -0,0 +1,36 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseBackupsResult + { + /// + /// Backup configurations + /// + public readonly ImmutableArray Configs; + /// + /// Backup provider + /// + public readonly string Provider; + + [OutputConstructor] + private GetDatabasesDatabaseBackupsResult( + ImmutableArray configs, + + string provider) + { + Configs = configs; + Provider = provider; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseComponentResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseComponentResult.cs new file mode 100644 index 0000000..4bba306 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseComponentResult.cs @@ -0,0 +1,57 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseComponentResult + { + /// + /// Backup configuration ID + /// + public readonly string Id; + /// + /// Component name + /// + public readonly string Name; + /// + /// Component release date + /// + public readonly string ReleaseDate; + /// + /// Component status + /// + public readonly string Status; + /// + /// Component version + /// + public readonly string Version; + + [OutputConstructor] + private GetDatabasesDatabaseComponentResult( + string id, + + string name, + + string releaseDate, + + string status, + + string version) + { + Id = id; + Name = name; + ReleaseDate = releaseDate; + Status = status; + Version = version; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseExtensionsResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseExtensionsResult.cs new file mode 100644 index 0000000..84289a3 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseExtensionsResult.cs @@ -0,0 +1,43 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseExtensionsResult + { + /// + /// Auto-manage extensions + /// + public readonly bool AutoManage; + /// + /// Available extensions + /// + public readonly ImmutableArray Availables; + /// + /// Requested extensions + /// + public readonly ImmutableArray Requesteds; + + [OutputConstructor] + private GetDatabasesDatabaseExtensionsResult( + bool autoManage, + + ImmutableArray availables, + + ImmutableArray requesteds) + { + AutoManage = autoManage; + Availables = availables; + Requesteds = requesteds; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesConnectionResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesConnectionResult.cs new file mode 100644 index 0000000..bd5d4aa --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesConnectionResult.cs @@ -0,0 +1,54 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseNodesConnectionResult + { + public readonly string Database; + public readonly string ExternalIpAddress; + public readonly string Host; + public readonly string InternalHost; + public readonly string InternalIpAddress; + public readonly string Password; + public readonly int Port; + public readonly string Username; + + [OutputConstructor] + private GetDatabasesDatabaseNodesConnectionResult( + string database, + + string externalIpAddress, + + string host, + + string internalHost, + + string internalIpAddress, + + string password, + + int port, + + string username) + { + Database = database; + ExternalIpAddress = externalIpAddress; + Host = host; + InternalHost = internalHost; + InternalIpAddress = internalIpAddress; + Password = password; + Port = port; + Username = username; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesExtensionsResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesExtensionsResult.cs new file mode 100644 index 0000000..9716d95 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesExtensionsResult.cs @@ -0,0 +1,30 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseNodesExtensionsResult + { + public readonly ImmutableDictionary Errors; + public readonly ImmutableArray Installeds; + + [OutputConstructor] + private GetDatabasesDatabaseNodesExtensionsResult( + ImmutableDictionary errors, + + ImmutableArray installeds) + { + Errors = errors; + Installeds = installeds; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesLocationResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesLocationResult.cs new file mode 100644 index 0000000..55ad576 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesLocationResult.cs @@ -0,0 +1,69 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseNodesLocationResult + { + public readonly string City; + public readonly string Code; + public readonly string Country; + public readonly double Latitude; + public readonly double Longitude; + public readonly string MetroCode; + /// + /// Component name + /// + public readonly string Name; + public readonly string PostalCode; + public readonly string Region; + public readonly string RegionCode; + public readonly string Timezone; + + [OutputConstructor] + private GetDatabasesDatabaseNodesLocationResult( + string city, + + string code, + + string country, + + double latitude, + + double longitude, + + string metroCode, + + string name, + + string postalCode, + + string region, + + string regionCode, + + string timezone) + { + City = city; + Code = code; + Country = country; + Latitude = latitude; + Longitude = longitude; + MetroCode = metroCode; + Name = name; + PostalCode = postalCode; + Region = region; + RegionCode = regionCode; + Timezone = timezone; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesRegionResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesRegionResult.cs new file mode 100644 index 0000000..ac947d4 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesRegionResult.cs @@ -0,0 +1,49 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseNodesRegionResult + { + public readonly bool Active; + public readonly ImmutableArray AvailabilityZones; + public readonly string Cloud; + public readonly string Code; + /// + /// Component name + /// + public readonly string Name; + public readonly string Parent; + + [OutputConstructor] + private GetDatabasesDatabaseNodesRegionResult( + bool active, + + ImmutableArray availabilityZones, + + string cloud, + + string code, + + string name, + + string parent) + { + Active = active; + AvailabilityZones = availabilityZones; + Cloud = cloud; + Code = code; + Name = name; + Parent = parent; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesResult.cs new file mode 100644 index 0000000..c4deaa2 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseNodesResult.cs @@ -0,0 +1,57 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseNodesResult + { + /// + /// Node connection details + /// + public readonly Outputs.GetDatabasesDatabaseNodesConnectionResult Connection; + /// + /// Extensions configuration for the database + /// + public readonly Outputs.GetDatabasesDatabaseNodesExtensionsResult Extensions; + /// + /// Node location + /// + public readonly Outputs.GetDatabasesDatabaseNodesLocationResult Location; + /// + /// Component name + /// + public readonly string Name; + /// + /// Node region + /// + public readonly Outputs.GetDatabasesDatabaseNodesRegionResult Region; + + [OutputConstructor] + private GetDatabasesDatabaseNodesResult( + Outputs.GetDatabasesDatabaseNodesConnectionResult connection, + + Outputs.GetDatabasesDatabaseNodesExtensionsResult extensions, + + Outputs.GetDatabasesDatabaseNodesLocationResult location, + + string name, + + Outputs.GetDatabasesDatabaseNodesRegionResult region) + { + Connection = connection; + Extensions = extensions; + Location = location; + Name = name; + Region = region; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseResult.cs new file mode 100644 index 0000000..97a08c3 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseResult.cs @@ -0,0 +1,120 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseResult + { + /// + /// Backup configuration for the database + /// + public readonly Outputs.GetDatabasesDatabaseBackupsResult Backups; + /// + /// ID of the cluster this database belongs to + /// + public readonly string ClusterId; + /// + /// Components of the database + /// + public readonly ImmutableArray Components; + /// + /// Configuration version of the database + /// + public readonly string ConfigVersion; + /// + /// Creation timestamp of the database + /// + public readonly string CreatedAt; + /// + /// Domain of the database + /// + public readonly string Domain; + /// + /// Extensions configuration for the database + /// + public readonly Outputs.GetDatabasesDatabaseExtensionsResult Extensions; + /// + /// ID of the database + /// + public readonly string Id; + /// + /// Name of the database + /// + public readonly string Name; + /// + /// Map of nodes in the database + /// + public readonly ImmutableDictionary Nodes; + /// + /// Options for the database + /// + public readonly ImmutableArray Options; + /// + /// PostgreSQL version of the database + /// + public readonly string PgVersion; + /// + /// Roles in the database + /// + public readonly ImmutableArray Roles; + /// + /// Status of the database + /// + public readonly string Status; + + [OutputConstructor] + private GetDatabasesDatabaseResult( + Outputs.GetDatabasesDatabaseBackupsResult backups, + + string clusterId, + + ImmutableArray components, + + string configVersion, + + string createdAt, + + string domain, + + Outputs.GetDatabasesDatabaseExtensionsResult extensions, + + string id, + + string name, + + ImmutableDictionary nodes, + + ImmutableArray options, + + string pgVersion, + + ImmutableArray roles, + + string status) + { + Backups = backups; + ClusterId = clusterId; + Components = components; + ConfigVersion = configVersion; + CreatedAt = createdAt; + Domain = domain; + Extensions = extensions; + Id = id; + Name = name; + Nodes = nodes; + Options = options; + PgVersion = pgVersion; + Roles = roles; + Status = status; + } + } +} diff --git a/sdk/dotnet/Outputs/GetDatabasesDatabaseRoleResult.cs b/sdk/dotnet/Outputs/GetDatabasesDatabaseRoleResult.cs new file mode 100644 index 0000000..997c817 --- /dev/null +++ b/sdk/dotnet/Outputs/GetDatabasesDatabaseRoleResult.cs @@ -0,0 +1,61 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetDatabasesDatabaseRoleResult + { + public readonly bool BypassRls; + public readonly int ConnectionLimit; + public readonly bool CreateDb; + public readonly bool CreateRole; + public readonly bool Inherit; + public readonly bool Login; + /// + /// Component name + /// + public readonly string Name; + public readonly bool Replication; + public readonly bool Superuser; + + [OutputConstructor] + private GetDatabasesDatabaseRoleResult( + bool bypassRls, + + int connectionLimit, + + bool createDb, + + bool createRole, + + bool inherit, + + bool login, + + string name, + + bool replication, + + bool superuser) + { + BypassRls = bypassRls; + ConnectionLimit = connectionLimit; + CreateDb = createDb; + CreateRole = createRole; + Inherit = inherit; + Login = login; + Name = name; + Replication = replication; + Superuser = superuser; + } + } +} diff --git a/sdk/dotnet/Outputs/GetSSHKeysSshKeyResult.cs b/sdk/dotnet/Outputs/GetSSHKeysSshKeyResult.cs new file mode 100644 index 0000000..ca669fb --- /dev/null +++ b/sdk/dotnet/Outputs/GetSSHKeysSshKeyResult.cs @@ -0,0 +1,50 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge.Outputs +{ + + [OutputType] + public sealed class GetSSHKeysSshKeyResult + { + /// + /// Creation time of the SSH key + /// + public readonly string CreatedAt; + /// + /// ID of the SSH key + /// + public readonly string Id; + /// + /// Name of the SSH key + /// + public readonly string Name; + /// + /// Public key + /// + public readonly string PublicKey; + + [OutputConstructor] + private GetSSHKeysSshKeyResult( + string createdAt, + + string id, + + string name, + + string publicKey) + { + CreatedAt = createdAt; + Id = id; + Name = name; + PublicKey = publicKey; + } + } +} diff --git a/sdk/dotnet/Pgedge.Pgedge.csproj b/sdk/dotnet/Pgedge.Pgedge.csproj new file mode 100644 index 0000000..d38966c --- /dev/null +++ b/sdk/dotnet/Pgedge.Pgedge.csproj @@ -0,0 +1,60 @@ + + + + true + pgEdge + pgEdge + A Pulumi package for creating and managing pgedge cloud resources. + Apache-2.0 + https://www.pgedge.com + https://github.com/pgEdge/pulumi-pgedge + logo.png + + net6.0 + enable + + + + true + 1701;1702;1591 + + + + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true + true + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + diff --git a/sdk/dotnet/Provider.cs b/sdk/dotnet/Provider.cs new file mode 100644 index 0000000..b5aa332 --- /dev/null +++ b/sdk/dotnet/Provider.cs @@ -0,0 +1,69 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + /// + /// The provider type for the pgedge package. By default, resources use package-wide configuration + /// settings, however an explicit `Provider` instance may be created and passed during resource + /// construction to achieve fine-grained programmatic control over provider settings. See the + /// [documentation](https://www.pulumi.com/docs/reference/programming-model/#providers) for more information. + /// + [PgedgeResourceType("pulumi:providers:pgedge")] + public partial class Provider : global::Pulumi.ProviderResource + { + /// + /// Base Url to use when connecting to the PgEdge service. + /// + [Output("baseUrl")] + public Output BaseUrl { get; private set; } = null!; + + + /// + /// Create a Provider resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public Provider(string name, ProviderArgs? args = null, CustomResourceOptions? options = null) + : base("pgedge", name, args ?? new ProviderArgs(), MakeResourceOptions(options, "")) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + } + + public sealed class ProviderArgs : global::Pulumi.ResourceArgs + { + /// + /// Base Url to use when connecting to the PgEdge service. + /// + [Input("baseUrl")] + public Input? BaseUrl { get; set; } + + public ProviderArgs() + { + BaseUrl = Utilities.GetEnv("PGEDGE_BASE_URL"); + } + public static new ProviderArgs Empty => new ProviderArgs(); + } +} diff --git a/sdk/dotnet/Pulumi.yaml b/sdk/dotnet/Pulumi.yaml new file mode 100644 index 0000000..e69de29 diff --git a/sdk/dotnet/README.md b/sdk/dotnet/README.md new file mode 100644 index 0000000..3176ab6 --- /dev/null +++ b/sdk/dotnet/README.md @@ -0,0 +1 @@ +A Pulumi package for creating and managing pgedge cloud resources. diff --git a/sdk/dotnet/SSHKey.cs b/sdk/dotnet/SSHKey.cs new file mode 100644 index 0000000..1c4c6b7 --- /dev/null +++ b/sdk/dotnet/SSHKey.cs @@ -0,0 +1,127 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Pulumi.Serialization; +using Pulumi; + +namespace Pgedge.Pgedge +{ + /// + /// Manages a pgEdge SSH key. + /// + [PgedgeResourceType("pgedge:index/sSHKey:SSHKey")] + public partial class SSHKey : global::Pulumi.CustomResource + { + /// + /// The timestamp when the SSH key was created. + /// + [Output("createdAt")] + public Output CreatedAt { get; private set; } = null!; + + /// + /// The name of the SSH key. + /// + [Output("name")] + public Output Name { get; private set; } = null!; + + /// + /// The public key. + /// + [Output("publicKey")] + public Output PublicKey { get; private set; } = null!; + + + /// + /// Create a SSHKey resource with the given unique name, arguments, and options. + /// + /// + /// The unique name of the resource + /// The arguments used to populate this resource's properties + /// A bag of options that control this resource's behavior + public SSHKey(string name, SSHKeyArgs args, CustomResourceOptions? options = null) + : base("pgedge:index/sSHKey:SSHKey", name, args ?? new SSHKeyArgs(), MakeResourceOptions(options, "")) + { + } + + private SSHKey(string name, Input id, SSHKeyState? state = null, CustomResourceOptions? options = null) + : base("pgedge:index/sSHKey:SSHKey", name, state, MakeResourceOptions(options, id)) + { + } + + private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id) + { + var defaultOptions = new CustomResourceOptions + { + Version = Utilities.Version, + PluginDownloadURL = "github://api.github.com/pgEdge/pulumi-pgedge", + }; + var merged = CustomResourceOptions.Merge(defaultOptions, options); + // Override the ID if one was specified for consistency with other language SDKs. + merged.Id = id ?? merged.Id; + return merged; + } + /// + /// Get an existing SSHKey resource's state with the given name, ID, and optional extra + /// properties used to qualify the lookup. + /// + /// + /// The unique name of the resulting resource. + /// The unique provider ID of the resource to lookup. + /// Any extra arguments used during the lookup. + /// A bag of options that control this resource's behavior + public static SSHKey Get(string name, Input id, SSHKeyState? state = null, CustomResourceOptions? options = null) + { + return new SSHKey(name, id, state, options); + } + } + + public sealed class SSHKeyArgs : global::Pulumi.ResourceArgs + { + /// + /// The name of the SSH key. + /// + [Input("name")] + public Input? Name { get; set; } + + /// + /// The public key. + /// + [Input("publicKey", required: true)] + public Input PublicKey { get; set; } = null!; + + public SSHKeyArgs() + { + } + public static new SSHKeyArgs Empty => new SSHKeyArgs(); + } + + public sealed class SSHKeyState : global::Pulumi.ResourceArgs + { + /// + /// The timestamp when the SSH key was created. + /// + [Input("createdAt")] + public Input? CreatedAt { get; set; } + + /// + /// The name of the SSH key. + /// + [Input("name")] + public Input? Name { get; set; } + + /// + /// The public key. + /// + [Input("publicKey")] + public Input? PublicKey { get; set; } + + public SSHKeyState() + { + } + public static new SSHKeyState Empty => new SSHKeyState(); + } +} diff --git a/sdk/dotnet/Utilities.cs b/sdk/dotnet/Utilities.cs new file mode 100644 index 0000000..a9ff6e8 --- /dev/null +++ b/sdk/dotnet/Utilities.cs @@ -0,0 +1,84 @@ +// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +// *** Do not edit by hand unless you're certain you know what you are doing! *** + +namespace Pgedge.Pgedge +{ + static class Utilities + { + public static string? GetEnv(params string[] names) + { + foreach (var n in names) + { + var value = global::System.Environment.GetEnvironmentVariable(n); + if (value != null) + { + return value; + } + } + return null; + } + + static string[] trueValues = { "1", "t", "T", "true", "TRUE", "True" }; + static string[] falseValues = { "0", "f", "F", "false", "FALSE", "False" }; + public static bool? GetEnvBoolean(params string[] names) + { + var s = GetEnv(names); + if (s != null) + { + if (global::System.Array.IndexOf(trueValues, s) != -1) + { + return true; + } + if (global::System.Array.IndexOf(falseValues, s) != -1) + { + return false; + } + } + return null; + } + + public static int? GetEnvInt32(params string[] names) => int.TryParse(GetEnv(names), out int v) ? (int?)v : null; + + public static double? GetEnvDouble(params string[] names) => double.TryParse(GetEnv(names), out double v) ? (double?)v : null; + + [global::System.Obsolete("Please use WithDefaults instead")] + public static global::Pulumi.InvokeOptions WithVersion(this global::Pulumi.InvokeOptions? options) + { + var dst = options ?? new global::Pulumi.InvokeOptions{}; + dst.Version = options?.Version ?? Version; + return dst; + } + + public static global::Pulumi.InvokeOptions WithDefaults(this global::Pulumi.InvokeOptions? src) + { + var dst = src ?? new global::Pulumi.InvokeOptions{}; + dst.Version = src?.Version ?? Version; + dst.PluginDownloadURL = src?.PluginDownloadURL ?? "github://api.github.com/pgEdge/pulumi-pgedge"; + return dst; + } + + private readonly static string version; + public static string Version => version; + + static Utilities() + { + var assembly = global::System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(Utilities)).Assembly; + using var stream = assembly.GetManifestResourceStream("Pgedge.Pgedge.version.txt"); + using var reader = new global::System.IO.StreamReader(stream ?? throw new global::System.NotSupportedException("Missing embedded version.txt file")); + version = reader.ReadToEnd().Trim(); + var parts = version.Split("\n"); + if (parts.Length == 2) + { + // The first part is the provider name. + version = parts[1].Trim(); + } + } + } + + internal sealed class PgedgeResourceTypeAttribute : global::Pulumi.ResourceTypeAttribute + { + public PgedgeResourceTypeAttribute(string type) : base(type, Utilities.Version) + { + } + } +} diff --git a/sdk/dotnet/logo.png b/sdk/dotnet/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1be4c88580e0595c26247c471b042559b4448e GIT binary patch literal 49135 zcmX6^1ymGYADso1MG+Q}P#Ou91_6a0>u{JMyn()d2t>3jlb9(3{}@d^Bjg z1pnMLQ+y>0T;qPev==7=Kxcux?2ETvbN}XvoZqfzms}~tb(raOuXI!tA3+5=p@&65vu)y|M-QFVe>ha1y|PPTLK?Fn~I z^w%vvw`$BRgZa~=z~$Vh|J^t4?jH`zZ#+A!Zx27}>?pL$Wxuf{R49HF_VrF7l5z&6 z^~4sjZmq8}I>c*$Ae%LlMY~F2uC9-?!@}P0J(*dtaHu{(U+=fs58Lde;xQ<8-qSHw zccKiu{{~Ts5L~+Bj^dc$d1|I)7^pJtcS3p*X+|Ax`v2dTVtb9&fmc->{`(%vsN2GA_9WZ|+Qc4@W?$1;Zw7Go|L(AgFa1;5dy5F zUY;3kq$%{yxYF^dxUnv}?etx{zoGo-fSsbPMC2Qt&d(K(YO-{b>{@pHv92+x>sI%x z{L%Ra*uKnbfoSXqmE+as?>CS99$#*v8)_@IXV;?6w7zRuhH&Z47tB>PQoX)DJ<9lp zI?|uh8pvoZqO*0p?!3^jpbjVcsB^tsd|r|L2mKZ$Y_9?DeU0jWczZLWpmKFW|De@8 zi2$w?8(HZge;t!E#Gjok0ZD*gIcW;9D_(OJ1{Sp~S%Y7#+voF!=rx+!?s)$==BUYY zL*Lb?(w5ipx!z1|QM1;ChsrZyNtB3lkm^5B+D_ODohG71Sp8-lm+!G#qB?kS@(qNm{0TF5CGOz*k??Tos@w z=ep+MKD;Jgv|T&?V07!k0=HdW2rt7MP>Htj%CmOcem2E$L03D?kX-}atvw2}FJq(p zM#PWC;2KJ%}-e0+G}i-TvY|P(@58N2fVrJr4ROrzqxWjH%);6tf2CIB9{w;Ogpev zMtBG1ih+-?pW~rJAliE4H+NX>LBF<7Ik$snAdBuQt!vP05{d~PqXHz=n#KJpMQfth z*A;~hm%g!Eq6L!p7c9KQHeDc^5TrX$YLp<}Iv=taXh38qy&v_k{Be!m2?rayZ>?zPlQ!!&= z@G$xT7@7dg8%az(5eBIgH-BXw5DczYg!4?(C`>gbUSC69``Drg^Sgan>z(x7x`621 z5{!Nt*M+~iO~~1uSaCgsUVN@qxM>>igU4+oI-*pH#bwc`idL%CbRGq?emx!iLy2Y{ z6->_i*Jutp^+zuQP$Y(m9d7D@V|#xj*V*Gt)1*`zPL3BGmCv7I4!mqQ>Kh8Z4QQ9* ze(t{J%T<>Zi!N-A@Sh7Rig!<`WqNr)!eh_;wLhQfO{A`*0 z3I&%GRNhRG7@k%CrNi!@nQJ9}@)oP;hJlxXm_L=@WDVoJ>hWs|ucuP!dMqa$FJX4<7%)#Gk^tESzFoPZ~X z98t4fynJ5bSUlG8FD&Y1-)DnO>t#VBe}V_RVjL8L*<#Az%MLctqR>+%4~9;K99c0; zA6Iacp6dAc29{j?k=!Lm^5zLM=sfS2KX%|jHf4J)e#t0b0(iXSer5GehM7{o?8k<~ zTVnpooY2;2uckPfMSyVVV>nq6LxHfu-ZM#C%)FdFGVUmaJI%h)t4{6kW^V&_XlTma z+AHlcQE22M3UNf$*L0j4om;)qY5h+p2a74b9!!h`7k)gsxubE9{2|mcQRAn|-dcG5 z_y(J%pTjvz4l(gVBQlPG0Bt zbERkGdn&x|EG%oeFf<%Mc(H1a@)P%**iU3ioS`RZ6wF9Ys^sNuix1WUS`jS~4yVNA z&A*(UUHM{qy)i!!^73;=-M64Ih2GPu`SaVTj%$G@H_n%7mo7%XbWRmmRNB3dJN&Ik zp}b*;fOGM|Q$)SXK&e?O2c~qzqo%NVT8#%$I*$%fcIns7=v zDG4Kxl{R*)J*u7UyBpqy)OUi@%JOaZ8Q;qCuFaRfhUb~v`E9-GT#FpwB^C(wZbXdB zmOvhgzHxF)S(?Lf38uj>hmBa^?9+C`f?van?@c>Fev!HGW>3uXl;dN8HVssVc}d!J z$M^4g$D_i>6T-(hY!$n6Kio7tjdbKl`A;t+(+I$0|6Nr}RGUgqb^B*ik%G3^eyC|$ z-Ydj&$5!}Ziy*7J`*Lv37FH@D?Q{O-udg=O%7KzInejq;A88Jne8hSdb@UBp4#N?L zi;%oOs$!49={tn|*hx>0DlhZJuyUBBi+lR(hGOrj*H9uqF7|lfcK=WXJ7@-#l?6{m z9WG>3z)v)?*)8L;&JTqdC%CL!v)1R9ciJlKIhe@I*j{`*#H%zLe{l2DU%ZRs%FF)! zx$Vmo_>`D`nsXL)>?OL_uH3Bm#ufWqeTnd|)QJUtNo(|g8k?@nt|@Ds?^E z=C3hGK3ln8-Ci$TX!ERl`}hI1WAd3ik<_G9x2 zGFDM!pO#$y^Q9B>T?sq29xs&cM4LZ@JoLuVpk%ZQ7gfX~seo;e;JA>&x$~tCqbqZw zY_nGJ9d>1Iw=RFaop)cp36vG*z{TjVp%~R?$UucK=Z1L~pzN!-lA&zF8T&^H^{W2mYNPl%#6YXb?OpGBq@H6>$ za;#mhe|OzdUjEzyRf84~J@ zz;7DarqsXU-3F(#ID6c?q0pn&f0|?Ntbz?GyW_ezg!<#__b>wkVZb{#tU0lM5;dF;Frqe*w80pVr&pgDS9skmT*~bCIvqg z)BcJ6RgAepRt~ML=zfezjkpKoG%Ge3qOQ~fkx3!pe>!uMO*fJ?exRS8*Ob0G>%a1s z86X$CydVB)^k0)(C$CW4E<}1N4PSG+MK|0IH8mFBt<+^D0qHtP*5TgoM9Cqks zW}MD_JKDbP%!;Xn^97cl{z_3qC2^hB3JzQiqM;!8+q-PEURx?;6vZz>y4TA@-_u;N z+xJ+9i%xW(uMVwc4NTtAjvxcRHkN&X+kIId?XT-Udu2g?aCa~D?)K{Gv<6sUkQNEk zol^vA@Dl%-@vf@ae)a)Bv>1e*1?_SgWt-_go$EG(#HW-JRT)jYK-&gL!HCXv6{{_( zYcZZ-KUV7CoSjW@*$)1rdOls>PT$r1tk74jY87whH=i*3^v{EGE{f6g$;m@)A`+lu z|6NoE`%CldrYlc;ckZmT3ilh}Q#$i+Z%!<=%{}d%zliPTjhSKZfFBhL^fkGJ5(nwa z=gzmi(VfZq{reJ79oo&L)|kl^W^j0;^7_p&*#qFh6j#VgAq%*Ym0yMMtvStycdDyl zPxa@Hw%RJKsr&8f3(IPAoFTk0o0+lErb974nZSa|gYtWVbjP%dMqa>`yJyTqyT;75 z2)8=G^Sv?W&f1qw8IrTHNqv^UL{^KVb{sf%ZX1$cr{ueaN&g7Ec4$AKU2}Q}Vy7UE z=ZWqCJ%=XCv5C8qarN$!{fSS#ULk0%R?F7xG5VU!ctHlQb5DqyzdjvoLXobNa$+?x zQLXs>GwPq%qaRXKj(TRuduF>}`@+Nb2^rSb$17rY!r!g60UpdW2Q z+~X%Od@Izomk=;^_!bB*B`@`@S|TxrRlbQ2>WVI5NGJjDZDn;RrQ$=59S;9x#MhiM z(oO%(t4|r^ypuQ*y?SY$#+%#JcyuoqKS)yLn{kel1daKY(O9A|FScl|m-TT&gK!HQ)#PdzpM0-cyJ;JwFy~|dfGNQ3P{t4b{%Wc! z=n$t3xhm>wnRXTZdDOl-zn!})%+wRQ+dD&_$;Ta+1~A6=>>JHI<@jS~7dSNO?MD8! z_BzokTWthaA99{SLi24(&o<@hiqFIeRL5tl(nFQc_VDH7+YDN0#nfQRPhZWa69x>F2bzE_LwKK8c_=$I^0N&AzNJktm~b zoa0Y3i;8K^jLP1rGd!ie77x_mSBi*nBYe69NL8`1m1gNbq1h~O756gpg=YsSly!W( zAra&Z64}sw^NlmC6tW*GH@e0G>l%u@hllV|=+~&gn{^>v;cH^>$qA=IHQ2><%>9$;R~+{^ zk3Tm&zQum!KFy>-x+hWdT~@q@09o-CS`5VlzB#Jz&!{nQ7o&H^JtPofXpd!X%57j5 zUq5;DJO0((w{1nS?~cVbj?-JOrTO?`h^?zzu!Vet5de^94nndjVuIT`sEPlZ#7?H( zP84T_9fJMk_h35UCNI;Ad3K}W)7Gn;uM?-t9QzLJL>|bm0siv-n}jKG?|+i_3|jOO z{@QXSq4CkVz=z6d^p&8i9JxQ|xaaMTEbtgHHGm4xY6Mak9rhd`c2Jf#oDb@x7W9C@jYhc=Qtou3%qm!WrzKj^{vgRN}JHrzazu^ z#sP|`4#VfsK|^NL45}`!GfwO*Z(S+qf@)X|2U=S4I|OBTs=0z|i;9dLB<8-Xw0Z%% zImPuO#e_cF3fi+=LzLXG)vrxYkv>-OdH$@8eY_G`pt_#tT!Sobif$Ap?%?~sHfnh3 zdM;$CIMPG(fbg~xu-mbf0jIj@bFZwyO+J9}C4_Q|>QjBHsn==nsR#l8RYC%G+| zFi4;DyJ*4Ayo2pLUBvo6x8eCRyTItWu04Lx&Io8`r3Acx{-gexv>KL(X@w&23x-7r*kP6-Tn)zt0&_jsuLO znZq>YH+`(wGvY5D^~yTp{~opL-tVW;-)YIsF}-;o6KX~I2jKNdO#C^9Bb4}@cChqT zbO}Z3KEn@c`weR7Z9cb4k1y-TDP<}AW~g}m9ndI63wtOP&ruiUre|8V4KdRKZN3}+ z6+Z-9JFOj~)_MZHK;@{f$65F8CXn8dEjh=#nEnW(JP^RzA-K)ja2c4K-5?O`W1e=M z-o7@L+F!GK6JW^lFdAmQ zKjWpvIr_k@{g0sgaNfJvH4lY2qI2B@^Nx{x8osxkvpoq~C`yA>gFHeOc(7^>i(| zoI-161MeG`uEx7o?ge_6I5~cR;A1LBrYoVI;w#jaWKODOhmsEAbTIAGGQG^Y^hO*} zZqxoWT+ZAaw`G2Ia1D(|GlrM{ht{^YC z;_>%|l7*+`Ka#8aC=DW`@P_YG{stDeWOkAyy=Wv89)&e}s==M3`uKrCR7zRV!H4Oe zBDn!)@v8e~M*rC-8$Vl$56oRdLoeK7Dwxt+tq%epMw;uO+xwcvqjF8I8=>_horOH5qWw(=N^iy#liig$dm$z(Rt1|reTf^s zesuf7l@vRLf%`QWyy$m8!bd|y+$w%$W1-zRJ(BlXgjGwRqSHSL)i$&e9sdgfoQs)_ zV-jk@pruw}EsRl$-RG(-*K>{)r_PV3B8>gJj&>f^K64l=pR!IGISf3h;{6lWtbOdR!4F_3@$! zJ&rn~T-Q;V?+bna;923?9X0O9(aFlsrA55NGRj=#o5*Cr27p>@%s;En!au+GIENrz z<`Wb-!tkkKmgV!-?(HQ4LG4+H6rl9_jcDQ~sL{SO9!p>&TiMy{3`1Roh`y^bC zjZ0p=)WRx#a1QSi0lci#T^a@Ix_mUNm;xss>^ZlwKcgiD@XYKqT{lcNoiIP$@I+2P zCAx#Es_j&K!C#jq>p$=ebBFx48$dnxoAYvN5N`)fw=>+c$9zvPSMmCnt^t0~wOEd0 zGyg37-~8E_b;KXWj_xXOVdDx&!S4iaLUfgzCLc%unOv<-W~3jV4s%DY69%cOGI3Pb zbrZPu)-Xpuoqg{2KF&FZm&8cbQn$+a89jN;caeaL^>~)@<~S1I=3b4LUORPfYOvr+ zr^r^v;562P4YdvFGEP~6=90oG(N*xBhfyKd&TTV4xjsHp?BBs=AWDOAwTt~4lZ>jx zhf3jDnX74so|_>qRcOhbWb@Clouc*1l&U(#d|6rumq|#QD}O5!z%+D84e~|z5hThSM5zUsB=ecFIPh%pHSWQ1ey=ez5G>^x;LPi z37zgJf3?xlJwidqtco1I`oQG*30htqMYl_0k<+;Xi$gniaCDIXvALLunH@|4q*^b#D7==lcQA zvP}qEr>w2hg)f!to8=XFF(ft|<{WpTUrFZ4HX>^Fd|(-bO*^pTH)XPkrOSYe_d31H z_-{A1;OaVsr2A97Q|=cI_MEr9fV6}H7rA>nRj@tDwvO%lVOxqA<+~tm?Z!QRe3k<; z+7X1bxXST*71TKr%ffDzPbw}saf?xID8@@Dc?w=1K?vKXSDbv_yYt64;`oCc#hl6l z71HwnSmbiD{g-)Dzu1Y}sf@`-2Bo2!!f~!NpID-9HA}wbftC=F-?CsLWy~7={?jm? z6LtnY$`jYOXnporcV-x*@|R9>FGlxXkai1rjInyjpc~%$qfv85sihiLIuGgFYIDQH z020LQosjL9yLA4@e=^~UIIwfWY3U=Hxa)wL!?S$aC9!WbXKd_t^EfN!-jhFjoJgv% z+AoB#xc+|4NWys{S~ubSoxg^P`xVBuAk2+>+l|jz+#);l!=8JDdTS?C3TU96y2KAzoVTnx9wD7qcvJ|lJL6*+sb#+1ZEMJzdoO- zFblVhj6OAmAGsPR?4@uNqk%U*Is`vOa5jwx4qN!@EK&6mzp z?b6N>`uNEDXCN(jE6zwb)f}EvS}Hz%PtzfkB-F6tcZQKvuN#TCvfik!?;?betXb1k zM`$C-=B`+B+&Uj=KkHkj1;maGY}#$Wq31R`6*L3P^?_u)$q z3%#A=RAUhmihJx?~~p5&BW7GzPTM+zP9lkpbqxBk?mgN?w9rB^5ggK z_KhF=#l?FTy;Ns9(hzsPMhbc=)AX1zNJTsVSv!&`Ffu6R&o?hPmXxjJT&DuRtE)G0 zm=5R3hg7a>-<$1Vv0_U9obTF!+t@>Q61{8dsy^M240>~55K@wkaQA?fLPo0j9Gj6cP)N?cx2>Q&zz z`SzabvH{1g|3JNh3m1SFB_ACKV821jbbC9W^ebq3359SS0n&Uc+8mrSM5~LnFHN`7 zKRLE_=hFcJf5~jh+d-@B+w>vWMam_wJ?R)-RqlS1Yr|__O9<$CJ=L6KcdTSz2@&{9 zS5HdAQ|n9^bfwbhWGpg^Fq+d+Zp)Wc>vJFYlROZpav44=_NlOQY?(o7Fw`#!!K2{U zqexA7nCCUtlD>xJ{0&)b6-pAcA=IB?p8?DKyZT#vLCH7Zoz^(N=$>`5i*N&2)u8nZbhfG(VoD`bOmwGYTooQD8_Q{R#6Y``)!t<%*6*N z6MgKmpP9Q21*JaO{sX=hhfu#qYC49uT{(+&yYRc3JZMn;#PE(l4a@7GcYP*cHG%8{ z_c4v_vq5Xkyu+tt0OPE(vL^X{-dVVjDFqc>iU#K*WYJE)JVS#}A3ZRuw{1}_4n2eA zzH2%^`gnJWTN;q!%}l9!FH3QYq+7TlBtX9Ekb`m$c(ZDhVRz|P;(m2&5A`mXLMA=e zq2(UC+w}*2lI~yDHYf!s0JVxQw4qxz^$hh()A{6dE_&M=SaLLI8=^4w_4uLj{i`O| zuihtOx6U4>4C4$KwSgBxG{bhS5fI=-Yva|X#wO7zZ#^f{=X0M}kaLp^>geJN&lU*0 zP)#peqmt4eDQ6?e0aH%`@o4Zeb~tnPjooE&-H0}krq{-IrOC!i zuu1>ch1Woy-7WsUYY-y<^TSzAYPUZ4t`PYI(@V`}fUW)ew(XrQZSsuje6*?&FFKLG zuYg8Qthda3KFckDzMPASN7ZTd)*=R^ksK2u_-RQ*phR>j$Kc?Mxbl~bG->?_u zdO8p6CJ_9+M}BH-Dpah)+NLT@V;d4$nEE7R9~?Bm5r6Hc5H%+M#f;zux?cO4&eAj@S&o&>%(|H>K(rVdk3;vW-M0L z52~?u+KH_@3(s#X15!23k}p=HI2(+Z4EPwsrW$!s(%`6Sjt$Va1yom|c-vuV^P zy{|RTtqN$WYe2JTV>?<~MB^#LRgcN$wdVodW~7=|j{@i%%J;|Rs!c&MDu-^;)B;jt zl7uaEh%GCyH`VtNy$x}3~O=ah;IGqfz@6N0?`3L-rs;dsuY}^`0>OsKmc;f33Oe) zMh+cKw&mONlivYW);_T$3n(xhz_NESkB{XVi?`#{>UIfXpBIGO#Q1awS)iZ^X;zoA zv$o_uK2<4_1ZS|a$ypTx-B=Y|c?vG2{cN!dH`4a46+@gm`~{TUABoHQM7njC$rpsw z8e|;MiVo*q^a{%X-oQQ|w-zSuQH`^U_{By#9x9dd0uq{Gc?wqzxBWoHk#W$=?q~YB zc~b^~_i6cPy!RJ^;UPURh~Yj>_D;Fo%Zg{J7I%0rIuOXSQ2#v5_m=eEM56L2 z`k}w?oos=}P7EU|{&pk~NKoqvWbfQNZ1fb&h~Pm0#-ui$tdmI-aTrc>fsNyCatVRW zgi>oUv8Z;tv4oxjNJ zWxFsnw~@i8*bc*S?n4%UV50rK!tsXRrsXnOU0YpMO}OY^2!Xgw@%S6V8uU-`lpmp; z_T{#th5fHYL>oZ-BnXnqG3YD{O59|^a%}E%u}4CHZ`}Pq57+bNOnkz>y?EE{mW;tr zvb8UEfayDG_UqGKTV2qtDaD6{MFZf=2* zcgZQ*wQ~JPyXpG#bKD>o$z5)^g5U6C=S8|;EXi4Z2G-nMWQksC*ZZ02Uzy#b`;xRW z2Fx(rCVT7#-W{VWhsZ9;Hx<)AQewc1?}=L@U?JNMt|=x2Lhz%)@xgBE{v3BVUXUc$ zppXI6O|n}lYkD2b!~j92u%LtfN83=%8;!YSDbP@PdA(y?dH&d))Ji_*6z@GKC_!QH ztXHNtE0j@sCDeE3Ur)bcFC@rh-$hO%hw$U#VS3l6pgPz%@<4inoO;u*>|vB>oGl`Xzf4 z2-L~4Ym+@-N~%-`OER#B(HD6Xxgnvdx3otb67og1i?mmxk-q5ndAi|QiUl)%Q1$5R znZu~sKg=hv4KTVe2D=3WzliC-YR%I#mFw7I;fs{Y1Y4!;#Z9l?>_|SF&9BP&0W2z# z(pFGDTp04)hsJLmg=q~mJiQc@h6MfI0%MpAWfVA_NtT!pqI%B~4w_Vw^lJs2{rmcIAcRa2`qpowknH2-G z7lB2NXqOWe`lZMDT^^rx07h#Xh0Q~7fG7e^74dp7(#?{Y;#v~>CVx&26nkNq`ws?e z_edPONtSHE)?lMSQ!Si;C#=?q%D^n!9rS=fA+BgDdH#_e0X(XP0f# zi|5`zUBfHX>EAb_HK64e?L~k_4%-W*%y^K~18tbR0$b~(=Ek%j{EkhG5>})ee86p` z@J_L}0&NE4Z(lrhpuEdE{4u=7r9THr=x0N@=`!T ztg>Y+h-^##=IaLeWGyoK)=>u3rXbL$*0n-i zkY{ChrMD^9q3e@i+y;7@7Eg|N7zqRHs|oSUEjtbsrSYV`#71kkh}nD;lyjf&Wp1ug zVZ+Adv3`OirHC5QpPU}Z&AkdWpp04C{GX>*)oSSLla_8 zljY#m(7V9Hc_W6>n!0xSUA#T(@8ZXx&G`bt_y(>eSWGfS;;Uq+2$dxu$2{+wM;s|L z-N&jj@ENfx05QG!_V5{eBeWw!@v@sQ0I98Qcp?5)^dH6CwE`nEs9kIjlsJY=h(0Z~ z(IZsDGihckEXh{8l@|}-xA`#|eb{1AgD}GWdzk?OPEFTdE_EqVvOj*kUC^O&;ge*_ zo0CfesN?wZBk*oJtwM~m9Rp_vF-O3KqkPqFI{PIr*xLE{OqSQNDex7#R-(Yn=xi+lzFK;O_FAruPi+FyU>3AH)DE!@WT)0HcCIa_DLz#l7u&-!hnaHs3-RS}!ssO|TWq3Z!t{*klIOBJ*^d74qNJq`&oPTbsgX@v`RbdpuM;aWYMXB@bfCO3t zil23&J3t3qW2VCe9D=j)V6r7JNg8kAN9FwS24sc*CE#1hWVCoKg6VxXA#NI%Yu*+H~ zRanb=f((rIkTApYEI@}?NbhTl_&c)zFkkp!9Pf+du&W4oW9955G(0d6r%lauL&g&0 zV5F;U3IOxZw$i#l*i$}9_F?DjcaUBG_@Z|Oc7F|I$r)9VPi%SQCCftz0VjQJb*H_8 zhXqY(y$sT$BgE!TF_o)hUm{L*!5Bv9?Vz3LN1$(}6x7BwTI+l)22|_otM81zFd>V| zKt@W2=7UkV2O-RB))s$#h^T<34ENVFGLInpO)teJm-7hR8TKGunfXy08Df|Su&X9Y zBpJG5>IM2BM&|4HehplJx%Ln*i1Q?_?K6nCbSsa5;G^aZI8P)gu+X5VhFX(2<`X1j67A3*T}(y^N~|AinGOMqu^}9)iR?8zB)| z2MVH0OFAqrq>6Vl$ig6Ng02uYYeq_-|AWd!lMdL?{p2LNB>zgxc)^101U3Ygz&y#G zt%1y_v_KX$xe@$k)Aw5%=$hFX({o$RPh3 z1LGPbB4sV3If?}8g01JWhT_s>|53#&do_5{U0*06kLJ@-%lp{lNc7-cekrd+kG~P@ zv&UpIQVGVI+K&wAz|bz)L*V5f@Z^b&>hom^%lhCSGS5J_XMK*N;aby!FVKmTk2JKE z!W(R-OXJeU+P%=A@igCFKXA1~R5^}Wet)tBX9{+fz`fC+t3~^rLrL{gB`y8+J#2pye=UpSc z>jt%sb`7l`2mN74^lAG2Gb21gC@E=FlXisD>UjhW^z>?|vs=d3W_@SF9@9k{D#q`1MIV;uY%z9HkX=yUe z`We=Dem7xV>xgF}X&DdZX|!1bMD4biY=d_FMFYXEd*T}iZ<0IfA!WQ-2dGTa@Skpr zhaV+FB2Qa%`^!T~U}tL}movQ!+J!U6;~tO$crKt2+*(m}x-SMH5BAp5GF0*JVsF96^t9*o&K+mmBup3i<|?iAn1qOyIVQOV`YTu*cY;@Bb@B zkDwny$2Ch2nDC|Q9=&=dR{>CufR%V8eV?DDD=QhHpM$cRVH4Usz(IbLy_W} z$$T?thB^`B(MopG&sV)Q>p(lb8g`Yve9q6ZwX*Zt^! z;RT#Eg8ixf#5kQC>+>it{0=)G#KI?Br|+C~?HD}c6hY5;@SCRmUeko0Zv-W98TkfU zg^Pl8-{?Bt8gBrPHN@$paTzc!1Tpv+PGu~nrp4F7xtRTeeqi5H&WuB-e-HU>rhT3^%_YDnB-IjrXwKBFO;)oTU5kWEy1qNH z0bD*PqT2~7JPd5>rZU^>i+!68YdHW?DqH-gwHtuj@~!H;Jo zn>Me2pI4YhL7cx-Qh|fh ziwuOE_gXXvr4RCNIiyCC13l5+nb=RVl_3d`-R1E$Jk_%$I{yJ5vpWgj1l{eT9CFED zNI_}+Qir~I0xzv}s}5P1@EP@f)gcoDW^qB1pFw$CBXENQn~~19x-+s+$Tugs91Js9 zFj{r+s%CY{5?3b`g+wW{Y0pveEcdk9%knES(g!II%54^`!9S-5vJouT7vJV#1!A_O3MD!`{a9Si2WAo_fgzGL{(0G6- z@`aaF8VYp5za<8M=LFFT1&|!DG2+<|8tVu0BLiRx^93>F8<(`HX|#BdS|led3)fPC zK427^r_tYv0xeN&0fQFBbim63NY68<>ip-G#I)**3IBmv9Wy9Yi? zq^#(GU>jPBtB1uq?r`WgOMQXl=x3RWuh&-|k+PN<;`o-*il!xwB*>Gbo1xB%1Jp#an=|yfud_T#_bP9H<-+~Q`n#pd;Z<% zYm2{G-Lza5q^G{L?b}*nnsJhK$Lo8LZ(dDp8Lg`jFHPAGv7+lAcn_Ax!`<*z{^o2#>-loi0F}?t*mpG*Su?c0Al-SY6J`8YxwMXT_1f=e07NiwCW@I zPZDWDs6UOugNB?1zU!uYbe<#lUmG-ksV`5Z85`?i$vzPfe1Cj&%Z{`b(lwK^qALO= zh2o>i^pAWdZu^EEb>21W`a23{5&li31u9RKuq6Sfndw!Q(c-|heIrjp?G!x}-wC%M z3aC6bMRS>Y0Un1&VGor(y^$ROcSm;c^S*4zZc1OkzL9W|0%U^u^UAHxgTK%18vS|5 zZh8$2Qz%myMW4!yZe6Fo!CMK4@~6=M2RWI_r`>!UOb9j9&~Tp--wI28lKEDadXWwb zwrAQ9QvqO^A8mrSvRV7IGNc*kDm?<)EWu8bfU3SJh~po@kM>m_g^#6!Q;X<^ZxWC* z8Y}LPQbpbd0t#yoY%C>bAW+My*6~!%xN_0Ks6o)@Xs5)M->zgQVw37%zFnamaT~aT z^P*fb{z9ZD%ZF0%bKIoc_D_)P>~=)FUD1>)P%3Z)E+`6Rlggo&R~Lx{ol=0^HHGfmyB(l$K52xqm1I?(eDw^n?_%6GL7~f7GfFQ7>|`}%vjhbFs8d&)#MnHn zcw8p>(hIU643cnMrO45%>fQ@5x2C&Hl#nWtezu8oiS_h#Trato389a9w1w8a=Ac+` zkwJO7gpITt*_@&DuzanR_pEe5UA|(5fyuzzwtXZ)LYkaUekURA$c_OvqN^s4MjVBCS%*H%K_32<%?leckcpt4sspIl}7;{ zV2sO7udHf4lCy{P@#jJlBMmcguKt75STlR4vKj-lj*W|$=g&nW&$m2wn;gVdvB_%- zu@psiNIF4dANYum)|p&a9o{g;`&SAU^t-E-RHhH(M82?GT)LeYg5Ic8&cV0y@HloT z=w#qR=o5$WMj`}GO7^Uf8-u;QEQ07E{Dd$;Il=Wv#+?TbJ8E;7`w<6h{x%(}N=eik z$mHleBbyF*UiV6p@0atTqFeRmGGT{x%^{2SvU$!vYE_tugCgS#_|Nz8)Oi=b_PUom zF*ytY$3+Oi9GnY+W5nvV?A#$HuONFcSF}^+#5 zxw(@c&kiFaFt`?lz^f`bU(5W1uW)RRIkSuI<61_y%@;2HUgaB5`@Zz@R+!{)BFk@O)&8H0Jr*aoY0*=7ONEL+V`Eo+^EwJ7oxrM{{|RYMN>!%xnn>X{s)aqgBW(Hyr%)~y)$4L*@PAa0^# zp=SsHLo3P_kN`w}6+$ppW;X~{`)I%`-3wq8*64FsS%Qg8&=_C{P8$omf5k4B?rlac zCa})mtjX(kVJ(~WG576o>wod+`d5zopx5_F?%Ar^0W#g7Kv{~Z+}$CqbIkn-o4nq8 zu-9ZaD7RAy8ATOcxQxTh7GEFdDWVaId))rM$}8cg$H&XotiW|1#4#8l0 zK~R=*kzo=%hKB3@y`saa$#t)TQ#}Kj67lt(RtGp;r^eQ8hhphflH=muH|J-*o>+Hg z%8A(2E-cyS}Gy zag$A+uk{%}RX~=S#86{Yj#rocwF~|B}~eh8jGlApkbM z_76b4!ncv83X8jRAAtnlf+pQ~MeN5zDh0Q)_{&2${K8n(;y!mJS(9SDJAFsXvC+=L zTPB0ZNB2}zZwF&p3Iuq>wmuxkX1hjmbaiS`{`6Z)-dQUy+&polhbAQ7_zlj~k+Q05 zc|LzJt5dl7UFj?JZg;wJG8^GHqQJSgHrvTp|KtO27H-~NJ;IXZmDpe#ZWw7aTHVzS z3Y2d(#g)6@?ZtD#FSASV@OInVUSAk>d;}W?=$$n?mG4{Uo*0rn+;$OiwxnIDqcgs+ zoY3R@w@xc$kTUFf1hOi*n8OFqg&c_B=(=7IaC;f|e67iD>qaQWVql`iTijQj&c6rG zks63>2n$H@dUZ0#j{!vS=v_$9tI@NHfmS=W7LlXial3~(Zc+^>|4gr0V;<8RCulH% zgeftXP($-M5`+JqpG*%g@5KXJd^wc^N6}2oatQ}18f_BWBe61r5wZk-v@V{w?rbnG zHMlW;l?)63J;P)9Puuc@{{$HV)4(q$b3wc2TJ0zNACnl|h(8DO`jMr!|D)+D{F;2f zHXtDaQWDaQ5+Wedpn!m+bTcKTr8^V^Mt2HGOKs9U6h?PBx*46LM!pZ<-{<`UcJJ)j zed@Zda~{NMSdG7HEZ}$R+w=selbAxZPxqtmxt^BsFyTD-2(6CQZZwyW$iJj5db|GU zMXx&J>o)GmbN^Jx0rKuDLm*i8@{SYC^ID`JkhiywMI$%Y)BEdCrQ-Fu50}wFT5_(3 znzD{4qmph@7hLCf*qSp!7mp_F-#9@1^S1_Mq*TUtc+ZKgXc3+zO`!>?Z(B$NI<{z3y6{-Tk}I4 zjH)&#*vNLG!x_M1>LF6Vo`3byE*>*1`^2`IC%3y?E@RhrWJ((W_nccu$MPe~I^4Yg}ij6K$wq0XDsk zG1)NIktbJ&KB){963(R4TYgUXVP*_||#fn6u(XatcPLW{cZOwn4rr zJ_z;vm_7P@-b8vX@ergn4U9zW0b-!sP~hvF?v(`jF=$|t`X=NG!NFEytRBe;SLSSh zQV_ea&IKo34691K8F{K>>&8R1xHK$L;L^7aznNSS{)LSdw1jqqA zd8ijI@UaFDxivqWZ1h424@p#ubH{M>rqw@V{|@-tJ8ep!G;}!xbo^I9EZDd>%88|F zJAd5mm6O2{u=*k(k=J21hG)E5M=Gg)Gu3tu)YghP9}+7kQk;`c`?<0N5bx}zf3_Pq ztqv3G52Sy2K)9Z$IhDV1t)N>-izd-1xuV1!Fz0~{+7q_g;V*l+u&W(OtzdH z=J9WqMUOFVenw!#JH)I-I_{_2;PB{s#2-->Ww0mV5fZk$BYYmqICi=Ap$AAJsrU~t z{#t#CSwE>*ekp2jUD$A;dT{wDKk^S2){#kTiIe+iec1Zm#B{266Ecfq$$c!vmW6_~rb)YrVR%VDuFQRoYA1^vmD5}O<$^xw zC%MK)$>%s7`6ZXx_qqO*0+)p$?&}8Jgx@amd)xi^$=T+5)`hgNq{*TJ@LiSNbD|yG zP8-%%o4&#P3kQ)}O*vwDdy!le2cA^wLY#8TnY`#rsjXBwaxHCEDUjKJ=t|I%I5uDZ zm$PYs$R|hGPnZO+%2nyJA*bhQO(`VmK`r)r_4J2I15P~9y~im*jEtbI>>O^#9KLaJ zUGQu^zS_ljH20&(sMhMoHd)!X>GZTl%P|1J5CSMPz!$QY+3QzIbOeb?olfpxjyEv^ zMq(1M1V?2ZSJ5Nvo_^#p$6s##HiX3@$9YhWC+iYXj1D`tgoR6YYXiM>m7IheFiH_H zGAykr&^@3q|jZnG|2K3wiWq82ou)(Cyo(AV62*EwE$3$(X3 zEBFsbWe;882cJ3EwEKZ#%=t)XA4>dt{OCsf+e-9JAB*fken}}~OJyL77N9Z1VA=^E z7C4O{U1V(qw>>=)u26l}rY3=TT-9xSS6RGsO>NYlMV?su;=a29rd45pR`E3y`{vP6 zQ{)@GYyBf8sV&~(lR7PlPd}WNNPjr(c9s$AB~$xy7MD0(f3pWP9V~$MD`j@em3K(z zst>}ac>M{!SYr!%?u5ilfA4gBZ8UpQWZvcj=vjOK8S?u#n8(Lo3(bE3!KV42Dao(! zoQxtD$cxc)d6zqJ8SusX9>XoG?@!iidyFH4zhE#?#Xl+&=Yp*C@H;p0gAF!r2UpqM&^vB84;1UUK4f5eu=6frh}`q8ClUo45ps5LHlez&hOPm5 zsOizj3RsK^rF=eHhRaRQViY6W<= z-FXcwpE|EAj1D&fB;=+Vm zx7~J%tg$uT#lj1d*-X=`<-z-j7-BYU-xdHyN$9Js8X2KAP=h~^7U`9OOi3oB-KkAQ za=zz_g+3wfuWksZz<7|YnN!qSXK}Y#KXJ}omllVGWgiAZUdLWb+>d?T@5^9sz*w9v zwSRuJO}sCN)1IEo65x_CLt&6drC!K66@+OnmFqUaf4Ap($}S8miyc^P_Q6<`Tyk8$ zt=b_-RGyc@_kORG?wi$sius9!#aUR%yQ6@aaUMlaN>Bx;V)*`C{Y##x_dUh)NQJR` z{|wJb0UU~V93?67GD#-c_pMJl!t6Hl7ghc63-EJid5cWC5JD0pbB?zEBrV>Yx0#8R z(Bj|&%&Oe>r581xcgqTxKYpl7-*h9iE7Hd`iR@ePT0U#UEX|t;Cxe;}yj~tP8|@Wa z{>oaJbdi%-D&Z;Yp9KbXI*yg*BZ-sF-rd~owt9Xs-thn3KRQ{v+5?MGs3R8_Rx|5X zTk*O^FZd1lHD;?wsfQ+*_eSs&8su9xL`M8Y#LPOIlPIo7WZfASnU zD4$^I^H4T_E?_G)s^fZJGw(XAS)^jf^UO%iJ3HO_7;)Ztlr5Vbc5rpOkoY){LBqjl zduI=|Bj{dzv>qRO(eL=;^%qHcvnap6{D(7-z;Os+bgSxMF=zNo_#yQrUe)imUpB=) z3$PY4bvWyb1^0Dc(rC1L9!!NQBZyHE%DGLdLwdZ9BmkqEKGv|@R@qD&LW*Uh;=AW= zS-IIlMQZHMp|-o@aO#y~-WpYZ&T_s@($s@Zjx6`=XR=X4wQl{O5~|^ejR@;)+UbDU zUp?VY9yrocv{0%%`r}kcasP^s7+nA2ccu83F-i0!1sU5g|5>WI(OitU@*wup6#)r* zTIGj3{adF#($$Tf?IAvJ_9jDP(MYQSkatml$>$HItii`5$tx*bJ2=j|@-Hb#@4|Mr zG8(fV^W$1I&A}+hHh%m2ot7GQhsix%8I$;U3ZuU5O^*5dJde=XCKTcl@owObdAl?D z@;arFsMy%pChVEHR<%)kfYWut0777pfgksuSC?mb945}57HDpAd*3XXK?4gh{{7eK z#ew>0#zR3k^*lf0V?FTsMDde)b@F%N$1bkH{*DeQR#HgPKm%vrz|gP1Wul6j#pqlu zt%q-WA3b&MSy480pL5QBBWv6+>mHmP-VzsEH(QJ^2rr!DhbGGn1e!tQ6)QGbwn^7N ze(HYb%x)Z~(sQ>Eg-gDHB+dUEu&6lv=&9!T-DRpL^&BKwj%MYXisP<7Hw&Nnr<~&G zm$Jq(1F1U&6ewod^M%L_N8ulv+01Dq?4QlmUkWJ)^6Sd(JJO(Z=#ACGsNd1Hke@^2 z_`{mIU-KU^93dAx%dgDjOxypBro!sp+Hnk#04kQS6Pa5r#I(%=TG}6&SdTPV#<$g{ ztp8cqU};7HH;v1l88B=O({9n1`^lTnD>u4(L9riYTVS3^8Nt4A%o9>?{G7_uHr1cZ zFXm3WXM;6k?r)kRD_d$!rBW=lxo}E4ym__uTav8QTBtF-=OC+mZ(nZZH;P9qZ&J@U z)%$rc+lh{5kf*8vd@OvR(>N!-ub~a$X;6Ej9%dv|Og(T;euA~@PYoSdr3}<#f=V|W z8eo_?fceEhZD-TZaxxrwDTb;?!!$E1PNwF*LWLb231D4(z^-DgQ76du4;eH^;V zd^>7_DjF?jIa{$jB_t-b2`6w>{d#S7+gG;xFV+1w@bh}(pmjrRNZVkSN9efsjf4N4 zv(rj`S1YqDVSOs?tX}Al9WHx4C7H$A&2rX086A7aq^b;928a7a+ne8xarqa%rHd=Z zFZw68fzJnj8RnlbwrKY?BktN3bzB(r5cm|$OSR@Ab(;}!Hx1^6_ZUj<_8aH2 z$jt87@8E`oi)uF;xj$G4huKd$2IA(1HUxeR>&I9^UrR-Kp&ct%|E02VC8^1F2gS zw5Zf?rq|sONn=AcfU&q6tK7WfU~j{>@0l3|T7P{{Q-}(}YgTWo#d@JJws+V5dVcBQ z*DzZb%M#HB1rkT_1%bzu&?e^;3AA`??3EXL_cc5Bsf-zfBW_`7&C~}jEyW5Nb7#)g zFK&nerK$PlLO} z96AlSB39K6ZtxM^s^?u*k#EM7Y@zRz6ikeZPp8(?o@zPND>@lXlfMnz`em;b3J*ES z(y=7_o0qCRqJ2H^F~F;8JnIlnYWK z+af=pM~!70jaGgODj?VFYnt+iEp3vO64eqf3k9Cgi?VcIBx%RzqoDfl+Mv%PzPDUx zi-Sx#My|S3uUlFz9bl-OP8tF6!j)zjz+GtR02B2~wl zth~|hPup|#y(izbwmcT=bcC1KuRnnI4^C3voqqS}nUYla!+iU7~U{1nGP&Q2X`Z|w04Gi4RKDycE7fl z&xGRrIYRGz%x+6<&R4QdCR3iS5L48$fDRs(_u4=H#kBq&fFAR% znjcrh$V>36ai4lJnF>HCcf~7=@|Y}-kIeO`Y{6*h1rJaWc>=-gLm%ysOd8(@c2%#o z3DF~ce$4!_)Q^d$@l2V!Q-@(M)bTw>^ELe%EPqLF^J&!C{mQwIG6h(5)1Yys*0{8M z{BZs!Y!5Z+xQ~nB6{iLn-nGELeqlz>97>J5)0$XP;N>L(q)jh{5>Z9Myt(;O`oniO zIJWfuTXva*NG9g6XOMx7YJtE+*Ap3^)?n8Y#h(62O-bg^29=!JtbkN(Vm>@xm_neT z6%k3uGwbn8ydn4+j@TL<9qSs2K{{we^b)Hg&SOA8nTe%ie{IWyl|QtB&MuUbfxWF` zn1J$5_Z!2yy{*<=8NavpD_Qcpnzv3I$PcF+RRV3lT~7*EL@%oz4~^za=&s?T%jU)` zmVugr{j#R^;AZ5N$C$VPT^(9;pJh{{h(q`cM$x>-d-hciEUJCeC&AzL>uM80L1U1s z@P3iC?S+=O!XJ=B*ZXl`U0K7cSl=!N)<%3ExLvyT#-+)C=?|atiNJzw6>R!aKTA{D z0X~g`;=tn1*^&r&eU zP6Lg7lyG=y(sCRbBv;ZPl^EBy-{+@_#~<5}RDHaEG;i_xZLF8%0o2(zd`nqt!*>fb z4t$UzGp-w>h25!nc>ED?4ON=Dr!vhO(mp^q=b((J>X4@_Wye(yeX5;j;lAtRZ&IKiZlLi&QJ<)JQS^^90({GmYa+ZQomz5KczIuc z=mrmrQ_qE1vhPoh-n1Dbis)8waq*{Rm1L>AB`p0J$Z>?~`?rOz0^g`x3O9BWDl#QE z?5jaDSd~Ml2vEpeRkW7(0sAG2Mms!{((vVzYRCmqb=*l%;gN?^hZn1BZoAV6e$BTp^O9Pdjam2u+Xas* zqJfy)AbVOdK#uxEa4C@WJG*(4pN2VbPKwsY6aN&a%kO)9nu3LnY09o6Y7;DhU+23@2OaZ<$z9Y7fK|Yx&^B z5cwut!i-H~%Kwsg%)n=tKizSD!p|qcORnT8&BU{kRQ77?Db=Oiru}pT8HyC&r}a1N zR~Cg2VOfcR*nR?NEZy6T;mFD={9kO0q@tK|;_legpN6MOkz*4~+c4Dlo>s(e6!eKQgWLB@tX z2oJ%=fJSbV5WOol?aC?dF5?zQ;(EuYtBdUqa-@mWb_ZPbxNPVIZK8`D_LDe=GwLDU z^Impr$rm0=S=;C zJ!WWAgZkW(JIg#W^L4(`CTsSa1PQynz~CiW_U1Z8^#KL(O=Wi(!@~5R-8)7OS?`~X zk*zGxSOxacG0l-kJJim4Cb6Xm?tO0!>wpSXoXgoa_PP@W5 zKvHoUQyl;I5ly)D*}lnpW3wdxpIy#xkNLt*qlIA!pMC=}9qqhcOI$Ol6z&r=4RhfF zzdC${9cB1}Ey-0)YIk;*2skL&s&OuV4SMWVFzLYhl0SoELQFcYvtL7Ollwk{LZAY; z;oH=B{t$UWQR}!gokpQEz{`hv!%UpzagIX0)^*%s-UN5w`H$&&Q*(q2-^b;57G^cZ zvr|_w_NF9|QrUNq0R*){dTJ23k;cq)^1S!_VOjO7IZj4=<#2B}H!mYy1-oyuGR$tJ z`8r>gRGZo4jWM?Bmc-0))frNUI{_ykYKyLNGzh-UhS zBJkLG>-`(W*}Kb}gqA*JoP+&pR-u&{IqQBG@>a0QNAz(s?hQ5*S6^aQNR4*gtR79s zn%OF$bJ+{w~6c>10`=1 zC2hyy2T^X+poxs%_w2M3r4hZ&kR%s!&yh0rHCkURaHFv-)%!%3S8$2EO%23|2)GP_ zLgk_cusP+&!iZ#xEze!Tt)nBt-)JW|7aGbKD(U?LdyY7XEDSzseWWrpF-S5O?;b4@ z85Ad5+nhhhAR-iShQ|hJ>T$UYbn_HFA2wf`n--Yh?N42OpSUB-LP9}~dIxV=)7>Pf zk?{!@d~?Xa z=V{$IWJr=pQ8>sba7?Vf|IJysO2P*+lEj*@kD0`!H$nGf(nx?=3?JRf4j(s5G=d2Yn2Q z#4l8V#-`9#xeLnCmrh>8md6WtLcIQN&$c97z+d`~AOns6@pa+H1}boQ4(AW34j^0* zElI<}soNnnG_-G_*t8~p*Qx?#0{9?XJTT(gtYu<789D5TFpr(c+_c#CEn*)W@~QA zpkr+{JVL$o2(jYbzsV~1EVO@aUoa3FPL*%_`Fi>Z@A#fZHU#>ah@@ZOwD0%Ry3Vo>Q^%_wfOS&8LZ^6xX`3S*vqy#jiA>g}`s=l|U>){TvIw_-mtSWK=b|4X2a zf;v=CViD`C62$z~d#|Jaa5znYn6#jQj`5eX@rSuc4Ji@LH*|S)L=_igeaFu3F#*{h zQo>5o#X=W4d*qH7VGkv=BgJRwzFOT)+_7nW$}RY@>mU5Av#<$Lxgi|k$NyhfLzg#a ztOEc5RfbvjSx$Mj7;FiK_8~lm1x{XgKq#S@Y{wsXbqO!~dbRWk6-*MPZ{Mf0E2gbz z&gF?pLVBq39sREHGL3lNVv()`dv^Hwnt$?*;RA)2t6a64Nlr-)d#U-xOgR!GKFs#; z!iQO0_lZxI%+@g8nZWu#QB$9QYEOlBVivpwetyD#3rTE^wM%n=a*{N+w9N6C8? z|GZ^L*OxL_B>DLeduQxE%zF)4JKF^opRT;k#LfWFCY|H#L$B32VQfMkNy;ZLAcnGj zaOP*IigwVxj&zzoQ3g?#wrzvz^ z?m)7)tlI8&ES`k~cf?fYENYl>XgdF80FqT0muZYjm~V)_TyM8ubbMNB<4(lPv?Cu5 zYUTyW7#SFiOKy$Sh_|Yl2_a|Y(x(XibsQHkqFS&b!|RfTcGYR2Hie!GHqX!tVzVmE z6g~c?zdySd>E0gNz0sB;&^Ceov>7jQi5mncXliZR@PzN7}H^Z!SJka)KHl8;{-mTR4w)f_c+! z;m3dU%v6vqUl~*>J@D3Z=TivCX%7A<_rBZDRPZg&`6OB?I8O7QsH%Q9)0(YH}+&C?Pw@}uyv%+H`{GNurUs(F}9i!W@Z-OYEXuk7F8J6uSiZ0Chs zs-665;FeRbN;svuXEc%wI0N+Rs;=x3r+4dA1gwzsgD9(ffO}`(TSi=o!x`GLHm5l` z)F;6uYkc;jG16xWN1%BGJqlwPW zMO;uPcWYZ$Kzw~L3iV8b{P>mJ?{?!vyEN7&R&yU`#Jd#(A4soRf@I$!rz#|JFyIb> zHVoDOFCYF{NiNFX7Vpmdi}p_XRYuT|t>#>YvJ_+9^E&4_q7S%t&T#9k^n}86R$Pt! z^IpUi=l&}9Q!~~1M%SF?1O4-NER=j#ie%$o`8gQw={2u?Uqz0S50kmc zLL5VZ3}YnvO7{Ah(TQ;Oiae#YN>8P}cYy1@{ zgA@Y5;K+u^T2ml3$!QAc>_ktZXp|+PCQEaN=hbkTeRT*=sDuSAsKdya$X4?9N_czl zEl?xdYIPTi_u+rUajYM7<#BfsA+!h z89in_W3VHqV|nASW6VJ3(v+`WJ#xNLQ6-jH4qzrWIg*SidjSD8f1yhZ zx0SsT=w+~66|B2mbiYFigOR`1aD{oV`-nM8Lsi7E6iiQ{J`l`*erFg!Sjs{5E_&GHp$9A`P= z>0=8vI(-V-xC|-|1WP#V-4T5SkGiQ=W~b?0Z%ZWZQLT0X9b<@# z+Z$fpp^9E8`lMfqYAgxdnA`cip&vhK+#d}H^DJB&pIUU!6lStI%2-2?zAinAL{a^hvIN{v|_VA%==_O31<4%#=;}^W>!f?kG|u;?Lof8(I;fMYmdSg zGd5L+T{fi7%C_;m#BzYcc%=9cdHA8Ql1SC1s9y_AKP!2?DovZ46ve9nrwpF<0R%S+iCOeY`7i^QxuXcBLT6%fs z$wa%B3F~(`sLQ-1-D^~m!dIVzwLnKlU{jZ5XkeK?@aIpO$v{%TsT6cO@Y@#0?KiRIz@N`3#}6C8Y}SMfvQc}Kf4bz{`jM| zpN8l?SHpqUx_U^}begt6_};eE#p2Z|YY_G~q9uj~%X;C)s&6LwL1Xt-{ntVtW?A!<7Ktu6z|g&E4P23ey~dP6@~?iO z#T@YVekf=l*&z#m=CUa9!nVx6L`~7@3+{xkX*T!P+DA=YLFQQgqujdvk9$39J}?1H z$eis#EN2jfnBAUI@&Un)K1?yw$&6?^BgccEg& z`A7>JwDmSz-({87&7|&xL=z2p*LGfaUDpwWRMG9HBJhpe=lEhriO@9XZ~{M7EaRLT zlYG&T-`7O*Dsi*^$OGV@p0~bt+#%0j*p&IJ8U^*}r1o;n*|te(4SRb(ZFsHR0sI$( z6{qd|^>+_J@fgA!_$PFx_9E(qdUZkY?MWH@`HLCki%&ZEdJ`o|6ppnZUU`;E z9{+LFiG5}F=J)HvDP|Z0CS}(Hp%?<}%9i;_vALl{o=;~F+bf0*uNF8yI3MXv*i6|% ziz?25@KI|jX|yN&`s^Y8yE#5Syn5j@01pX~2*UPO6c$k=>7VU*4SJ+rMfmOZx!tf6 zzP54HJ+fr#0LaOss{sl_m4b4pzyFV%a{yj0SmP0z3T=k1Pp5ug;=zwk_g!}U{)-mx zQ{InAkI&z6#77XE6^Km2zHx5@HmHnO5mJHgog6?NUi0TMI}w^lZ!8X{viw=;^;Gps zeU<{v%urW9e$vmgnNv;NBL8beCVF@yLaf%IcJa$tNyJZesnRUgl){6$($_=%=5n&P zQ{i{dVI-I-LpMTaks*~5^NT{7f5>@cV;XQ3@O6yC?IKU?YxUAg3X5!n;C^`x1Yh-2 z>W(_ajv`(XjDq853>nLxKAr8?WBzkI1<)jB?ySUdrGb)k|IO@pm3<=ZSV8B%#2RpuVhGtTWQ;5+A!&Al+t zAOrcOHK}`rRdF1)nCvcat@c=NY~7WeK6Ei`rYX2PjFVxRn}kV)AjBh3!kMR^drQpA zhvJRe@NZTi>lhw2L0*hhia|L5_R&!FJSs0(s{74=vVWw17oJ%)FI!VZJ&R}_W?EonhL1r zZ-UPNOb_#$!Ay~5btgl|2DI6yNL@|kS{&qy5&tRd?;cCS`f5k$U(;+u9L@c+4abpm zu%1O(>&)3>M^9ct{{cd)cx-Y?aGsagXO1R`&!VdohpN&JwsvC+v z04Gp1z6N=3AQP*E-sTx(bfwaUI7D;QO|9n51O0KC_IradS(kB$pG1+nbYy! z@_QZr^dV;Th<|burQW6f4~+IEEo30N&KpSbh7`3Xqg~fDv)IVv9T2y?1Df)E%?xz~gSeEKGRzeLq7sIOg8$IMSi@C{+acG|)@XbF}PVZ6Vl>B{f6jLt`i2Wr29=&-`S9 zomPgjX(%4+(3&Gw`QkR{O@I-=@{>joj0*a7Okp zrLS?Cw|};&^UDKXzwelevAi>1`GIa$s(_JZX)DBzEW<6ZhhOB~QfdDh4J$u1h1pBA z@9DSHd))E|`)9D))R+Z6NvRiWeeKM*hoq?wup`+mOVpP zO#c|G*El?O{wY83Siw&cvnTbgv}%xatn&OmTY7{Ycw{T;zpiDtyIDzT^j^_RhYVSh zWRIC7mqmfkj#i{4NJqzo%mtrIw%e4=>373F(?1v zj{d0ZPsLeu*53vt+~wy!dH!HEQhvsnf2wlIaGB`e^NN4+yaHQBDesxKwQV*G%ec9z zD@uNP-&hfj{Z*Tg--*+LyK3w~6u{(p|8`5es`OUec_Ug3K}X6rNT&W^ZD$h!W413#Xoxg|!+H)nSm9|C~f;yatT8@o9>H*Z{(%BJ!B0 zEQTx*dWKd%Hi0H+pCINdg0^VLKNHG=VHuxGPtE?zd}rJwzfl5AqCrz^ieBD-v4JC_ zFWR+k7jBBv4EtrWzz>Nre01df9M{{ z(b3=LwVshF5k6>@!)Yxm`RqkI<_F^3 zWxEh}dx?(>Kv7R(rgq;6^YZ> zfauB+Ca?%h)$mZ{q^?W8sA&O?8@|>M-M-T=*(nAjBYq)wu-bT=rdP=MlR z8ZyARgUm)#r>7MYS#9E*7GBB~+acjSQ}Qrv3??`#WmMte?q=gLu+^X3^Kk8}gzi=t zr?8~OZuWhR+H_0_IKe>D@sQ1QcBb?)6Vm)%C0Ta-=u|P*xAbTry$!j8jqw7NH(j6A z6O(NNAo+m2mlUnqW{EX12yy~<;3s6#sR}4Pg5eyBLdjQ`vE~+;0KDQPGR-lA~(rCA$Y0 zj$MLQi4+RygXpxliuuUNvx228&s=VvLA2Y9+HUF~52c$cl68EZHx>aOwJaal zS))gx4Ozqu%Z?3ZM9uVX6Svhbi(nmkI2b$vNECRl=f0(Ujd*>{p8fg*PciQB?KCN3 z=`$BIZ}cR3q!ra!K17bH6ynz-XRFEo2sZt%8V_IJGN+Geq&c6$gt1|Ke7?JPtW6G( zz3Nwr57cRXecS%D2(7O-+`zZR|B+?wZi>&(80R_w?VWfzD)p$yqKb=eWAY-j#B~w5 zgNc#SN8Yu}@lD)i!Nf6Z*fr{g9XKMisebYHniMgjn33``rlc5v*T{4?*6qz=Yz+CjJ zc=~t$Igakev=yWOIKj*?`Fy+>HH)z_Jgq0ZE$eit*d=&Y|Igw2Ft)v zZ+yMy%C<>$@-^<#yERkqqjEo4Dx+QYP1e0LbRTnIWv@k3a@#s46V05KWhU#Nj-Ay# z23~c_KUgL7PmS*MQ+Kfb(i-+o@03BSTUh#R>%sZ&0QnGRyZE;R#;!W33bm%;Tlj`@7v@tkO3**bl6LxhGl<57SdBvY3AsF5h>3_oCU0 zOj-=HPUc8HFa~i>n}k(PFF?KxCF1;6`L7ZXoWF4@vQ?GyN(1=+FFIMqx=7dBs#x@z z${r6X0|&vYcHJydMaAx0W54N<%_A{@c)WHX!l+yevN?IqBH<@BDU>j%g+n55JGa`* z=-@g)vb-!T=$Ocjtqt(eVVd?&b9Yl*2)Dpck0erhcrys>_GwB8KK zJ$K0F2zur`w$UtEj967c7<~&tkD2KG>)URDt3DT2?GLcb-q}jo+cqZJSj*qlN?9PL zcErQbwAQIul{NE21H>_O*#;|IfK!5eQEY{VPIa80&1p+-(k9#rKhtA??Me`3tX{9u ze<~xdgI9K}aSR5C;|S(J{Ej`0H`}|UcRw!gx%eo)VYk7p=YTQPng?0e!#61lo|<4( zr_t4l@5u!EEGmIGvzGTg>gf6cO5~@dZ>Cnh9(`m~L6w{45I|e+D=q6_n zv&mqsWAz<0-uhYp{$3AuVe|xJ4IW9k*ny2cz8?fxd5;xmI6vw=o z^Ijg}oq!SUGu>PS{{uW}W1XKmDg(tizpDk>^iiE?H|w#ERkcf951_k=)!l=62E4pV*q}XKhMJe1rEB5xy!#M&1z^7I5d`3(CA(+}XX@S{&Jp8i3JG10=#+ z&yi2R)qg=m+?kLrEgxwdsrVgjX_$|%*#&kke#7|5whstanFdmkpECKrb3S}iG(i~a z5I8o6Vh%orxa(x4#HECnxt^euBG9Mlgny0V3Vl8qnQ+P;q-;SRcN;%j$-KFR0&gkB zcouyRMcfkxNaZh)$P*EDk{~P*eu4Ow#hG(p1Y`1L%SYqqZ~1T#>-7VGRsY4}9bsX1 zBVpwzzSW3EHG~S_xXwl64}uc#D|pC}k>?N>JEnUy)ax6@6SK`*dg~(6x z?4E{l;wMJVT0Nmab?;T>^2wrGp-)9uU+ z;Kxv%&Bf*gF~xXqa$hwMU;6_xoe?CZa@^h-VMk=G%_QZ!PQMIo|Rrcq$I=d?1)DMD&4(;~=!RP4LlR$IKAR6yOk&Xk( zRi#ncy2@w?Q4FqjZpg_KA|JJT_O;Zd**`ve@2s*Z1)|UWjCW18XuZamZ4UYgY&vC% z=p1RzYydQ5J^SzU8Ub?f7 z7TM2^jegW@ep{7UTA@2JIQ#(^4rrEodcx3QF>yoUxs=9?xEj)sa!nHo?>F;6RF_+4B^ z#a`fzI(illW67MsiPn*0jB5W@&FQH+5r*-*O=Eu`?3IP`Uc5&e*3BwR*Lqh}D@CJg z6*5JI?|QS2f%4Lwc6JB);fD^H#5N5L^jxjzSeOXoPw{&v1`*i;z5yX3$+r29AZ?5W z($xB;VlH=r0Ijg!rE$$0`8G;68#S81np?G59GP2lgtc?=HDleFxV5a&7HwD8?bkLP z3=GIHU+lE?!_!P(>vVRn8sFVw34V;n`(C4>ZdQqJzZxBuMPmZi9T_%}*F7!l z^7E;62)#nSLkY=*c0JL)(!LCyf8fMGdn|3_akiUtSpN{?Pjs)_4>XmG|EGP&^Gz=^ zjE|$AudeQDEdH;itB#BMdEReO;sX-WjbM<1w1BjL(n?9EbV&Ds0#Z^cAPpj2(#=UD z-QC^Y9LI0Z@9W1O{B^fCyE{Ac%ri5)oo|p~|J{E>47ietP!rR{xg#xP?fv7Lmj`>0(FI{9SoU9@)SJ->&sU9LNt>>>vrI19k z2i*os_E?Z#TbZ=*Gns<<2>=M1QNA}D18SDp=({><8vM!BD?*>uuNQeC(GkMx8dum(I?L?sy3WGL}^aeL8% z*+vNGq7zIFY~$Y`y6QI)de;1=Bw@+TRpUXGgK;1Xwf`Y>Zi{rrg0MN2E5k>KcLXN& z?Ww0bzoA2KI3+uZWVy`sOYS-z%OwUn;;`z68c|SH!2`XH$+L}^`Q5gXvY7t0$g~cNE zYDsT(3>t*lYSOxSf48PKt7e5>g~{Builkd!P-0ptwM6!t)cLpv&0C^_+)NZ;=JO`3 zQWG+hzj^(!x30h-5X9;ak@YV}q)%ee%&|IjtCNP45%lWkU|tLE9sv}*N9r(!Kl;g0_E36TRc=7oRu zKl>RZZZq-T*^Ov#{0x-`RK|unLzhzyp9azRt5OnSU!TSle!P(D>kn!vPq0&OLmi+e zj!LXt` zZIK5*0vn#sgdHDuJFBOA_H`RnjEc$SuqXB0*^rB;#4dy&9)2K{D`ExGw#Sss!g7n)c>D6W)&yv`Q(iNxj;UQ=7$^U3XkxF~Jw-K@#&cBdPek2n zwY0WsUZ@g5;#ZGGYUh~diurfd=B@v^b|FZdls6*Mm&ZBs1}48Ryy@xm?5za6XylLU z_2b&b>e{|;HjliUtmZMx+`9-Am6>9=$QwfDdf+J3bb0bSZL8iHh4#K3;sz z1P6csyRe=-m5y&LLc!+Y92zvzd%xpi_9ddjYy(rqgAsy${y~-L)Ym`tHLvqIdpjWD z8oIvj5^(LJkpEkO_y|64Wnh~aLY_)0nEY+t^{2_;`U;4>*YJTs(VOG9Un;$eF4mh-%^}N>3o%Dj10DxgYD#h4 zrr@RRQtTy&5C|MSXZ@Ex{N4HI>As->rz|URJwm<@(lNQnB=2~>D9hApeAnjH#db4XJejjgX%u0r$j^7Pw_waTI`To@7_`Odwj@Cba?eF zL%Uw+@1S8{)rf;4EdeC&K?BLvYLsL9gx>YhLtZm5y!7OZW!9&irhs zt5HUAZoEKmSxa(ZH5m(U%<=i`cUvB^BzEyiaOK-kMbo|T$JKS+g49zS^g`P(Z&O4_ zJC8XsL4X#5Vx^A$&Iydr9T8AtdU+5*&?6b?p!Ms&ZC8Kjv2N%S-~A+Le=mTw9Fc@@ z#}KP~{Z750;OSNRLo90L+E1<5*|R^aqsF$pbE~}`oe(JXC*Nz|FUDQr6~;|`VsOni zX8}RjO!4^h@cbLQ%U`uAZt}G^1`C!D6!icjYdH7yV}XdvZS5RV&BHcQgwzra^39>I znLs!H5wT-M0OHiR@h_4#xb4HPegE7rg4Ovtw^4r*XG9mu>Vvhjd?Tq70wWVV93sDS5bazG ztl5{#7VwBVoGJaKT@1+Y6^i-uLZzS!8Q`TOG@$ko_-P1wa3>|FtUigb4^%+CZmTtv zbRF)PK8@7H@nI-Wpx0zBYSd`uI9YCeHuGWVZx&qLdxw6XdpJyoMy_2%+Ke~9-E)0)K(V>t9J(rUfPx1;WCXvs+xeq0pwPbvvF00c$D;ZN@V^|~g`mza zYiPIQ!*chWN^q_MZRQD*2P1`Pv}bQ`Ts(~r45r#sZx20gs=L}cyydjkc}rl)$4A+^ zO}*KkW|h2k95zLzNd_(l=j-F=W0U0;ZrVgyL| zsP6v}9`~xLG%9kyfTA8sw>QOXlRaD1&x6%B7uPs9%w;Z+2OYPC-SX^p?rUC^N#@^Z zw!*8o;OQl@(hhq`1Z|gVX5(#76H<;TujY;^g~kJIJ=e=OW;Bw0U}bY;6FFs=!@On; z(!(w>A+kys8Kir@HoDO=H16htO*%Lb6m1&jYN!y-;0uV>vz+ep{ukivb7%dTxZe26 zG}GNv{xw#d`K@Y&UNdI0^h8d@U4c!TCY1rZ!Rb4cp4Ymc=eX+h_7naN2xV1mdve$i z_YRz;%;)V2!qtbJ7*@;_``daI`!;(OMR+z9i)vJOIWN6yFK&@mUS?9azG3;x{r zJysR;*pYn8lPgb^PjiZN^!8@)+2JeI5zY0g)pA5c6|fSFy?ta=QsMbWpmzr6;uH-c zY5gd39rYF5!(Jl#gR$jDM8)6t?Kwq#*``+J3i|u&9uL9GXJ1K9lzowRz3DP+(gInyo(mjeSO7$2m8#&Pmsj+!2G{VVEWRcXoY(T2%B7y zC&PsZ;BRmqIlrH+JgST&sRGq+$D)~_d-Q0_+d;n7M3h03xF_EU@u`Xs2&(wH>K6B0 z!=*pR*3n1tcH3YL^`p<;XU)MURIHNTyzR;UPJ#ZiCZNBM+#*0~bj-ir2k0H%87M{1 zv2ygO@OhH$hQLA`K@e-&&z9qx)5o7Z+H6YfHw?pW9GRvy%dzhZ3LE5*p2fMi9E_ns z;=DP+ZhKCER!z~A@06T)AC{6N67_+J<_LBBwvttT0&2mIiw#A$r1R|tr zp4uPAf*&krM!|2?Jt+WK`_MilMQj0KpQujjd}kg`Qzk0TkSE>uWNK|$PiRs6_#pt1 z#eO4OuLowSh+-Q?iH_>RTV!Ak01Y_gOs30!UDmohBGXuH*|{RNUHT(r8wH-Q1Mlpq zfm*<;FmS08Ux4>#J45Hl2Q$q;LMYB%fBD(tm`+P|{rZSKH6}E=5F_{aUU^hJH#@_1 z^T*&=2DL7evwMTN3@hJ2mE{}I5Z}%TzN_hwHs~Pq<_TA-c9)BDG`ITn<5u&hq8p%~ z<0JR%rth*MI^<{Z7EsgSUaW=3as-zF+Ur;z5hd^yau66=msa%&F`PyzvkzhnE4dQR z-RG_O^E>BI`(9fIBAHo zYL3!sO{lwsTuvFf7MhUT1JPb4>c-t(r`L_e&>W!@2-M1!9OFR{S$jlY#QCEdR(dLL z&Hg-ZHH~$)w*0Noa^TCn^$rfWw!`Xy8zRK5+{P49%s7v!xuV6h3ij&7kKx(!?e~#QL5iQhUy4) zJ4(OKjqtxQ{{B$N>bK9e5atX~zcd!fKPve>@L_bz8`!!DgR#-3X<*h$j1AUbMH@>s zwz9u4q4J3}poE}i;*(Wda^pr;gYl+3?=K2Mh-)MFKy4%YkleT`bOe`C$L6A{KJMY=5;`{cn5}la!0&j(?X?lC&rPkb2Ws-`>Bd`zR?2|?m zJE~Tl``Z+`3*?xPU*}z)TnC{kaD@_)c8on!o{5dpv?aYg5UuqqD!c}@=Nc<#S4`6) z;fQ9iT3lTU4Zh%|hNpRKCoGR=*yye0vFgn|u7JUb-2n|MU#Y$3-x_y{8PV7+p~ep; z7LuYbWH}E>SHG0eSpClff>eaDYU^cVD2^hlyvh-^V9?bx`!M%`?3hwkdigNaN1~w1 zqLBSLRZI1mfx1~4H(WReP?2Q$^8w8YUy2g2oO;hHLee5aw7;qF^9ogdUvEZ{?^Soe z>b>?n{zI7=h$zxdqR;bQ4TaavnJl^Fkd(~aB8n!BcSeAZN zN1}Eyw#96B^Y!Ohu+lF-Hn@z1w7&oB?HHYs?)HY@k|W*Bbf)50R8_bh=~0{_xL3mf zb%u4ohvgS7k2fTWQo&S%8T*q<&mYBZ#X6AcVSS{P9(I0`4m0hl24B3OYt-oE$s|XC z&VP0MZ$=A)cTd@*&s{z8EC>8PA3$F0#gLa zPSSe^S!`cuQFoA=?iM4n_dW7cq|5U=vEy@Bx3NdlB9nWT_c~>HagAFaZ0!`Tzq4Nf zZm97nAGO6>@94`YYoqmDhG8n&GRi{!&kKQnfl{li zCtHBc|F)lSVfR+Azi#k~5T_7%ECb@`NK|uUkey((Nox=i&Dd@F_eTSup=uqC_~(CC zqu@4kc|ynU#eWybtS4ZVuj);J>(kr6iP%W1f>aeUG*cSre2Ttgd2;lw0us% z%@z6tz&evZ70fK>b3qos@rFc+|}stVxVQ>?pV5Oge*Hi)dXGkO2k& zsj0~(KS0peX=C=yv9EB}<;FL;+pzV&9W^TRMNHaWNA?2lC{x z9on;nZ?6sI1V_&kj3h7E?E%5k+<2#;vG?s|$8y^bP~ye1dFK1^pIEP>opwG}oJK4d zgFCVe>pf*Hp3S{DgjH;MmJO_kIT^FSWj8WR^X>kyjS^(<);2NBQ9;mZlx^z8_`BZs zT6?Wm17fgaT(I!0xjU&>?O9oK$MXMOviXcm@FdH%8XPg0xc#<8#FPW!1p5wsb%zIz zBSyr2p1Ha!9h?DsmO5~l3$EIr|I4x>2yz73sy3etC{(Ol7e%)v?TUw2?5kXY;;m?aJ8vFZ@pLedaGE5zTwKCtu zvf`_5k}8Vw00zLtsP!^zTfDE9M1s3^n38!2swULk=za3s^$cL}^>B2F3$eH(oq7xE zX}a3CvP$%7Zo%ekHR#xocnYfMss>f7*txl%>=G^l|5qaaZ%oCH)-T>GCW}z){UE5R z9it2w@qn4j zrg?~z+b^u_Hx=qb;M$WxelJj0N_^{{=MrNnyPL}IaeO%nmhx1s?g_G(_G;K(S_r6K z`d`6}k?rj>oj91NDDMa6RnP$lY-o2;o{RT8i^MB@dkV;}d~#TH=s~tGyC^94T+jr* zk8pBabcVVx3cfQXB)hrFNtm$8~kYzgoxR*aL{}8?Nab+;N~!Vj;A&giHYiH zzbWsbQqk@-;CC+6kKXP{J+4FpWV^rFyoqCcf9ddoYXIiSVLoup!7IWY0eYdKnAs#qy^S(N4JOEF{`I6JNhIo++QDye<*)W{hb}J~$43c| z;z)~yJqv$%S>E~pdwV4*3Yv2>GG{F)U5I4*EYHtO&0K#}lSFRWo-dVqCBHtJ z-rBAweky;nfBWiu;tuGMyS?3=_4uHEI*D~ask8mgx-etZfhJk0W6CnS!i7dBSxM*m z>QiYjdK<=MQ`B8_?EfBpe$4*gqo^46N2U)y8cJ#q*`3wRJN3_=d+m{li|dMuYoRkR z?0Z-YlapF^I_}q;!^C*{eG>wXlf1sJBY>LMP$>l>RM@S#>Dnk5AiqD8EN*RY1l-ea z8{Oe;rv1B1bdv30i;#s{zE>UpF)p((kR3^tl*ev@Cn@o;OQLSmzRhdQJMAP#>)+ZM zo9jO-`25BEB|Se)2M$P;KsX-pPRRqf9#^zA>NcE`m0&2lXx``Uns2k)7*`~bWADa` zYFK|sit5?cK01dT9Y^b4H}|DrjnQyXx6}l~`C|Dul-Ae^2$od;gBIvFxj8g8IKP?G zn{vEon;DLN3LvBX1Vf3-U3msEl5T>0FO!!?eq@Ji+VA~?Xha8J6?^dyA0N$FooX^K z!QTuBY$>OwVL{>y$|ZS|7RA3W=p;}gH8Ko5+>jv#@6Vllw2G*b=s9ycOG*+P+Ey}I z&k8u0s2ObkDzs~Uv5W^j@W#DNoZY&dkLd)U>5uJ7UbSf>bL0JjHiSz3e6zk5$JeXO zV1p@kI(GgkWfFY+Igzi{N^E@-8e)h~jeZVd5z4I4pNT1k)vtlxGB6mP7e~+{GC~1p z?~KgHDbk8ygGu}|NfzGCt8<~lx>*gJr)85GsVGhl7KD-*H{AtYer}Q2^@n5d- zyg#8qd%9m+4l|xdOEZm_BaWW<7ymdE2}DiTThl1_xRFG?xQ41L5K&kn)2bV86aA$+ zYW~UinM>-`iLZ=j1JCyv8*OzNE>V82Ldn6@bmyn-Oq7t}h1~a|YfTz{_khV2rMbw- zL$HbSnw{1&zTrjVC!bNuAa9?N2`^K>dXKR3j+t$VIME))>C95nnQeW$iAS<%LOtRU zAHlvrj0YXuSg^h__1`mL5bY-)wd`MGp7oWEMJaulPwjGlJFgW-pbo?Bsk&z`DeDlt zIBK5R=vvq_qJd|~Iyuu(Oj&Q@jeDfM|F2g3eC$*k$ZtP3`wa1UAIDe1qW^>Epd$Ep z7|xEGvN8kw=Nl)kB;3o}q|9Q?^ES5wQ9sRQFT zr4`zGtW-zHuekedZB~O;<`(HfXASO28G{sR!WlCQUL2T#h$_v^$OETMd#%j*KgI2C zbYdc2zs3cXt-XxZ%LXIRr*E6==|v#3I+>b^Cnx44@Hf3PwKzzYguQJ>9C(SbtY1Ye|2&lZjFA8 zKd%b&varn$jQ2CvCOq`aT=M+fOdGB&1_flG&VE28xa+o^sa&g-l&ssQ6M&^Z&%SSY zA_Zvb#s~yr`F?9&WQm7l)U@-`;XPcxJ3$e7+Y+6Hy}$xNi;q%WM9LPT){+KX72fB* z;E4vLzn>B7py#}%_}Y{AokSH<=*$deWaM%=JbcOzMwe67fs z2cVEri*-DSGN#K~(gUf)5=UUO^_yPO=`9#aSf$gGkqxDr^>NS-G?G07 z0%XETc6YLRpyv%pVm4xYxjqc6NZ?d?gr%us(tIz_oFRn}B9uEK9m6t_HuG0Wso-H% z_xVfI!C?yg(*pi`R+>QXMbA5J*HzRryTi1;t_4L-Utb=zkd!=3q$*5T!7p+;38B@v zze=Et3t_uXdi(1LMREkMv(b+@|2v00K#gV?v|VHtk*8@K$Qn7jWp}+}@6|zrVmq$M z4|bx}jCpT-3smNhAEi)1gasC-URE`dgvZPOEN~}nbSI#T|Ip?c{qU-C)~;ZlgU>D4 z1+_lmP`RW#><=S3_j1Y~H2{L7T$smfS!FegkSh~H*iU#}BV^KX76pZB6hy`Al2NBQ z8W1mj!fJV^BGCg@&p)CgZy!pSUgW%5PgyySV+9JDIAWWh(tPXSZ!GwHDTaG8yw`Xd ziBi1-UNk7Z+sqU6vPRjSb|>CzWRJP_Fa@!w;oYu#9s2HYEnhSY1ROkwd6qxR%E2<= z!7^|OlU>Jr!;Yo=l6ONiYqG~Z5A53E>{eA{rScs8#`eWIE!Y9E9Mu#);%;*5K~(1XNZ9hFxy1sr_( zVb)%}|C`@PUIZ)?Gs;(dNvWe0sC3ohz3vfF#^uvIkySPh+I@C&Kj4$#bH>Wi0+h>b z{)P#mKLzJa(S+~LjqVpq{tL$+8NQPLgb7~DI98mUB1;RV|69L!Kc0YaY z_Dw4h3(neuU^g)}gRZx=^UbPQ5PEv^l2?E}JErH`E`(IV@y1(#e4kAj>>wx#12mRP zK5#C@fg|Nep{f0wpS@e7mPr=4+%!Y{i1?HLY{|GPzoYw!z0Z4ri|+H%S|;;oN~5HK z`S0SzeQrQWJi{4@7s&z^ZKl6%xG3Ol#`$`B)UY1+c$Xl>dvcomlhLg(N;y0Jl$X%6 z6pIy_26699HL8LC=y}hIRD2O!rogQjes_$SX+O6by;*$03Db#_*2~(z^vPM(0LCv! zLo`d1^;(4&S9rtyWkILSA1zOag5ab%D&qX^ks$eOj#x_mQDd+T*rhL(1H>Nt|E(V% zp6n}aJ(~^-Pk{%5{smPB$vX8bRygCQW~~XXx`dinI);Y<=zb-?<3z4DrZmdFMx5T= zs;T^?bgdQJ#fLQs#-h0M-n*>4LiS#2z_t|vtFV1pn(F-IL$?>Od9uqvPtq*N&OjR& zvvS*)eU=x6km0Yl@B3P{)br-V8$Z;$>DXfs!7&|xb_;rr|6l3;`BpSR^vr!NDp zMWPs%*EofK3Hqbt$#^>&$LRKJITr(R`&3yf%eN(lGg7vls-BlWT}xXxI0L9z!!HAs zSII=O4||mesu*FTMzfbFHGU^N5=m|aE_?Va5(I`S`K5nu8PO$t-;EtY2%t=QotDkC zSf+v~VX*mVIgZCI@P2xY%~uaffo*;!BgZ>OK2AI6OJygGz-g57t!$3b=6QZ`X9lB6 zmh*X~eD$xI4R6kkA8H(R(Gy0b=@N9%j8fL8u(ZDvAKgU z9y3k;<|VA2R>bKU8y%2|W+3#$wM3DKLvc@oZaz->}A$wNHwr~dDZo$uq7&eP|i_5SWP7=)6gF?)Zb z@oI^Yuq=f&>ght;ikvd7Jwa2jw}v#|;}yiF8A>VwTdZCfw5GNN*Zj%*4eoh*;<}dp zCgp>_<2ObJySDYa52{Hwyx|$7hnjMkuze-^dAsOEY+xV$JfF&N=+|+1cded7ez^Ve z^YEpdCQT^uV)f)r3MU0uw*G|T5%>4K)oLBIPq?Im+f(c~TV(t5f`_5VR#$7U+`eP^ zf0879&yBn>wvLl7dr%&BK}|iSn1aq%1yPb$>N#>e`6+SEg=1m#4_q^Ep#|6zY~SpH z6FD?5{lfQUw!Kt#MLG&H0}>hf@^H$GPOG?)Do+~WRk4M%)gyB$8N1;wrPVDZ-P;`5 zoS4^S zB=CgbV$_!$hdsX>ZyOGN(W(MxHOC%fjSqrjXaQ^F#8x_E%{YhjAPk>N;Hyy28DrtO zo~hu;Ai{|%o?aB?V@!f8#pqBmDV?2UXaX;>L1|vx9AixMAw(TKLM8a^p)sS}^;=D#(BnXv5sqNdG7X2MTh{NJFF3xT_N%jwHFs?;r_4pDs#yKCVDO= z$Zq0kYD@%ZDaB(yu7CrV^TE5}tpjaf`R`9=3LT+6pJ`&uarV^wqH{sKl}^jK56fv> zDem99E4q={gwGO}wDJLgtp$cX@Tcln7yGOB{QPO5$+cvrUu4evA|^Mjc;oPWJX4Cs zvYhogW+r(WuQl~DgP&1k8uv&sQ64ubAB!TzCf19iv6uDGyf`X%^$7VqIxurBqZ5qk zm-+|~e-5>a|Omlk6b3Laky;J7pCFe zmvMT+t3~S00iCJqi|gYSefGrDxR&HlDQc%=F|0I63@%deV$|Ie@ZfPS4G}%f7OT(Z z%q?+|1$VmiNrswnsM0G++cr9*gc&#AKibp4HXn%*EopJR=w($ez7_Q^{mA$9iE8Z7 z4cWgi?93#5q`INVN^MXCWi!M#s zaUA7^6mDz*y-p!wVU6-@+MD|_Db8mpR8#2^j{(O6k!;REpg<1eo|Q3=_lMNjUM{QgWd0f<019_=L>d$Dlao;iKYtlP$3_}gDgd3k;in# z+Z0R~l12m@1O5J;-n-Ikq-*&uFi1ROHxooCeW`d^ge~;;Rh6SZ`_!t}my`kxWr@u; z6t2E{?q(AsCfvW?!cu>|N{X-1n~~}SR$Uw#xI7G}ed0z)ekib{qsUZ7T2$a;cD~%n zjI9_l1XWxNSzN zhqz0)C};T{2&F&RQ6g05FSOh6$NuLefy*?>ojNu*CH{nQgNBf(t7u6L&mnAy#0cVD z2LXKrvzmBt4)qH$Mkh_R4CF*UjC~&TKbJDJ);o$tXy?B0KXQ z-@F$n?Ad$2%t1R4A%tVOh~cu4MN5jpQW{T;>Q|W~8-9a`pKLNsc(ETHW*p-D;dSy^ z+0)sxh7B21_RJ7VK?FXFZTj!G^Q^zs z?g`OKIy!G&fisY!cG56!TxuWp+>K<*E2UKrH$!@ulzSzj^MXI$R0;1o2EM;}2^LSl zWrD!S`yn`75J`SR@!-2k5YiwGSr#;TtvCnCJheZPhtyM0V;DtNR%Uf2OQ0h5;; zDLo@0YY&^DEi@g{-L(ny5^^PI`asI!nUbY+z?Kkh=c`A0~EW^qnC=rj68yA!_1W`FN4G3Fd_2i8Yq z?RQg|v<=%|GoRZ($+%J$)1G-V6-KuCTCdp_%QI)^F%Un6b|-uFDhZtaA6ef`Q4t$yay%M(US z+M|{or@R+e*05Ed?J12gPdmQrOnBJ&?GDYNdDB0?18hSyDbP{0G^Z60D`jKj#7$<> zPDzdh%Y3o$KN*4tZJ6__opgUD(#>orx$Q)IeNyy#bzh=A-ARk%EU)`iDPYe00vA`< zi|&se4OOYy-g@q_S5oIMuPSXH2T8xZ5)|msJgAd;yAt8dTLMB&!l(wJefiwC9nl+} z;fB;xgELnEUX%&9R-Q?Y5x-f!KrnUEfM<|2ybR>FO2-ET_W%fBPQ#$%MTUvhdAsW6 zYe}zXmjRf;I}5p${(h5Dy-UOq@`Q%nb|CpzR`AFANHbcMv-S}79ijC)T&B@LtUgK~^RBGGi=E-$N{XJ)A~VL17=ORC*QIsd@TM--QW zja_KA&Zg&}_JA|b2s1#Vp0nW1>_Xyr@+1h)$Sh}utue8D{R+^qFXEdc>$}xH+*gYl zkb9=F>tAdw+FKh5Vk+jK^5n$OYJl8eGqV}88H+haMhVRoDG}l*?@vB%*{85fO@*^c z_d`8%E1WbQkL7KLnN@H|0qW;}`^^u%=i(?-H6YhUyM>h@n|lWx3cPwndvk-LxcnAk zfU}gC4%qbGNBL{!AO2OH*$8RAEoGIAieGluXjTzFdN1_bJP^ehNTSPvZOSdK62+aK z3{m0{xS#%4g_Yur0Y~BZdBw8wH@=~@{i>qT56Nk5OO%#qLjvF}`+2D1$68pB zT$8d7=F!Exs#?x5Cr{;@bJwf$p?hxHM%n7N3}ic1m^a?v^8pRWmYVu%2UH0_glP?x z8IgM$4zCl1d)9)r*J@RS`j~>hWV_1k2H{f9AEC$W-#5j1@L~|hjBGi%0zd}x!L)04 z$M}2eyHd}y)H{p&MLTtWI$aHhUo9iZoTy2gsiz9Vb!vCL++NkJI0t(1(GI6wGXh3b zDbOjsas73zX8X!Hqu0rsD^HRU(iDxKJnAVJmfRe$x{>&jn&CIm6PDKLG9U9JDGCP_ zuQEnf9PBEt*gTE6Bo+d%Y!m5^WcA2shLSR9(VczrPqOLThe4fyxS!l;ikPa?bE?70 zcaZtQ!wWr#zMLv@IQ|^Hg3U^7`-TPZomEonAv~0OwA!P3bEXGOfFy@;sB(EeBqOqytytoB>-99#3QGsUK*)1f<9D?HV_ zH_#UgI7N%No(dw7dtk7;1w9{jFtmNL@lQTZiHbRoCHF0uGgl7*w^x5>ERyb}D`fa$ z@XTV0D0#qa_vdc^H!d84`$~1h7f+ANSAAW=274lj*}FiDA31s-oK=Vd>oI~N(dKd7 zw-L*dm!sB2n2v2CAav8|bT^9wF@%&E^kBe(!xIoUaj8xQGA4~{~=LC36&yK=(%{0{-ri$CHhlDEalRG~M zY1zDgQ+-GLH`&FAczEsF@T(WFxf}9#O|sY`b1VH6qTUXPnBrmw2MRKuUBC zy91H9{1yJ8_;Wy6{I_+s7x^<;pQyDeK`G05`ny{B{-8Ufyw<*b^nD0hn)mIO%16VO zUP3wwvm@C?ymX9&8HkJIhx;1&oI|0)vter0$X9EIX{0}SNo*2pRJ-(4iAD_g( z=@A8fjM3a!;Z_b0uvi7>sxwyBhMR>e)kusTstjG~Z z53x|C)^{Yk_8>1YY$ZIuoc?W|rIby6H9n+f4>bXqvSCXvA--IBvS|`t&E(4BNZAsk zeqpVzOWEGcXVXKGV7{BrV)W7~u zW|hH?+&REMVW^Fl+B;-->O^J zL9F5JWKc7Ixp`IpBJNpY{?4w(CVxr8GpWUhKC_zjub5c-&7i#i5*N3kSko8k*H2p` zTglNCcKw?)`gfLJ-8g@+D(|(M(HlITX9;@;gQp4lFzK7HR#(;jSfwzBppiMH{H>FQ zBg%8`ghAM!kz+Ox^*?yN0&7IY{Y_6aP-gFkW=jZ9tTd+YKbX_31)ZTGlJ zL~oB-K4wD4a)+uA)=|09&u(p4JV0~0SdcJWb55#Q8+LO0=1v{n?vwsC{IYnQTeaL> zY@Zul(l}kf`pTWmg)k4Gf$A{Zx-6cnI@6+{L)f(5AJN`Y7lg8<% zf4pO){k43bxAa-wo7=$zvTrOUvqQDgJIt?DtH*{%{EgesN%oY0Vu(!v62i0Wxd4q< z`m5!XM$KJV*gTQ~uCuE2vuvyGSH#w?vDdk4NTHK;Rg5AawcwP~wd_`*yT*y8L9Jsl z(jxHihEPVSMfR*>DFe<_heA}`o)HI~+-zJAVgF+T+O>_$`|p(d2!C6gd;QJf5Jf8q zxK3=1S0t$CCxrI}W6pLs%OsjbDd$I>D`S`K?(q=h6!jLG!F8L@x!yI=JEf5`(wA#Z z@rT)7SIH++g1G28>(H^*I1l6g0~jh74F3F{sc$Na)d$gYCbWF;&6ebs+SFHK>t}J4 zy^6KF*54XarX3xx)c(OIt3W2Stt^bb(e_7$y=XWo-XKFzj0Bfwj zMdJ^x%zB}d+k0&F1rGFdu?mODnxBk~IAEf3F87`~Uy| literal 0 HcmV?d00001 diff --git a/sdk/dotnet/pulumi-plugin.json b/sdk/dotnet/pulumi-plugin.json new file mode 100644 index 0000000..bc61944 --- /dev/null +++ b/sdk/dotnet/pulumi-plugin.json @@ -0,0 +1,5 @@ +{ + "resource": true, + "name": "pgedge", + "server": "github://api.github.com/pgEdge/pulumi-pgedge" +} diff --git a/sdk/python/Pulumi.yaml b/sdk/python/Pulumi.yaml new file mode 100644 index 0000000..e69de29 diff --git a/sdk/python/README.md b/sdk/python/README.md new file mode 100644 index 0000000..8702967 --- /dev/null +++ b/sdk/python/README.md @@ -0,0 +1,375 @@ +# pgEdge Pulumi Provider + +pgEdge + +The official Pulumi provider for [pgEdge Cloud](https://www.pgedge.com/cloud), designed to simplify the management of pgEdge Cloud resources using infrastructure as code. + +- **Documentation:** [pgEdge Pulumi Docs](https://www.pulumi.com/registry/packages/pgedge/) +- **Website:** [pgEdge](https://www.pgedge.com/) +- **Discuss:** [GitHub Issues](https://github.com/pgEdge/pulumi-pgedge/issues) + +## Prerequisites + +Before you begin, ensure you have the following tools installed: + +- [Pulumi CLI](https://www.pulumi.com/docs/get-started/install/) +- [Go](https://golang.org/doc/install) (version 1.18 or later) +- [pulumictl](https://github.com/pulumi/pulumictl) +- [golangci-lint](https://golangci-lint.run/usage/install/) +- [Node.js](https://nodejs.org/) (Active LTS or maintenance version, we recommend using [nvm](https://github.com/nvm-sh/nvm) to manage Node.js installations) +- [Yarn](https://yarnpkg.com/getting-started/install) +- [TypeScript](https://www.typescriptlang.org/download) + +## Installation + +To use this provider, you need to have Pulumi installed. If you haven't already, you can [install Pulumi here](https://www.pulumi.com/docs/get-started/install/). + +### Go + +```bash +go get github.com/pgEdge/pulumi-pgedge/sdk/go/pgedge +``` + +### Node.js + +```bash +npm install @pgEdge/pulumi-pgedge +``` + +## Configuration + +Before using the provider, you need to configure your pgEdge credentials. Set the following environment variables: + +```sh +export PGEDGE_CLIENT_ID="your-client-id" +export PGEDGE_CLIENT_SECRET="your-client-secret" +``` + +These credentials authenticate the Pulumi provider with your pgEdge Cloud account. + +## Getting Started + +### Creating a New Pulumi Project + +1. Create a new directory for your project: + +```bash +mkdir pgedge-pulumi-project && cd pgedge-pulumi-project +``` + +2. Initialize a new Pulumi project: + +```bash +pulumi new typescript +``` + +Follow the prompts to set up your project. + +3. Install the pgEdge provider: + +```bash +npm install @pgedge/pulumi-pgedge +``` + +4. Update your `Pulumi.yaml` file to include the pgEdge provider: + +```yaml +name: pgedge-pulumi-project +runtime: nodejs +description: A new Pulumi project using pgEdge +plugins: + providers: + - name: pgedge + path: ./node_modules/@pgEdge/pulumi-pgedge +``` + +### Writing Your Pulumi Program + +Replace the contents of `index.ts` with the following: + +```typescript +import * as pulumi from "@pulumi/pulumi"; +import * as pgedge from "@pgEdge/pulumi-pgedge"; + +// Create an SSH Key +const sshKey = new pgedge.SSHKey("exampleSSHKey", { + name: "example", + publicKey: "ssh-ed25519 AAAAC3NzaC1lZsdw877237ICXfT63i04t5fvvlGesddwed21VG7DkyxvyXbYQNhKP/rSeLY user@example.com", +}); + +// Create a Cloud Account +const cloudAccount = new pgedge.CloudAccount("exampleCloudAccount", { + name: "my-aws-account", + type: "aws", + description: "My AWS Cloud Account", + credentials: { + role_arn: "arn:aws:iam::21112529deae39:role/pgedge-135232c", + }, +}, { + dependsOn: [sshKey] +}); + +// Create a Backup Store +const backupStore = new pgedge.BackupStore("exampleBackupStore", { + name: "example", + cloudAccountId: cloudAccount.id, + region: "us-west-2", +}, { + dependsOn: [cloudAccount] +}); + +// Create a Cluster +const cluster = new pgedge.Cluster("exampleCluster", { + name: "example", + cloudAccountId: cloudAccount.id, + regions: ["us-west-2", "us-east-1", "eu-central-1"], + nodeLocation: "public", + sshKeyId: sshKey.id, + backupStoreIds: [backupStore.id], + nodes: [ + { + name: "n1", + region: "us-west-2", + instanceType: "r6g.medium", + volumeSize: 100, + volumeType: "gp2", + }, + { + name: "n2", + region: "us-east-1", + instanceType: "r6g.medium", + volumeSize: 100, + volumeType: "gp2", + }, + { + name: "n3", + region: "eu-central-1", + instanceType: "r6g.medium", + volumeSize: 100, + volumeType: "gp2", + }, + ], + networks: [ + { + region: "us-west-2", + cidr: "10.1.0.0/16", + publicSubnets: ["10.1.0.0/24"], + // privateSubnets: ["10.1.0.0/24"], + }, + { + region: "us-east-1", + cidr: "10.2.0.0/16", + publicSubnets: ["10.2.0.0/24"], + // privateSubnets: ["10.2.0.0/24"], + }, + { + region: "eu-central-1", + cidr: "10.3.0.0/16", + publicSubnets: ["10.3.0.0/24"], + // privateSubnets: ["10.3.0.0/24"], + }, + ], + firewallRules: [ + { + name: "postgres", + port: 5432, + sources: ["123.456.789.0/32"], + }, + ], +}, { + dependsOn: [sshKey, cloudAccount, backupStore] +}); + +// Create a Database +const database = new pgedge.Database("exampleDatabase", { + name: "example", + clusterId: cluster.id, + options: [ + "autoddl:enabled", + "install:northwind", + "rest:enabled", + ], + extensions: { + autoManage: true, + requesteds: [ + "postgis", + ], + }, + nodes: { + n1: { + name: "n1", + }, + n2: { + name: "n2", + }, + n3: { + name: "n3", + }, + }, + backups: { + provider: "pgbackrest", + configs: [ + { + id: "default", + schedules: [ + { + id: "daily-full-backup", + cronExpression: "0 1 * * *", + type: "full", + }, + { + id: "hourly-incr-backup", + cronExpression: "0 * * * ?", + type: "incr", + }, + ] + }, + ] + }, +}, { + dependsOn: [cluster] +}); + +// Export resource IDs +export const sshKeyId = sshKey.id; +export const cloudAccountId = cloudAccount.id; +export const backupStoreId = backupStore.id; +export const clusterId = cluster.id; +export const clusterStatus = cluster.status; +export const clusterCreatedAt = cluster.createdAt; +export const databaseId = database.id; +export const databaseStatus = database.status; + +// Optional: Log outputs +pulumi.all([ + sshKeyId, + cloudAccountId, + backupStoreId, + clusterId, + clusterStatus, + clusterCreatedAt, + databaseId, + databaseStatus +]).apply(([ + sshId, + accountId, + backupId, + cId, + cStatus, + cCreatedAt, + dbId, + dbStatus +]) => { + console.log({ + sshKeyId: sshId, + cloudAccountId: accountId, + backupStoreId: backupId, + clusterId: cId, + clusterStatus: cStatus, + clusterCreatedAt: cCreatedAt, + databaseId: dbId, + databaseStatus: dbStatus + }); +}); +``` + +### Deploying Your Infrastructure + +To deploy your infrastructure: + +1. Set up your pgEdge credentials as environment variables. +2. Run the following command: + +```bash +pulumi up +``` + +Review the changes and confirm the deployment. + +## Updating Resources + +### Updating a Database + +To update a database, you can modify properties such as `options`, `extensions`, or `nodes`. Here's an example of adding a new extension and removing a node. (Make sure to update one property at a time): + +```typescript +const database = new pgedge.Database("exampleDatabase", { + // ... other properties ... + options: [ + "install:northwind", + "rest:enabled", + "autoddl:enabled", + "cloudwatch_metrics:enabled", // New option + ], + extensions: { + autoManage: true, + requesteds: [ + "postgis", + "vector", // New extension + ], + }, + nodes: { + n1: { + name: "n1", + }, + n3: { + name: "n3", + }, + }, + // ... other properties ... +}); +``` + +### Updating a Cluster + +To update an existing cluster, such as adding or removing nodes, you can modify the `nodes`, `regions`, and `networks` arrays in your Pulumi program. Here's an example of removing a node: + +```typescript +const cluster = new pgedge.Cluster("exampleCluster", { + // ... other properties ... + nodes: [ + { + name: "n1", + region: "us-west-2", + instanceType: "r6g.medium", + volumeSize: 100, + volumeType: "gp2", + }, + { + name: "n3", + region: "eu-central-1", + instanceType: "r6g.medium", + volumeSize: 100, + volumeType: "gp2", + }, + ], + regions: ["us-west-2", "eu-central-1"], + networks: [ + { + region: "us-west-2", + cidr: "10.1.0.0/16", + publicSubnets: ["10.1.0.0/24"], + // privateSubnets: ["10.1.0.0/24"], + }, + { + region: "eu-central-1", + cidr: "10.3.0.0/16", + publicSubnets: ["10.3.0.0/24"], + // privateSubnets: ["10.3.0.0/24"], + }, + ], + // ... other properties ... +}); +``` + +After making these changes, run `pulumi up` to apply the updates to your infrastructure. + +You can find more examples in the [examples](examples/) directory. + +## Contributing + +We welcome contributions from the community. Please review our [contribution guidelines](CONTRIBUTING.md) for more information on how to get started. + +## License + +This project is licensed under the Apache License. See the [LICENSE](LICENSE) file for details. \ No newline at end of file diff --git a/sdk/python/pgEdge_pulumi_pgedge/README.md b/sdk/python/pgEdge_pulumi_pgedge/README.md new file mode 100644 index 0000000..f655646 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/README.md @@ -0,0 +1,4 @@ +> This provider is a derived work of the [Terraform Provider](https://github.com/pgEdge/terraform-provider-pgedge) +> distributed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/). If you encounter a bug or missing feature, +> first check the [`pulumi-pgedge` repo](https://github.com/pgEdge/pulumi-pgedge/issues); however, if that doesn't turn up anything, +> please consult the source [`terraform-provider-pgedge` repo](https://github.com/pgEdge/terraform-provider-pgedge/issues). \ No newline at end of file diff --git a/sdk/python/pgEdge_pulumi_pgedge/__init__.py b/sdk/python/pgEdge_pulumi_pgedge/__init__.py new file mode 100644 index 0000000..b84bb62 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/__init__.py @@ -0,0 +1,84 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +from . import _utilities +import typing +# Export this package's modules as members: +from .backup_store import * +from .cloud_account import * +from .cluster import * +from .database import * +from .get_backup_stores import * +from .get_cloud_accounts import * +from .get_clusters import * +from .get_databases import * +from .get_ssh_keys import * +from .provider import * +from .ssh_key import * +from ._inputs import * +from . import outputs + +# Make subpackages available: +if typing.TYPE_CHECKING: + import pgEdge_pulumi_pgedge.config as __config + config = __config +else: + config = _utilities.lazy_import('pgEdge_pulumi_pgedge.config') + +_utilities.register( + resource_modules=""" +[ + { + "pkg": "pgedge", + "mod": "index/backupStore", + "fqn": "pgEdge_pulumi_pgedge", + "classes": { + "pgedge:index/backupStore:BackupStore": "BackupStore" + } + }, + { + "pkg": "pgedge", + "mod": "index/cloudAccount", + "fqn": "pgEdge_pulumi_pgedge", + "classes": { + "pgedge:index/cloudAccount:CloudAccount": "CloudAccount" + } + }, + { + "pkg": "pgedge", + "mod": "index/cluster", + "fqn": "pgEdge_pulumi_pgedge", + "classes": { + "pgedge:index/cluster:Cluster": "Cluster" + } + }, + { + "pkg": "pgedge", + "mod": "index/database", + "fqn": "pgEdge_pulumi_pgedge", + "classes": { + "pgedge:index/database:Database": "Database" + } + }, + { + "pkg": "pgedge", + "mod": "index/sSHKey", + "fqn": "pgEdge_pulumi_pgedge", + "classes": { + "pgedge:index/sSHKey:SSHKey": "SSHKey" + } + } +] +""", + resource_packages=""" +[ + { + "pkg": "pgedge", + "token": "pulumi:providers:pgedge", + "fqn": "pgEdge_pulumi_pgedge", + "class": "Provider" + } +] +""" +) diff --git a/sdk/python/pgEdge_pulumi_pgedge/_inputs.py b/sdk/python/pgEdge_pulumi_pgedge/_inputs.py new file mode 100644 index 0000000..4e7947a --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/_inputs.py @@ -0,0 +1,1289 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities + +__all__ = [ + 'ClusterFirewallRuleArgs', + 'ClusterNetworkArgs', + 'ClusterNodeArgs', + 'DatabaseBackupsArgs', + 'DatabaseBackupsConfigArgs', + 'DatabaseBackupsConfigRepositoryArgs', + 'DatabaseBackupsConfigScheduleArgs', + 'DatabaseComponentArgs', + 'DatabaseExtensionsArgs', + 'DatabaseNodesArgs', + 'DatabaseNodesConnectionArgs', + 'DatabaseNodesExtensionsArgs', + 'DatabaseNodesLocationArgs', + 'DatabaseNodesRegionArgs', + 'DatabaseRoleArgs', +] + +@pulumi.input_type +class ClusterFirewallRuleArgs: + def __init__(__self__, *, + name: pulumi.Input[str], + port: pulumi.Input[int], + sources: pulumi.Input[Sequence[pulumi.Input[str]]]): + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "port", port) + pulumi.set(__self__, "sources", sources) + + @property + @pulumi.getter + def name(self) -> pulumi.Input[str]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: pulumi.Input[str]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def port(self) -> pulumi.Input[int]: + return pulumi.get(self, "port") + + @port.setter + def port(self, value: pulumi.Input[int]): + pulumi.set(self, "port", value) + + @property + @pulumi.getter + def sources(self) -> pulumi.Input[Sequence[pulumi.Input[str]]]: + return pulumi.get(self, "sources") + + @sources.setter + def sources(self, value: pulumi.Input[Sequence[pulumi.Input[str]]]): + pulumi.set(self, "sources", value) + + +@pulumi.input_type +class ClusterNetworkArgs: + def __init__(__self__, *, + cidr: pulumi.Input[str], + public_subnets: pulumi.Input[Sequence[pulumi.Input[str]]], + region: pulumi.Input[str], + external: Optional[pulumi.Input[bool]] = None, + external_id: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + private_subnets: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None): + """ + :param pulumi.Input[str] cidr: CIDR of the network + :param pulumi.Input[Sequence[pulumi.Input[str]]] public_subnets: List of public subnets + :param pulumi.Input[str] region: Region of the network + :param pulumi.Input[bool] external: Whether the network is external + :param pulumi.Input[str] external_id: External ID of the network + :param pulumi.Input[str] name: Name of the network + :param pulumi.Input[Sequence[pulumi.Input[str]]] private_subnets: List of private subnets + """ + pulumi.set(__self__, "cidr", cidr) + pulumi.set(__self__, "public_subnets", public_subnets) + pulumi.set(__self__, "region", region) + if external is not None: + pulumi.set(__self__, "external", external) + if external_id is not None: + pulumi.set(__self__, "external_id", external_id) + if name is not None: + pulumi.set(__self__, "name", name) + if private_subnets is not None: + pulumi.set(__self__, "private_subnets", private_subnets) + + @property + @pulumi.getter + def cidr(self) -> pulumi.Input[str]: + """ + CIDR of the network + """ + return pulumi.get(self, "cidr") + + @cidr.setter + def cidr(self, value: pulumi.Input[str]): + pulumi.set(self, "cidr", value) + + @property + @pulumi.getter(name="publicSubnets") + def public_subnets(self) -> pulumi.Input[Sequence[pulumi.Input[str]]]: + """ + List of public subnets + """ + return pulumi.get(self, "public_subnets") + + @public_subnets.setter + def public_subnets(self, value: pulumi.Input[Sequence[pulumi.Input[str]]]): + pulumi.set(self, "public_subnets", value) + + @property + @pulumi.getter + def region(self) -> pulumi.Input[str]: + """ + Region of the network + """ + return pulumi.get(self, "region") + + @region.setter + def region(self, value: pulumi.Input[str]): + pulumi.set(self, "region", value) + + @property + @pulumi.getter + def external(self) -> Optional[pulumi.Input[bool]]: + """ + Whether the network is external + """ + return pulumi.get(self, "external") + + @external.setter + def external(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "external", value) + + @property + @pulumi.getter(name="externalId") + def external_id(self) -> Optional[pulumi.Input[str]]: + """ + External ID of the network + """ + return pulumi.get(self, "external_id") + + @external_id.setter + def external_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "external_id", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + """ + Name of the network + """ + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter(name="privateSubnets") + def private_subnets(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + """ + List of private subnets + """ + return pulumi.get(self, "private_subnets") + + @private_subnets.setter + def private_subnets(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "private_subnets", value) + + +@pulumi.input_type +class ClusterNodeArgs: + def __init__(__self__, *, + instance_type: pulumi.Input[str], + name: pulumi.Input[str], + region: pulumi.Input[str], + availability_zone: Optional[pulumi.Input[str]] = None, + volume_iops: Optional[pulumi.Input[int]] = None, + volume_size: Optional[pulumi.Input[int]] = None, + volume_type: Optional[pulumi.Input[str]] = None): + pulumi.set(__self__, "instance_type", instance_type) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "region", region) + if availability_zone is not None: + pulumi.set(__self__, "availability_zone", availability_zone) + if volume_iops is not None: + pulumi.set(__self__, "volume_iops", volume_iops) + if volume_size is not None: + pulumi.set(__self__, "volume_size", volume_size) + if volume_type is not None: + pulumi.set(__self__, "volume_type", volume_type) + + @property + @pulumi.getter(name="instanceType") + def instance_type(self) -> pulumi.Input[str]: + return pulumi.get(self, "instance_type") + + @instance_type.setter + def instance_type(self, value: pulumi.Input[str]): + pulumi.set(self, "instance_type", value) + + @property + @pulumi.getter + def name(self) -> pulumi.Input[str]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: pulumi.Input[str]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def region(self) -> pulumi.Input[str]: + return pulumi.get(self, "region") + + @region.setter + def region(self, value: pulumi.Input[str]): + pulumi.set(self, "region", value) + + @property + @pulumi.getter(name="availabilityZone") + def availability_zone(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "availability_zone") + + @availability_zone.setter + def availability_zone(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "availability_zone", value) + + @property + @pulumi.getter(name="volumeIops") + def volume_iops(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "volume_iops") + + @volume_iops.setter + def volume_iops(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "volume_iops", value) + + @property + @pulumi.getter(name="volumeSize") + def volume_size(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "volume_size") + + @volume_size.setter + def volume_size(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "volume_size", value) + + @property + @pulumi.getter(name="volumeType") + def volume_type(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "volume_type") + + @volume_type.setter + def volume_type(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "volume_type", value) + + +@pulumi.input_type +class DatabaseBackupsArgs: + def __init__(__self__, *, + configs: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigArgs']]]] = None, + provider: Optional[pulumi.Input[str]] = None): + """ + :param pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigArgs']]] configs: List of backup configurations. + :param pulumi.Input[str] provider: The backup provider. + """ + if configs is not None: + pulumi.set(__self__, "configs", configs) + if provider is not None: + pulumi.set(__self__, "provider", provider) + + @property + @pulumi.getter + def configs(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigArgs']]]]: + """ + List of backup configurations. + """ + return pulumi.get(self, "configs") + + @configs.setter + def configs(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigArgs']]]]): + pulumi.set(self, "configs", value) + + @property + @pulumi.getter + def provider(self) -> Optional[pulumi.Input[str]]: + """ + The backup provider. + """ + return pulumi.get(self, "provider") + + @provider.setter + def provider(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "provider", value) + + +@pulumi.input_type +class DatabaseBackupsConfigArgs: + def __init__(__self__, *, + id: Optional[pulumi.Input[str]] = None, + node_name: Optional[pulumi.Input[str]] = None, + repositories: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigRepositoryArgs']]]] = None, + schedules: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigScheduleArgs']]]] = None): + """ + :param pulumi.Input[str] id: Unique identifier for the backup config. + :param pulumi.Input[str] node_name: Name of the node. + :param pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigRepositoryArgs']]] repositories: List of backup repositories. + :param pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigScheduleArgs']]] schedules: List of backup schedules. + """ + if id is not None: + pulumi.set(__self__, "id", id) + if node_name is not None: + pulumi.set(__self__, "node_name", node_name) + if repositories is not None: + pulumi.set(__self__, "repositories", repositories) + if schedules is not None: + pulumi.set(__self__, "schedules", schedules) + + @property + @pulumi.getter + def id(self) -> Optional[pulumi.Input[str]]: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @id.setter + def id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "id", value) + + @property + @pulumi.getter(name="nodeName") + def node_name(self) -> Optional[pulumi.Input[str]]: + """ + Name of the node. + """ + return pulumi.get(self, "node_name") + + @node_name.setter + def node_name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "node_name", value) + + @property + @pulumi.getter + def repositories(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigRepositoryArgs']]]]: + """ + List of backup repositories. + """ + return pulumi.get(self, "repositories") + + @repositories.setter + def repositories(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigRepositoryArgs']]]]): + pulumi.set(self, "repositories", value) + + @property + @pulumi.getter + def schedules(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigScheduleArgs']]]]: + """ + List of backup schedules. + """ + return pulumi.get(self, "schedules") + + @schedules.setter + def schedules(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseBackupsConfigScheduleArgs']]]]): + pulumi.set(self, "schedules", value) + + +@pulumi.input_type +class DatabaseBackupsConfigRepositoryArgs: + def __init__(__self__, *, + azure_account: Optional[pulumi.Input[str]] = None, + azure_container: Optional[pulumi.Input[str]] = None, + azure_endpoint: Optional[pulumi.Input[str]] = None, + backup_store_id: Optional[pulumi.Input[str]] = None, + base_path: Optional[pulumi.Input[str]] = None, + gcs_bucket: Optional[pulumi.Input[str]] = None, + gcs_endpoint: Optional[pulumi.Input[str]] = None, + id: Optional[pulumi.Input[str]] = None, + retention_full: Optional[pulumi.Input[int]] = None, + retention_full_type: Optional[pulumi.Input[str]] = None, + s3_bucket: Optional[pulumi.Input[str]] = None, + s3_endpoint: Optional[pulumi.Input[str]] = None, + s3_region: Optional[pulumi.Input[str]] = None, + type: Optional[pulumi.Input[str]] = None): + """ + :param pulumi.Input[str] azure_account: Azure account for azure-type repositories. + :param pulumi.Input[str] azure_container: Azure container for azure-type repositories. + :param pulumi.Input[str] azure_endpoint: Azure endpoint for azure-type repositories. + :param pulumi.Input[str] backup_store_id: ID of the backup store to use. If specified, other fields will be automatically populated. + :param pulumi.Input[str] base_path: Base path for the repository. + :param pulumi.Input[str] gcs_bucket: GCS bucket name for gcs-type repositories. + :param pulumi.Input[str] gcs_endpoint: GCS endpoint for gcs-type repositories. + :param pulumi.Input[str] id: Unique identifier for the backup config. + :param pulumi.Input[int] retention_full: Retention period for full backups. + :param pulumi.Input[str] retention_full_type: Type of retention for full backups. + :param pulumi.Input[str] s3_bucket: S3 bucket name for s3-type repositories. + :param pulumi.Input[str] s3_endpoint: S3 endpoint for s3-type repositories. + :param pulumi.Input[str] s3_region: S3 region for s3-type repositories. + :param pulumi.Input[str] type: Repository type (e.g., s3, gcs, azure). + """ + if azure_account is not None: + pulumi.set(__self__, "azure_account", azure_account) + if azure_container is not None: + pulumi.set(__self__, "azure_container", azure_container) + if azure_endpoint is not None: + pulumi.set(__self__, "azure_endpoint", azure_endpoint) + if backup_store_id is not None: + pulumi.set(__self__, "backup_store_id", backup_store_id) + if base_path is not None: + pulumi.set(__self__, "base_path", base_path) + if gcs_bucket is not None: + pulumi.set(__self__, "gcs_bucket", gcs_bucket) + if gcs_endpoint is not None: + pulumi.set(__self__, "gcs_endpoint", gcs_endpoint) + if id is not None: + pulumi.set(__self__, "id", id) + if retention_full is not None: + pulumi.set(__self__, "retention_full", retention_full) + if retention_full_type is not None: + pulumi.set(__self__, "retention_full_type", retention_full_type) + if s3_bucket is not None: + pulumi.set(__self__, "s3_bucket", s3_bucket) + if s3_endpoint is not None: + pulumi.set(__self__, "s3_endpoint", s3_endpoint) + if s3_region is not None: + pulumi.set(__self__, "s3_region", s3_region) + if type is not None: + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="azureAccount") + def azure_account(self) -> Optional[pulumi.Input[str]]: + """ + Azure account for azure-type repositories. + """ + return pulumi.get(self, "azure_account") + + @azure_account.setter + def azure_account(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "azure_account", value) + + @property + @pulumi.getter(name="azureContainer") + def azure_container(self) -> Optional[pulumi.Input[str]]: + """ + Azure container for azure-type repositories. + """ + return pulumi.get(self, "azure_container") + + @azure_container.setter + def azure_container(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "azure_container", value) + + @property + @pulumi.getter(name="azureEndpoint") + def azure_endpoint(self) -> Optional[pulumi.Input[str]]: + """ + Azure endpoint for azure-type repositories. + """ + return pulumi.get(self, "azure_endpoint") + + @azure_endpoint.setter + def azure_endpoint(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "azure_endpoint", value) + + @property + @pulumi.getter(name="backupStoreId") + def backup_store_id(self) -> Optional[pulumi.Input[str]]: + """ + ID of the backup store to use. If specified, other fields will be automatically populated. + """ + return pulumi.get(self, "backup_store_id") + + @backup_store_id.setter + def backup_store_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "backup_store_id", value) + + @property + @pulumi.getter(name="basePath") + def base_path(self) -> Optional[pulumi.Input[str]]: + """ + Base path for the repository. + """ + return pulumi.get(self, "base_path") + + @base_path.setter + def base_path(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "base_path", value) + + @property + @pulumi.getter(name="gcsBucket") + def gcs_bucket(self) -> Optional[pulumi.Input[str]]: + """ + GCS bucket name for gcs-type repositories. + """ + return pulumi.get(self, "gcs_bucket") + + @gcs_bucket.setter + def gcs_bucket(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "gcs_bucket", value) + + @property + @pulumi.getter(name="gcsEndpoint") + def gcs_endpoint(self) -> Optional[pulumi.Input[str]]: + """ + GCS endpoint for gcs-type repositories. + """ + return pulumi.get(self, "gcs_endpoint") + + @gcs_endpoint.setter + def gcs_endpoint(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "gcs_endpoint", value) + + @property + @pulumi.getter + def id(self) -> Optional[pulumi.Input[str]]: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @id.setter + def id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "id", value) + + @property + @pulumi.getter(name="retentionFull") + def retention_full(self) -> Optional[pulumi.Input[int]]: + """ + Retention period for full backups. + """ + return pulumi.get(self, "retention_full") + + @retention_full.setter + def retention_full(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "retention_full", value) + + @property + @pulumi.getter(name="retentionFullType") + def retention_full_type(self) -> Optional[pulumi.Input[str]]: + """ + Type of retention for full backups. + """ + return pulumi.get(self, "retention_full_type") + + @retention_full_type.setter + def retention_full_type(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "retention_full_type", value) + + @property + @pulumi.getter(name="s3Bucket") + def s3_bucket(self) -> Optional[pulumi.Input[str]]: + """ + S3 bucket name for s3-type repositories. + """ + return pulumi.get(self, "s3_bucket") + + @s3_bucket.setter + def s3_bucket(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "s3_bucket", value) + + @property + @pulumi.getter(name="s3Endpoint") + def s3_endpoint(self) -> Optional[pulumi.Input[str]]: + """ + S3 endpoint for s3-type repositories. + """ + return pulumi.get(self, "s3_endpoint") + + @s3_endpoint.setter + def s3_endpoint(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "s3_endpoint", value) + + @property + @pulumi.getter(name="s3Region") + def s3_region(self) -> Optional[pulumi.Input[str]]: + """ + S3 region for s3-type repositories. + """ + return pulumi.get(self, "s3_region") + + @s3_region.setter + def s3_region(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "s3_region", value) + + @property + @pulumi.getter + def type(self) -> Optional[pulumi.Input[str]]: + """ + Repository type (e.g., s3, gcs, azure). + """ + return pulumi.get(self, "type") + + @type.setter + def type(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "type", value) + + +@pulumi.input_type +class DatabaseBackupsConfigScheduleArgs: + def __init__(__self__, *, + cron_expression: pulumi.Input[str], + id: pulumi.Input[str], + type: pulumi.Input[str]): + """ + :param pulumi.Input[str] cron_expression: Cron expression for the schedule. + :param pulumi.Input[str] id: Unique identifier for the backup config. + :param pulumi.Input[str] type: Repository type (e.g., s3, gcs, azure). + """ + pulumi.set(__self__, "cron_expression", cron_expression) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="cronExpression") + def cron_expression(self) -> pulumi.Input[str]: + """ + Cron expression for the schedule. + """ + return pulumi.get(self, "cron_expression") + + @cron_expression.setter + def cron_expression(self, value: pulumi.Input[str]): + pulumi.set(self, "cron_expression", value) + + @property + @pulumi.getter + def id(self) -> pulumi.Input[str]: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @id.setter + def id(self, value: pulumi.Input[str]): + pulumi.set(self, "id", value) + + @property + @pulumi.getter + def type(self) -> pulumi.Input[str]: + """ + Repository type (e.g., s3, gcs, azure). + """ + return pulumi.get(self, "type") + + @type.setter + def type(self, value: pulumi.Input[str]): + pulumi.set(self, "type", value) + + +@pulumi.input_type +class DatabaseComponentArgs: + def __init__(__self__, *, + id: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + release_date: Optional[pulumi.Input[str]] = None, + status: Optional[pulumi.Input[str]] = None, + version: Optional[pulumi.Input[str]] = None): + if id is not None: + pulumi.set(__self__, "id", id) + if name is not None: + pulumi.set(__self__, "name", name) + if release_date is not None: + pulumi.set(__self__, "release_date", release_date) + if status is not None: + pulumi.set(__self__, "status", status) + if version is not None: + pulumi.set(__self__, "version", version) + + @property + @pulumi.getter + def id(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "id") + + @id.setter + def id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "id", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter(name="releaseDate") + def release_date(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "release_date") + + @release_date.setter + def release_date(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "release_date", value) + + @property + @pulumi.getter + def status(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "status") + + @status.setter + def status(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "status", value) + + @property + @pulumi.getter + def version(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "version") + + @version.setter + def version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "version", value) + + +@pulumi.input_type +class DatabaseExtensionsArgs: + def __init__(__self__, *, + auto_manage: Optional[pulumi.Input[bool]] = None, + availables: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + requesteds: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None): + if auto_manage is not None: + pulumi.set(__self__, "auto_manage", auto_manage) + if availables is not None: + pulumi.set(__self__, "availables", availables) + if requesteds is not None: + pulumi.set(__self__, "requesteds", requesteds) + + @property + @pulumi.getter(name="autoManage") + def auto_manage(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "auto_manage") + + @auto_manage.setter + def auto_manage(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "auto_manage", value) + + @property + @pulumi.getter + def availables(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "availables") + + @availables.setter + def availables(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "availables", value) + + @property + @pulumi.getter + def requesteds(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "requesteds") + + @requesteds.setter + def requesteds(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "requesteds", value) + + +@pulumi.input_type +class DatabaseNodesArgs: + def __init__(__self__, *, + name: pulumi.Input[str], + connection: Optional[pulumi.Input['DatabaseNodesConnectionArgs']] = None, + extensions: Optional[pulumi.Input['DatabaseNodesExtensionsArgs']] = None, + location: Optional[pulumi.Input['DatabaseNodesLocationArgs']] = None, + region: Optional[pulumi.Input['DatabaseNodesRegionArgs']] = None): + pulumi.set(__self__, "name", name) + if connection is not None: + pulumi.set(__self__, "connection", connection) + if extensions is not None: + pulumi.set(__self__, "extensions", extensions) + if location is not None: + pulumi.set(__self__, "location", location) + if region is not None: + pulumi.set(__self__, "region", region) + + @property + @pulumi.getter + def name(self) -> pulumi.Input[str]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: pulumi.Input[str]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def connection(self) -> Optional[pulumi.Input['DatabaseNodesConnectionArgs']]: + return pulumi.get(self, "connection") + + @connection.setter + def connection(self, value: Optional[pulumi.Input['DatabaseNodesConnectionArgs']]): + pulumi.set(self, "connection", value) + + @property + @pulumi.getter + def extensions(self) -> Optional[pulumi.Input['DatabaseNodesExtensionsArgs']]: + return pulumi.get(self, "extensions") + + @extensions.setter + def extensions(self, value: Optional[pulumi.Input['DatabaseNodesExtensionsArgs']]): + pulumi.set(self, "extensions", value) + + @property + @pulumi.getter + def location(self) -> Optional[pulumi.Input['DatabaseNodesLocationArgs']]: + return pulumi.get(self, "location") + + @location.setter + def location(self, value: Optional[pulumi.Input['DatabaseNodesLocationArgs']]): + pulumi.set(self, "location", value) + + @property + @pulumi.getter + def region(self) -> Optional[pulumi.Input['DatabaseNodesRegionArgs']]: + return pulumi.get(self, "region") + + @region.setter + def region(self, value: Optional[pulumi.Input['DatabaseNodesRegionArgs']]): + pulumi.set(self, "region", value) + + +@pulumi.input_type +class DatabaseNodesConnectionArgs: + def __init__(__self__, *, + database: Optional[pulumi.Input[str]] = None, + external_ip_address: Optional[pulumi.Input[str]] = None, + host: Optional[pulumi.Input[str]] = None, + internal_host: Optional[pulumi.Input[str]] = None, + internal_ip_address: Optional[pulumi.Input[str]] = None, + password: Optional[pulumi.Input[str]] = None, + port: Optional[pulumi.Input[int]] = None, + username: Optional[pulumi.Input[str]] = None): + if database is not None: + pulumi.set(__self__, "database", database) + if external_ip_address is not None: + pulumi.set(__self__, "external_ip_address", external_ip_address) + if host is not None: + pulumi.set(__self__, "host", host) + if internal_host is not None: + pulumi.set(__self__, "internal_host", internal_host) + if internal_ip_address is not None: + pulumi.set(__self__, "internal_ip_address", internal_ip_address) + if password is not None: + pulumi.set(__self__, "password", password) + if port is not None: + pulumi.set(__self__, "port", port) + if username is not None: + pulumi.set(__self__, "username", username) + + @property + @pulumi.getter + def database(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "database") + + @database.setter + def database(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "database", value) + + @property + @pulumi.getter(name="externalIpAddress") + def external_ip_address(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "external_ip_address") + + @external_ip_address.setter + def external_ip_address(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "external_ip_address", value) + + @property + @pulumi.getter + def host(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "host") + + @host.setter + def host(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "host", value) + + @property + @pulumi.getter(name="internalHost") + def internal_host(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "internal_host") + + @internal_host.setter + def internal_host(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "internal_host", value) + + @property + @pulumi.getter(name="internalIpAddress") + def internal_ip_address(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "internal_ip_address") + + @internal_ip_address.setter + def internal_ip_address(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "internal_ip_address", value) + + @property + @pulumi.getter + def password(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "password") + + @password.setter + def password(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "password", value) + + @property + @pulumi.getter + def port(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "port") + + @port.setter + def port(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "port", value) + + @property + @pulumi.getter + def username(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "username") + + @username.setter + def username(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "username", value) + + +@pulumi.input_type +class DatabaseNodesExtensionsArgs: + def __init__(__self__, *, + errors: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + installeds: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None): + if errors is not None: + pulumi.set(__self__, "errors", errors) + if installeds is not None: + pulumi.set(__self__, "installeds", installeds) + + @property + @pulumi.getter + def errors(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]: + return pulumi.get(self, "errors") + + @errors.setter + def errors(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]): + pulumi.set(self, "errors", value) + + @property + @pulumi.getter + def installeds(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "installeds") + + @installeds.setter + def installeds(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "installeds", value) + + +@pulumi.input_type +class DatabaseNodesLocationArgs: + def __init__(__self__, *, + city: Optional[pulumi.Input[str]] = None, + code: Optional[pulumi.Input[str]] = None, + country: Optional[pulumi.Input[str]] = None, + latitude: Optional[pulumi.Input[float]] = None, + longitude: Optional[pulumi.Input[float]] = None, + metro_code: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + postal_code: Optional[pulumi.Input[str]] = None, + region: Optional[pulumi.Input[str]] = None, + region_code: Optional[pulumi.Input[str]] = None, + timezone: Optional[pulumi.Input[str]] = None): + if city is not None: + pulumi.set(__self__, "city", city) + if code is not None: + pulumi.set(__self__, "code", code) + if country is not None: + pulumi.set(__self__, "country", country) + if latitude is not None: + pulumi.set(__self__, "latitude", latitude) + if longitude is not None: + pulumi.set(__self__, "longitude", longitude) + if metro_code is not None: + pulumi.set(__self__, "metro_code", metro_code) + if name is not None: + pulumi.set(__self__, "name", name) + if postal_code is not None: + pulumi.set(__self__, "postal_code", postal_code) + if region is not None: + pulumi.set(__self__, "region", region) + if region_code is not None: + pulumi.set(__self__, "region_code", region_code) + if timezone is not None: + pulumi.set(__self__, "timezone", timezone) + + @property + @pulumi.getter + def city(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "city") + + @city.setter + def city(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "city", value) + + @property + @pulumi.getter + def code(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "code") + + @code.setter + def code(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "code", value) + + @property + @pulumi.getter + def country(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "country") + + @country.setter + def country(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "country", value) + + @property + @pulumi.getter + def latitude(self) -> Optional[pulumi.Input[float]]: + return pulumi.get(self, "latitude") + + @latitude.setter + def latitude(self, value: Optional[pulumi.Input[float]]): + pulumi.set(self, "latitude", value) + + @property + @pulumi.getter + def longitude(self) -> Optional[pulumi.Input[float]]: + return pulumi.get(self, "longitude") + + @longitude.setter + def longitude(self, value: Optional[pulumi.Input[float]]): + pulumi.set(self, "longitude", value) + + @property + @pulumi.getter(name="metroCode") + def metro_code(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "metro_code") + + @metro_code.setter + def metro_code(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "metro_code", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter(name="postalCode") + def postal_code(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "postal_code") + + @postal_code.setter + def postal_code(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "postal_code", value) + + @property + @pulumi.getter + def region(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "region") + + @region.setter + def region(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "region", value) + + @property + @pulumi.getter(name="regionCode") + def region_code(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "region_code") + + @region_code.setter + def region_code(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "region_code", value) + + @property + @pulumi.getter + def timezone(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "timezone") + + @timezone.setter + def timezone(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "timezone", value) + + +@pulumi.input_type +class DatabaseNodesRegionArgs: + def __init__(__self__, *, + active: Optional[pulumi.Input[bool]] = None, + availability_zones: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + cloud: Optional[pulumi.Input[str]] = None, + code: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + parent: Optional[pulumi.Input[str]] = None): + if active is not None: + pulumi.set(__self__, "active", active) + if availability_zones is not None: + pulumi.set(__self__, "availability_zones", availability_zones) + if cloud is not None: + pulumi.set(__self__, "cloud", cloud) + if code is not None: + pulumi.set(__self__, "code", code) + if name is not None: + pulumi.set(__self__, "name", name) + if parent is not None: + pulumi.set(__self__, "parent", parent) + + @property + @pulumi.getter + def active(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "active") + + @active.setter + def active(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "active", value) + + @property + @pulumi.getter(name="availabilityZones") + def availability_zones(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "availability_zones") + + @availability_zones.setter + def availability_zones(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "availability_zones", value) + + @property + @pulumi.getter + def cloud(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "cloud") + + @cloud.setter + def cloud(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cloud", value) + + @property + @pulumi.getter + def code(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "code") + + @code.setter + def code(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "code", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def parent(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "parent") + + @parent.setter + def parent(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "parent", value) + + +@pulumi.input_type +class DatabaseRoleArgs: + def __init__(__self__, *, + bypass_rls: Optional[pulumi.Input[bool]] = None, + connection_limit: Optional[pulumi.Input[int]] = None, + create_db: Optional[pulumi.Input[bool]] = None, + create_role: Optional[pulumi.Input[bool]] = None, + inherit: Optional[pulumi.Input[bool]] = None, + login: Optional[pulumi.Input[bool]] = None, + name: Optional[pulumi.Input[str]] = None, + replication: Optional[pulumi.Input[bool]] = None, + superuser: Optional[pulumi.Input[bool]] = None): + if bypass_rls is not None: + pulumi.set(__self__, "bypass_rls", bypass_rls) + if connection_limit is not None: + pulumi.set(__self__, "connection_limit", connection_limit) + if create_db is not None: + pulumi.set(__self__, "create_db", create_db) + if create_role is not None: + pulumi.set(__self__, "create_role", create_role) + if inherit is not None: + pulumi.set(__self__, "inherit", inherit) + if login is not None: + pulumi.set(__self__, "login", login) + if name is not None: + pulumi.set(__self__, "name", name) + if replication is not None: + pulumi.set(__self__, "replication", replication) + if superuser is not None: + pulumi.set(__self__, "superuser", superuser) + + @property + @pulumi.getter(name="bypassRls") + def bypass_rls(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "bypass_rls") + + @bypass_rls.setter + def bypass_rls(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "bypass_rls", value) + + @property + @pulumi.getter(name="connectionLimit") + def connection_limit(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "connection_limit") + + @connection_limit.setter + def connection_limit(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "connection_limit", value) + + @property + @pulumi.getter(name="createDb") + def create_db(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "create_db") + + @create_db.setter + def create_db(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "create_db", value) + + @property + @pulumi.getter(name="createRole") + def create_role(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "create_role") + + @create_role.setter + def create_role(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "create_role", value) + + @property + @pulumi.getter + def inherit(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "inherit") + + @inherit.setter + def inherit(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "inherit", value) + + @property + @pulumi.getter + def login(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "login") + + @login.setter + def login(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "login", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def replication(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "replication") + + @replication.setter + def replication(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "replication", value) + + @property + @pulumi.getter + def superuser(self) -> Optional[pulumi.Input[bool]]: + return pulumi.get(self, "superuser") + + @superuser.setter + def superuser(self, value: Optional[pulumi.Input[bool]]): + pulumi.set(self, "superuser", value) + + diff --git a/sdk/python/pgEdge_pulumi_pgedge/_utilities.py b/sdk/python/pgEdge_pulumi_pgedge/_utilities.py new file mode 100644 index 0000000..f46ae85 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/_utilities.py @@ -0,0 +1,295 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + + +import asyncio +import importlib.util +import inspect +import json +import os +import sys +import typing + +import pulumi +import pulumi.runtime +from pulumi.runtime.sync_await import _sync_await + +from semver import VersionInfo as SemverVersion +from parver import Version as PEP440Version + +if sys.version_info >= (3, 8): + from importlib import metadata +else: + import importlib_metadata as metadata + + +def get_env(*args): + for v in args: + value = os.getenv(v) + if value is not None: + return value + return None + + +def get_env_bool(*args): + str = get_env(*args) + if str is not None: + # NOTE: these values are taken from https://golang.org/src/strconv/atob.go?s=351:391#L1, which is what + # Terraform uses internally when parsing boolean values. + if str in ["1", "t", "T", "true", "TRUE", "True"]: + return True + if str in ["0", "f", "F", "false", "FALSE", "False"]: + return False + return None + + +def get_env_int(*args): + str = get_env(*args) + if str is not None: + try: + return int(str) + except: + return None + return None + + +def get_env_float(*args): + str = get_env(*args) + if str is not None: + try: + return float(str) + except: + return None + return None + + +def _get_semver_version(): + # __name__ is set to the fully-qualified name of the current module, In our case, it will be + # ._utilities. is the module we want to query the version for. + root_package, *rest = __name__.split('.') + + # pkg_resources uses setuptools to inspect the set of installed packages. We use it here to ask + # for the currently installed version of the root package (i.e. us) and get its version. + + # Unfortunately, PEP440 and semver differ slightly in incompatible ways. The Pulumi engine expects + # to receive a valid semver string when receiving requests from the language host, so it's our + # responsibility as the library to convert our own PEP440 version into a valid semver string. + + pep440_version_string = metadata.version(root_package) + pep440_version = PEP440Version.parse(pep440_version_string) + (major, minor, patch) = pep440_version.release + prerelease = None + if pep440_version.pre_tag == 'a': + prerelease = f"alpha.{pep440_version.pre}" + elif pep440_version.pre_tag == 'b': + prerelease = f"beta.{pep440_version.pre}" + elif pep440_version.pre_tag == 'rc': + prerelease = f"rc.{pep440_version.pre}" + elif pep440_version.dev is not None: + prerelease = f"dev.{pep440_version.dev}" + + # The only significant difference between PEP440 and semver as it pertains to us is that PEP440 has explicit support + # for dev builds, while semver encodes them as "prerelease" versions. In order to bridge between the two, we convert + # our dev build version into a prerelease tag. This matches what all of our other packages do when constructing + # their own semver string. + return SemverVersion(major=major, minor=minor, patch=patch, prerelease=prerelease) + + +# Determine the version once and cache the value, which measurably improves program performance. +_version = _get_semver_version() +_version_str = str(_version) + + +def get_version(): + return _version_str + +def get_resource_opts_defaults() -> pulumi.ResourceOptions: + return pulumi.ResourceOptions( + version=get_version(), + plugin_download_url=get_plugin_download_url(), + ) + +def get_invoke_opts_defaults() -> pulumi.InvokeOptions: + return pulumi.InvokeOptions( + version=get_version(), + plugin_download_url=get_plugin_download_url(), + ) + +def get_resource_args_opts(resource_args_type, resource_options_type, *args, **kwargs): + """ + Return the resource args and options given the *args and **kwargs of a resource's + __init__ method. + """ + + resource_args, opts = None, None + + # If the first item is the resource args type, save it and remove it from the args list. + if args and isinstance(args[0], resource_args_type): + resource_args, args = args[0], args[1:] + + # Now look at the first item in the args list again. + # If the first item is the resource options class, save it. + if args and isinstance(args[0], resource_options_type): + opts = args[0] + + # If resource_args is None, see if "args" is in kwargs, and, if so, if it's typed as the + # the resource args type. + if resource_args is None: + a = kwargs.get("args") + if isinstance(a, resource_args_type): + resource_args = a + + # If opts is None, look it up in kwargs. + if opts is None: + opts = kwargs.get("opts") + + return resource_args, opts + + +# Temporary: just use pulumi._utils.lazy_import once everyone upgrades. +def lazy_import(fullname): + + import pulumi._utils as u + f = getattr(u, 'lazy_import', None) + if f is None: + f = _lazy_import_temp + + return f(fullname) + + +# Copied from pulumi._utils.lazy_import, see comments there. +def _lazy_import_temp(fullname): + m = sys.modules.get(fullname, None) + if m is not None: + return m + + spec = importlib.util.find_spec(fullname) + + m = sys.modules.get(fullname, None) + if m is not None: + return m + + loader = importlib.util.LazyLoader(spec.loader) + spec.loader = loader + module = importlib.util.module_from_spec(spec) + + m = sys.modules.get(fullname, None) + if m is not None: + return m + + sys.modules[fullname] = module + loader.exec_module(module) + return module + + +class Package(pulumi.runtime.ResourcePackage): + def __init__(self, pkg_info): + super().__init__() + self.pkg_info = pkg_info + + def version(self): + return _version + + def construct_provider(self, name: str, typ: str, urn: str) -> pulumi.ProviderResource: + if typ != self.pkg_info['token']: + raise Exception(f"unknown provider type {typ}") + Provider = getattr(lazy_import(self.pkg_info['fqn']), self.pkg_info['class']) + return Provider(name, pulumi.ResourceOptions(urn=urn)) + + +class Module(pulumi.runtime.ResourceModule): + def __init__(self, mod_info): + super().__init__() + self.mod_info = mod_info + + def version(self): + return _version + + def construct(self, name: str, typ: str, urn: str) -> pulumi.Resource: + class_name = self.mod_info['classes'].get(typ, None) + + if class_name is None: + raise Exception(f"unknown resource type {typ}") + + TheClass = getattr(lazy_import(self.mod_info['fqn']), class_name) + return TheClass(name, pulumi.ResourceOptions(urn=urn)) + + +def register(resource_modules, resource_packages): + resource_modules = json.loads(resource_modules) + resource_packages = json.loads(resource_packages) + + for pkg_info in resource_packages: + pulumi.runtime.register_resource_package(pkg_info['pkg'], Package(pkg_info)) + + for mod_info in resource_modules: + pulumi.runtime.register_resource_module( + mod_info['pkg'], + mod_info['mod'], + Module(mod_info)) + + +_F = typing.TypeVar('_F', bound=typing.Callable[..., typing.Any]) + + +def lift_output_func(func: typing.Any) -> typing.Callable[[_F], _F]: + """Decorator internally used on {fn}_output lifted function versions + to implement them automatically from the un-lifted function.""" + + func_sig = inspect.signature(func) + + def lifted_func(*args, opts=None, **kwargs): + bound_args = func_sig.bind(*args, **kwargs) + # Convert tuple to list, see pulumi/pulumi#8172 + args_list = list(bound_args.args) + return pulumi.Output.from_input({ + 'args': args_list, + 'kwargs': bound_args.kwargs + }).apply(lambda resolved_args: func(*resolved_args['args'], + opts=opts, + **resolved_args['kwargs'])) + + return (lambda _: lifted_func) + + +def call_plain( + tok: str, + props: pulumi.Inputs, + res: typing.Optional[pulumi.Resource] = None, + typ: typing.Optional[type] = None, +) -> typing.Any: + """ + Wraps pulumi.runtime.plain to force the output and return it plainly. + """ + + output = pulumi.runtime.call(tok, props, res, typ) + + # Ingoring deps silently. They are typically non-empty, r.f() calls include r as a dependency. + result, known, secret, _ = _sync_await(asyncio.ensure_future(_await_output(output))) + + problem = None + if not known: + problem = ' an unknown value' + elif secret: + problem = ' a secret value' + + if problem: + raise AssertionError( + f"Plain resource method '{tok}' incorrectly returned {problem}. " + + "This is an error in the provider, please report this to the provider developer." + ) + + return result + + +async def _await_output(o: pulumi.Output[typing.Any]) -> typing.Tuple[object, bool, bool, set]: + return ( + await o._future, + await o._is_known, + await o._is_secret, + await o._resources, + ) + +def get_plugin_download_url(): + return "github://api.github.com/pgEdge/pulumi-pgedge" diff --git a/sdk/python/pgEdge_pulumi_pgedge/backup_store.py b/sdk/python/pgEdge_pulumi_pgedge/backup_store.py new file mode 100644 index 0000000..7507445 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/backup_store.py @@ -0,0 +1,300 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities + +__all__ = ['BackupStoreArgs', 'BackupStore'] + +@pulumi.input_type +class BackupStoreArgs: + def __init__(__self__, *, + cloud_account_id: pulumi.Input[str], + region: pulumi.Input[str], + name: Optional[pulumi.Input[str]] = None): + """ + The set of arguments for constructing a BackupStore resource. + """ + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + pulumi.set(__self__, "region", region) + if name is not None: + pulumi.set(__self__, "name", name) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> pulumi.Input[str]: + return pulumi.get(self, "cloud_account_id") + + @cloud_account_id.setter + def cloud_account_id(self, value: pulumi.Input[str]): + pulumi.set(self, "cloud_account_id", value) + + @property + @pulumi.getter + def region(self) -> pulumi.Input[str]: + return pulumi.get(self, "region") + + @region.setter + def region(self, value: pulumi.Input[str]): + pulumi.set(self, "region", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + +@pulumi.input_type +class _BackupStoreState: + def __init__(__self__, *, + cloud_account_id: Optional[pulumi.Input[str]] = None, + cloud_account_type: Optional[pulumi.Input[str]] = None, + cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + created_at: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + properties: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + region: Optional[pulumi.Input[str]] = None, + status: Optional[pulumi.Input[str]] = None): + """ + Input properties used for looking up and filtering BackupStore resources. + """ + if cloud_account_id is not None: + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + if cloud_account_type is not None: + pulumi.set(__self__, "cloud_account_type", cloud_account_type) + if cluster_ids is not None: + pulumi.set(__self__, "cluster_ids", cluster_ids) + if created_at is not None: + pulumi.set(__self__, "created_at", created_at) + if name is not None: + pulumi.set(__self__, "name", name) + if properties is not None: + pulumi.set(__self__, "properties", properties) + if region is not None: + pulumi.set(__self__, "region", region) + if status is not None: + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "cloud_account_id") + + @cloud_account_id.setter + def cloud_account_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cloud_account_id", value) + + @property + @pulumi.getter(name="cloudAccountType") + def cloud_account_type(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "cloud_account_type") + + @cloud_account_type.setter + def cloud_account_type(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cloud_account_type", value) + + @property + @pulumi.getter(name="clusterIds") + def cluster_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "cluster_ids") + + @cluster_ids.setter + def cluster_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "cluster_ids", value) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "created_at") + + @created_at.setter + def created_at(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "created_at", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def properties(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]: + return pulumi.get(self, "properties") + + @properties.setter + def properties(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]): + pulumi.set(self, "properties", value) + + @property + @pulumi.getter + def region(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "region") + + @region.setter + def region(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "region", value) + + @property + @pulumi.getter + def status(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "status") + + @status.setter + def status(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "status", value) + + +class BackupStore(pulumi.CustomResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + region: Optional[pulumi.Input[str]] = None, + __props__=None): + """ + Create a BackupStore resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: BackupStoreArgs, + opts: Optional[pulumi.ResourceOptions] = None): + """ + Create a BackupStore resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param BackupStoreArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(BackupStoreArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + region: Optional[pulumi.Input[str]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = BackupStoreArgs.__new__(BackupStoreArgs) + + if cloud_account_id is None and not opts.urn: + raise TypeError("Missing required property 'cloud_account_id'") + __props__.__dict__["cloud_account_id"] = cloud_account_id + __props__.__dict__["name"] = name + if region is None and not opts.urn: + raise TypeError("Missing required property 'region'") + __props__.__dict__["region"] = region + __props__.__dict__["cloud_account_type"] = None + __props__.__dict__["cluster_ids"] = None + __props__.__dict__["created_at"] = None + __props__.__dict__["properties"] = None + __props__.__dict__["status"] = None + super(BackupStore, __self__).__init__( + 'pgedge:index/backupStore:BackupStore', + resource_name, + __props__, + opts) + + @staticmethod + def get(resource_name: str, + id: pulumi.Input[str], + opts: Optional[pulumi.ResourceOptions] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + cloud_account_type: Optional[pulumi.Input[str]] = None, + cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + created_at: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + properties: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + region: Optional[pulumi.Input[str]] = None, + status: Optional[pulumi.Input[str]] = None) -> 'BackupStore': + """ + Get an existing BackupStore resource's state with the given name, id, and optional extra + properties used to qualify the lookup. + + :param str resource_name: The unique name of the resulting resource. + :param pulumi.Input[str] id: The unique provider ID of the resource to lookup. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id)) + + __props__ = _BackupStoreState.__new__(_BackupStoreState) + + __props__.__dict__["cloud_account_id"] = cloud_account_id + __props__.__dict__["cloud_account_type"] = cloud_account_type + __props__.__dict__["cluster_ids"] = cluster_ids + __props__.__dict__["created_at"] = created_at + __props__.__dict__["name"] = name + __props__.__dict__["properties"] = properties + __props__.__dict__["region"] = region + __props__.__dict__["status"] = status + return BackupStore(resource_name, opts=opts, __props__=__props__) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> pulumi.Output[str]: + return pulumi.get(self, "cloud_account_id") + + @property + @pulumi.getter(name="cloudAccountType") + def cloud_account_type(self) -> pulumi.Output[str]: + return pulumi.get(self, "cloud_account_type") + + @property + @pulumi.getter(name="clusterIds") + def cluster_ids(self) -> pulumi.Output[Sequence[str]]: + return pulumi.get(self, "cluster_ids") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> pulumi.Output[str]: + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def name(self) -> pulumi.Output[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def properties(self) -> pulumi.Output[Mapping[str, str]]: + return pulumi.get(self, "properties") + + @property + @pulumi.getter + def region(self) -> pulumi.Output[str]: + return pulumi.get(self, "region") + + @property + @pulumi.getter + def status(self) -> pulumi.Output[str]: + return pulumi.get(self, "status") + diff --git a/sdk/python/pgEdge_pulumi_pgedge/cloud_account.py b/sdk/python/pgEdge_pulumi_pgedge/cloud_account.py new file mode 100644 index 0000000..347bbad --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/cloud_account.py @@ -0,0 +1,254 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities + +__all__ = ['CloudAccountArgs', 'CloudAccount'] + +@pulumi.input_type +class CloudAccountArgs: + def __init__(__self__, *, + credentials: pulumi.Input[Mapping[str, pulumi.Input[str]]], + type: pulumi.Input[str], + description: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None): + """ + The set of arguments for constructing a CloudAccount resource. + """ + pulumi.set(__self__, "credentials", credentials) + pulumi.set(__self__, "type", type) + if description is not None: + pulumi.set(__self__, "description", description) + if name is not None: + pulumi.set(__self__, "name", name) + + @property + @pulumi.getter + def credentials(self) -> pulumi.Input[Mapping[str, pulumi.Input[str]]]: + return pulumi.get(self, "credentials") + + @credentials.setter + def credentials(self, value: pulumi.Input[Mapping[str, pulumi.Input[str]]]): + pulumi.set(self, "credentials", value) + + @property + @pulumi.getter + def type(self) -> pulumi.Input[str]: + return pulumi.get(self, "type") + + @type.setter + def type(self, value: pulumi.Input[str]): + pulumi.set(self, "type", value) + + @property + @pulumi.getter + def description(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "description") + + @description.setter + def description(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "description", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + +@pulumi.input_type +class _CloudAccountState: + def __init__(__self__, *, + created_at: Optional[pulumi.Input[str]] = None, + credentials: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + description: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + type: Optional[pulumi.Input[str]] = None): + """ + Input properties used for looking up and filtering CloudAccount resources. + """ + if created_at is not None: + pulumi.set(__self__, "created_at", created_at) + if credentials is not None: + pulumi.set(__self__, "credentials", credentials) + if description is not None: + pulumi.set(__self__, "description", description) + if name is not None: + pulumi.set(__self__, "name", name) + if type is not None: + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "created_at") + + @created_at.setter + def created_at(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "created_at", value) + + @property + @pulumi.getter + def credentials(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]: + return pulumi.get(self, "credentials") + + @credentials.setter + def credentials(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]): + pulumi.set(self, "credentials", value) + + @property + @pulumi.getter + def description(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "description") + + @description.setter + def description(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "description", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def type(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "type") + + @type.setter + def type(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "type", value) + + +class CloudAccount(pulumi.CustomResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + credentials: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + description: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + type: Optional[pulumi.Input[str]] = None, + __props__=None): + """ + Create a CloudAccount resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: CloudAccountArgs, + opts: Optional[pulumi.ResourceOptions] = None): + """ + Create a CloudAccount resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param CloudAccountArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(CloudAccountArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + credentials: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + description: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + type: Optional[pulumi.Input[str]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = CloudAccountArgs.__new__(CloudAccountArgs) + + if credentials is None and not opts.urn: + raise TypeError("Missing required property 'credentials'") + __props__.__dict__["credentials"] = credentials + __props__.__dict__["description"] = description + __props__.__dict__["name"] = name + if type is None and not opts.urn: + raise TypeError("Missing required property 'type'") + __props__.__dict__["type"] = type + __props__.__dict__["created_at"] = None + super(CloudAccount, __self__).__init__( + 'pgedge:index/cloudAccount:CloudAccount', + resource_name, + __props__, + opts) + + @staticmethod + def get(resource_name: str, + id: pulumi.Input[str], + opts: Optional[pulumi.ResourceOptions] = None, + created_at: Optional[pulumi.Input[str]] = None, + credentials: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + description: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + type: Optional[pulumi.Input[str]] = None) -> 'CloudAccount': + """ + Get an existing CloudAccount resource's state with the given name, id, and optional extra + properties used to qualify the lookup. + + :param str resource_name: The unique name of the resulting resource. + :param pulumi.Input[str] id: The unique provider ID of the resource to lookup. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id)) + + __props__ = _CloudAccountState.__new__(_CloudAccountState) + + __props__.__dict__["created_at"] = created_at + __props__.__dict__["credentials"] = credentials + __props__.__dict__["description"] = description + __props__.__dict__["name"] = name + __props__.__dict__["type"] = type + return CloudAccount(resource_name, opts=opts, __props__=__props__) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> pulumi.Output[str]: + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def credentials(self) -> pulumi.Output[Mapping[str, str]]: + return pulumi.get(self, "credentials") + + @property + @pulumi.getter + def description(self) -> pulumi.Output[Optional[str]]: + return pulumi.get(self, "description") + + @property + @pulumi.getter + def name(self) -> pulumi.Output[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def type(self) -> pulumi.Output[str]: + return pulumi.get(self, "type") + diff --git a/sdk/python/pgEdge_pulumi_pgedge/cluster.py b/sdk/python/pgEdge_pulumi_pgedge/cluster.py new file mode 100644 index 0000000..68edbb0 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/cluster.py @@ -0,0 +1,556 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs +from ._inputs import * + +__all__ = ['ClusterArgs', 'Cluster'] + +@pulumi.input_type +class ClusterArgs: + def __init__(__self__, *, + cloud_account_id: pulumi.Input[str], + networks: pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]], + node_location: pulumi.Input[str], + nodes: pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]], + regions: pulumi.Input[Sequence[pulumi.Input[str]]], + backup_store_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + capacity: Optional[pulumi.Input[int]] = None, + firewall_rules: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]] = None, + name: Optional[pulumi.Input[str]] = None, + resource_tags: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + ssh_key_id: Optional[pulumi.Input[str]] = None): + """ + The set of arguments for constructing a Cluster resource. + :param pulumi.Input[str] node_location: Node location of the cluster. Must be either 'public' or 'private'. + :param pulumi.Input[Sequence[pulumi.Input[str]]] backup_store_ids: List of backup store IDs to associate with the cluster + :param pulumi.Input[Mapping[str, pulumi.Input[str]]] resource_tags: A map of tags to assign to the cluster + """ + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + pulumi.set(__self__, "networks", networks) + pulumi.set(__self__, "node_location", node_location) + pulumi.set(__self__, "nodes", nodes) + pulumi.set(__self__, "regions", regions) + if backup_store_ids is not None: + pulumi.set(__self__, "backup_store_ids", backup_store_ids) + if capacity is not None: + pulumi.set(__self__, "capacity", capacity) + if firewall_rules is not None: + pulumi.set(__self__, "firewall_rules", firewall_rules) + if name is not None: + pulumi.set(__self__, "name", name) + if resource_tags is not None: + pulumi.set(__self__, "resource_tags", resource_tags) + if ssh_key_id is not None: + pulumi.set(__self__, "ssh_key_id", ssh_key_id) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> pulumi.Input[str]: + return pulumi.get(self, "cloud_account_id") + + @cloud_account_id.setter + def cloud_account_id(self, value: pulumi.Input[str]): + pulumi.set(self, "cloud_account_id", value) + + @property + @pulumi.getter + def networks(self) -> pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]]: + return pulumi.get(self, "networks") + + @networks.setter + def networks(self, value: pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]]): + pulumi.set(self, "networks", value) + + @property + @pulumi.getter(name="nodeLocation") + def node_location(self) -> pulumi.Input[str]: + """ + Node location of the cluster. Must be either 'public' or 'private'. + """ + return pulumi.get(self, "node_location") + + @node_location.setter + def node_location(self, value: pulumi.Input[str]): + pulumi.set(self, "node_location", value) + + @property + @pulumi.getter + def nodes(self) -> pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]]: + return pulumi.get(self, "nodes") + + @nodes.setter + def nodes(self, value: pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]]): + pulumi.set(self, "nodes", value) + + @property + @pulumi.getter + def regions(self) -> pulumi.Input[Sequence[pulumi.Input[str]]]: + return pulumi.get(self, "regions") + + @regions.setter + def regions(self, value: pulumi.Input[Sequence[pulumi.Input[str]]]): + pulumi.set(self, "regions", value) + + @property + @pulumi.getter(name="backupStoreIds") + def backup_store_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + """ + List of backup store IDs to associate with the cluster + """ + return pulumi.get(self, "backup_store_ids") + + @backup_store_ids.setter + def backup_store_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "backup_store_ids", value) + + @property + @pulumi.getter + def capacity(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "capacity") + + @capacity.setter + def capacity(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "capacity", value) + + @property + @pulumi.getter(name="firewallRules") + def firewall_rules(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]]: + return pulumi.get(self, "firewall_rules") + + @firewall_rules.setter + def firewall_rules(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]]): + pulumi.set(self, "firewall_rules", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter(name="resourceTags") + def resource_tags(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]: + """ + A map of tags to assign to the cluster + """ + return pulumi.get(self, "resource_tags") + + @resource_tags.setter + def resource_tags(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]): + pulumi.set(self, "resource_tags", value) + + @property + @pulumi.getter(name="sshKeyId") + def ssh_key_id(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "ssh_key_id") + + @ssh_key_id.setter + def ssh_key_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "ssh_key_id", value) + + +@pulumi.input_type +class _ClusterState: + def __init__(__self__, *, + backup_store_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + capacity: Optional[pulumi.Input[int]] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + created_at: Optional[pulumi.Input[str]] = None, + firewall_rules: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]] = None, + name: Optional[pulumi.Input[str]] = None, + networks: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]]] = None, + node_location: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]]] = None, + regions: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + resource_tags: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + ssh_key_id: Optional[pulumi.Input[str]] = None, + status: Optional[pulumi.Input[str]] = None): + """ + Input properties used for looking up and filtering Cluster resources. + :param pulumi.Input[Sequence[pulumi.Input[str]]] backup_store_ids: List of backup store IDs to associate with the cluster + :param pulumi.Input[str] node_location: Node location of the cluster. Must be either 'public' or 'private'. + :param pulumi.Input[Mapping[str, pulumi.Input[str]]] resource_tags: A map of tags to assign to the cluster + """ + if backup_store_ids is not None: + pulumi.set(__self__, "backup_store_ids", backup_store_ids) + if capacity is not None: + pulumi.set(__self__, "capacity", capacity) + if cloud_account_id is not None: + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + if created_at is not None: + pulumi.set(__self__, "created_at", created_at) + if firewall_rules is not None: + pulumi.set(__self__, "firewall_rules", firewall_rules) + if name is not None: + pulumi.set(__self__, "name", name) + if networks is not None: + pulumi.set(__self__, "networks", networks) + if node_location is not None: + pulumi.set(__self__, "node_location", node_location) + if nodes is not None: + pulumi.set(__self__, "nodes", nodes) + if regions is not None: + pulumi.set(__self__, "regions", regions) + if resource_tags is not None: + pulumi.set(__self__, "resource_tags", resource_tags) + if ssh_key_id is not None: + pulumi.set(__self__, "ssh_key_id", ssh_key_id) + if status is not None: + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter(name="backupStoreIds") + def backup_store_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + """ + List of backup store IDs to associate with the cluster + """ + return pulumi.get(self, "backup_store_ids") + + @backup_store_ids.setter + def backup_store_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "backup_store_ids", value) + + @property + @pulumi.getter + def capacity(self) -> Optional[pulumi.Input[int]]: + return pulumi.get(self, "capacity") + + @capacity.setter + def capacity(self, value: Optional[pulumi.Input[int]]): + pulumi.set(self, "capacity", value) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "cloud_account_id") + + @cloud_account_id.setter + def cloud_account_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cloud_account_id", value) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "created_at") + + @created_at.setter + def created_at(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "created_at", value) + + @property + @pulumi.getter(name="firewallRules") + def firewall_rules(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]]: + return pulumi.get(self, "firewall_rules") + + @firewall_rules.setter + def firewall_rules(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterFirewallRuleArgs']]]]): + pulumi.set(self, "firewall_rules", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def networks(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]]]: + return pulumi.get(self, "networks") + + @networks.setter + def networks(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNetworkArgs']]]]): + pulumi.set(self, "networks", value) + + @property + @pulumi.getter(name="nodeLocation") + def node_location(self) -> Optional[pulumi.Input[str]]: + """ + Node location of the cluster. Must be either 'public' or 'private'. + """ + return pulumi.get(self, "node_location") + + @node_location.setter + def node_location(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "node_location", value) + + @property + @pulumi.getter + def nodes(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]]]: + return pulumi.get(self, "nodes") + + @nodes.setter + def nodes(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ClusterNodeArgs']]]]): + pulumi.set(self, "nodes", value) + + @property + @pulumi.getter + def regions(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + return pulumi.get(self, "regions") + + @regions.setter + def regions(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "regions", value) + + @property + @pulumi.getter(name="resourceTags") + def resource_tags(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]: + """ + A map of tags to assign to the cluster + """ + return pulumi.get(self, "resource_tags") + + @resource_tags.setter + def resource_tags(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]): + pulumi.set(self, "resource_tags", value) + + @property + @pulumi.getter(name="sshKeyId") + def ssh_key_id(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "ssh_key_id") + + @ssh_key_id.setter + def ssh_key_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "ssh_key_id", value) + + @property + @pulumi.getter + def status(self) -> Optional[pulumi.Input[str]]: + return pulumi.get(self, "status") + + @status.setter + def status(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "status", value) + + +class Cluster(pulumi.CustomResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + backup_store_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + capacity: Optional[pulumi.Input[int]] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + firewall_rules: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterFirewallRuleArgs']]]]] = None, + name: Optional[pulumi.Input[str]] = None, + networks: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNetworkArgs']]]]] = None, + node_location: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNodeArgs']]]]] = None, + regions: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + resource_tags: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + ssh_key_id: Optional[pulumi.Input[str]] = None, + __props__=None): + """ + Create a Cluster resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[Sequence[pulumi.Input[str]]] backup_store_ids: List of backup store IDs to associate with the cluster + :param pulumi.Input[str] node_location: Node location of the cluster. Must be either 'public' or 'private'. + :param pulumi.Input[Mapping[str, pulumi.Input[str]]] resource_tags: A map of tags to assign to the cluster + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: ClusterArgs, + opts: Optional[pulumi.ResourceOptions] = None): + """ + Create a Cluster resource with the given unique name, props, and options. + :param str resource_name: The name of the resource. + :param ClusterArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(ClusterArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + backup_store_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + capacity: Optional[pulumi.Input[int]] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + firewall_rules: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterFirewallRuleArgs']]]]] = None, + name: Optional[pulumi.Input[str]] = None, + networks: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNetworkArgs']]]]] = None, + node_location: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNodeArgs']]]]] = None, + regions: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + resource_tags: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + ssh_key_id: Optional[pulumi.Input[str]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = ClusterArgs.__new__(ClusterArgs) + + __props__.__dict__["backup_store_ids"] = backup_store_ids + __props__.__dict__["capacity"] = capacity + if cloud_account_id is None and not opts.urn: + raise TypeError("Missing required property 'cloud_account_id'") + __props__.__dict__["cloud_account_id"] = cloud_account_id + __props__.__dict__["firewall_rules"] = firewall_rules + __props__.__dict__["name"] = name + if networks is None and not opts.urn: + raise TypeError("Missing required property 'networks'") + __props__.__dict__["networks"] = networks + if node_location is None and not opts.urn: + raise TypeError("Missing required property 'node_location'") + __props__.__dict__["node_location"] = node_location + if nodes is None and not opts.urn: + raise TypeError("Missing required property 'nodes'") + __props__.__dict__["nodes"] = nodes + if regions is None and not opts.urn: + raise TypeError("Missing required property 'regions'") + __props__.__dict__["regions"] = regions + __props__.__dict__["resource_tags"] = resource_tags + __props__.__dict__["ssh_key_id"] = ssh_key_id + __props__.__dict__["created_at"] = None + __props__.__dict__["status"] = None + super(Cluster, __self__).__init__( + 'pgedge:index/cluster:Cluster', + resource_name, + __props__, + opts) + + @staticmethod + def get(resource_name: str, + id: pulumi.Input[str], + opts: Optional[pulumi.ResourceOptions] = None, + backup_store_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + capacity: Optional[pulumi.Input[int]] = None, + cloud_account_id: Optional[pulumi.Input[str]] = None, + created_at: Optional[pulumi.Input[str]] = None, + firewall_rules: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterFirewallRuleArgs']]]]] = None, + name: Optional[pulumi.Input[str]] = None, + networks: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNetworkArgs']]]]] = None, + node_location: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['ClusterNodeArgs']]]]] = None, + regions: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + resource_tags: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None, + ssh_key_id: Optional[pulumi.Input[str]] = None, + status: Optional[pulumi.Input[str]] = None) -> 'Cluster': + """ + Get an existing Cluster resource's state with the given name, id, and optional extra + properties used to qualify the lookup. + + :param str resource_name: The unique name of the resulting resource. + :param pulumi.Input[str] id: The unique provider ID of the resource to lookup. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[Sequence[pulumi.Input[str]]] backup_store_ids: List of backup store IDs to associate with the cluster + :param pulumi.Input[str] node_location: Node location of the cluster. Must be either 'public' or 'private'. + :param pulumi.Input[Mapping[str, pulumi.Input[str]]] resource_tags: A map of tags to assign to the cluster + """ + opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id)) + + __props__ = _ClusterState.__new__(_ClusterState) + + __props__.__dict__["backup_store_ids"] = backup_store_ids + __props__.__dict__["capacity"] = capacity + __props__.__dict__["cloud_account_id"] = cloud_account_id + __props__.__dict__["created_at"] = created_at + __props__.__dict__["firewall_rules"] = firewall_rules + __props__.__dict__["name"] = name + __props__.__dict__["networks"] = networks + __props__.__dict__["node_location"] = node_location + __props__.__dict__["nodes"] = nodes + __props__.__dict__["regions"] = regions + __props__.__dict__["resource_tags"] = resource_tags + __props__.__dict__["ssh_key_id"] = ssh_key_id + __props__.__dict__["status"] = status + return Cluster(resource_name, opts=opts, __props__=__props__) + + @property + @pulumi.getter(name="backupStoreIds") + def backup_store_ids(self) -> pulumi.Output[Sequence[str]]: + """ + List of backup store IDs to associate with the cluster + """ + return pulumi.get(self, "backup_store_ids") + + @property + @pulumi.getter + def capacity(self) -> pulumi.Output[int]: + return pulumi.get(self, "capacity") + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> pulumi.Output[str]: + return pulumi.get(self, "cloud_account_id") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> pulumi.Output[str]: + return pulumi.get(self, "created_at") + + @property + @pulumi.getter(name="firewallRules") + def firewall_rules(self) -> pulumi.Output[Optional[Sequence['outputs.ClusterFirewallRule']]]: + return pulumi.get(self, "firewall_rules") + + @property + @pulumi.getter + def name(self) -> pulumi.Output[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def networks(self) -> pulumi.Output[Sequence['outputs.ClusterNetwork']]: + return pulumi.get(self, "networks") + + @property + @pulumi.getter(name="nodeLocation") + def node_location(self) -> pulumi.Output[str]: + """ + Node location of the cluster. Must be either 'public' or 'private'. + """ + return pulumi.get(self, "node_location") + + @property + @pulumi.getter + def nodes(self) -> pulumi.Output[Sequence['outputs.ClusterNode']]: + return pulumi.get(self, "nodes") + + @property + @pulumi.getter + def regions(self) -> pulumi.Output[Sequence[str]]: + return pulumi.get(self, "regions") + + @property + @pulumi.getter(name="resourceTags") + def resource_tags(self) -> pulumi.Output[Mapping[str, str]]: + """ + A map of tags to assign to the cluster + """ + return pulumi.get(self, "resource_tags") + + @property + @pulumi.getter(name="sshKeyId") + def ssh_key_id(self) -> pulumi.Output[Optional[str]]: + return pulumi.get(self, "ssh_key_id") + + @property + @pulumi.getter + def status(self) -> pulumi.Output[str]: + return pulumi.get(self, "status") + diff --git a/sdk/python/pgEdge_pulumi_pgedge/config/__init__.py b/sdk/python/pgEdge_pulumi_pgedge/config/__init__.py new file mode 100644 index 0000000..18853fc --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/config/__init__.py @@ -0,0 +1,8 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import sys +from .vars import _ExportableConfig + +sys.modules[__name__].__class__ = _ExportableConfig diff --git a/sdk/python/pgEdge_pulumi_pgedge/config/__init__.pyi b/sdk/python/pgEdge_pulumi_pgedge/config/__init__.pyi new file mode 100644 index 0000000..e1ba81b --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/config/__init__.pyi @@ -0,0 +1,16 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from .. import _utilities + +baseUrl: Optional[str] +""" +Base Url to use when connecting to the PgEdge service. +""" + diff --git a/sdk/python/pgEdge_pulumi_pgedge/config/vars.py b/sdk/python/pgEdge_pulumi_pgedge/config/vars.py new file mode 100644 index 0000000..3b0281a --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/config/vars.py @@ -0,0 +1,24 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from .. import _utilities + +import types + +__config__ = pulumi.Config('pgedge') + + +class _ExportableConfig(types.ModuleType): + @property + def base_url(self) -> Optional[str]: + """ + Base Url to use when connecting to the PgEdge service. + """ + return __config__.get('baseUrl') or _utilities.get_env('PGEDGE_BASE_URL') + diff --git a/sdk/python/pgEdge_pulumi_pgedge/database.py b/sdk/python/pgEdge_pulumi_pgedge/database.py new file mode 100644 index 0000000..e9bfc82 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/database.py @@ -0,0 +1,618 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs +from ._inputs import * + +__all__ = ['DatabaseArgs', 'Database'] + +@pulumi.input_type +class DatabaseArgs: + def __init__(__self__, *, + cluster_id: pulumi.Input[str], + nodes: pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]], + backups: Optional[pulumi.Input['DatabaseBackupsArgs']] = None, + config_version: Optional[pulumi.Input[str]] = None, + extensions: Optional[pulumi.Input['DatabaseExtensionsArgs']] = None, + name: Optional[pulumi.Input[str]] = None, + options: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + roles: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]] = None): + """ + The set of arguments for constructing a Database resource. + :param pulumi.Input[str] cluster_id: The ID of the cluster this database belongs to. + :param pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]] nodes: Map of nodes in the database. + :param pulumi.Input['DatabaseBackupsArgs'] backups: Backup configuration for the database. + :param pulumi.Input[str] config_version: The configuration version of the database. + :param pulumi.Input['DatabaseExtensionsArgs'] extensions: Extensions configuration for the database. + :param pulumi.Input[str] name: The name of the database. + :param pulumi.Input[Sequence[pulumi.Input[str]]] options: A list of options for the database. + :param pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]] roles: List of roles in the database. + """ + pulumi.set(__self__, "cluster_id", cluster_id) + pulumi.set(__self__, "nodes", nodes) + if backups is not None: + pulumi.set(__self__, "backups", backups) + if config_version is not None: + pulumi.set(__self__, "config_version", config_version) + if extensions is not None: + pulumi.set(__self__, "extensions", extensions) + if name is not None: + pulumi.set(__self__, "name", name) + if options is not None: + pulumi.set(__self__, "options", options) + if roles is not None: + pulumi.set(__self__, "roles", roles) + + @property + @pulumi.getter(name="clusterId") + def cluster_id(self) -> pulumi.Input[str]: + """ + The ID of the cluster this database belongs to. + """ + return pulumi.get(self, "cluster_id") + + @cluster_id.setter + def cluster_id(self, value: pulumi.Input[str]): + pulumi.set(self, "cluster_id", value) + + @property + @pulumi.getter + def nodes(self) -> pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]]: + """ + Map of nodes in the database. + """ + return pulumi.get(self, "nodes") + + @nodes.setter + def nodes(self, value: pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]]): + pulumi.set(self, "nodes", value) + + @property + @pulumi.getter + def backups(self) -> Optional[pulumi.Input['DatabaseBackupsArgs']]: + """ + Backup configuration for the database. + """ + return pulumi.get(self, "backups") + + @backups.setter + def backups(self, value: Optional[pulumi.Input['DatabaseBackupsArgs']]): + pulumi.set(self, "backups", value) + + @property + @pulumi.getter(name="configVersion") + def config_version(self) -> Optional[pulumi.Input[str]]: + """ + The configuration version of the database. + """ + return pulumi.get(self, "config_version") + + @config_version.setter + def config_version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "config_version", value) + + @property + @pulumi.getter + def extensions(self) -> Optional[pulumi.Input['DatabaseExtensionsArgs']]: + """ + Extensions configuration for the database. + """ + return pulumi.get(self, "extensions") + + @extensions.setter + def extensions(self, value: Optional[pulumi.Input['DatabaseExtensionsArgs']]): + pulumi.set(self, "extensions", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + """ + The name of the database. + """ + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def options(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + """ + A list of options for the database. + """ + return pulumi.get(self, "options") + + @options.setter + def options(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "options", value) + + @property + @pulumi.getter + def roles(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]]: + """ + List of roles in the database. + """ + return pulumi.get(self, "roles") + + @roles.setter + def roles(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]]): + pulumi.set(self, "roles", value) + + +@pulumi.input_type +class _DatabaseState: + def __init__(__self__, *, + backups: Optional[pulumi.Input['DatabaseBackupsArgs']] = None, + cluster_id: Optional[pulumi.Input[str]] = None, + components: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseComponentArgs']]]] = None, + config_version: Optional[pulumi.Input[str]] = None, + created_at: Optional[pulumi.Input[str]] = None, + domain: Optional[pulumi.Input[str]] = None, + extensions: Optional[pulumi.Input['DatabaseExtensionsArgs']] = None, + name: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]]] = None, + options: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + pg_version: Optional[pulumi.Input[str]] = None, + roles: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]] = None, + status: Optional[pulumi.Input[str]] = None): + """ + Input properties used for looking up and filtering Database resources. + :param pulumi.Input['DatabaseBackupsArgs'] backups: Backup configuration for the database. + :param pulumi.Input[str] cluster_id: The ID of the cluster this database belongs to. + :param pulumi.Input[Sequence[pulumi.Input['DatabaseComponentArgs']]] components: List of components in the database. + :param pulumi.Input[str] config_version: The configuration version of the database. + :param pulumi.Input[str] created_at: The timestamp when the database was created. + :param pulumi.Input[str] domain: The domain associated with the database. + :param pulumi.Input['DatabaseExtensionsArgs'] extensions: Extensions configuration for the database. + :param pulumi.Input[str] name: The name of the database. + :param pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]] nodes: Map of nodes in the database. + :param pulumi.Input[Sequence[pulumi.Input[str]]] options: A list of options for the database. + :param pulumi.Input[str] pg_version: The PostgreSQL version of the database. + :param pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]] roles: List of roles in the database. + :param pulumi.Input[str] status: The current status of the database. + """ + if backups is not None: + pulumi.set(__self__, "backups", backups) + if cluster_id is not None: + pulumi.set(__self__, "cluster_id", cluster_id) + if components is not None: + pulumi.set(__self__, "components", components) + if config_version is not None: + pulumi.set(__self__, "config_version", config_version) + if created_at is not None: + pulumi.set(__self__, "created_at", created_at) + if domain is not None: + pulumi.set(__self__, "domain", domain) + if extensions is not None: + pulumi.set(__self__, "extensions", extensions) + if name is not None: + pulumi.set(__self__, "name", name) + if nodes is not None: + pulumi.set(__self__, "nodes", nodes) + if options is not None: + pulumi.set(__self__, "options", options) + if pg_version is not None: + pulumi.set(__self__, "pg_version", pg_version) + if roles is not None: + pulumi.set(__self__, "roles", roles) + if status is not None: + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter + def backups(self) -> Optional[pulumi.Input['DatabaseBackupsArgs']]: + """ + Backup configuration for the database. + """ + return pulumi.get(self, "backups") + + @backups.setter + def backups(self, value: Optional[pulumi.Input['DatabaseBackupsArgs']]): + pulumi.set(self, "backups", value) + + @property + @pulumi.getter(name="clusterId") + def cluster_id(self) -> Optional[pulumi.Input[str]]: + """ + The ID of the cluster this database belongs to. + """ + return pulumi.get(self, "cluster_id") + + @cluster_id.setter + def cluster_id(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "cluster_id", value) + + @property + @pulumi.getter + def components(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseComponentArgs']]]]: + """ + List of components in the database. + """ + return pulumi.get(self, "components") + + @components.setter + def components(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseComponentArgs']]]]): + pulumi.set(self, "components", value) + + @property + @pulumi.getter(name="configVersion") + def config_version(self) -> Optional[pulumi.Input[str]]: + """ + The configuration version of the database. + """ + return pulumi.get(self, "config_version") + + @config_version.setter + def config_version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "config_version", value) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> Optional[pulumi.Input[str]]: + """ + The timestamp when the database was created. + """ + return pulumi.get(self, "created_at") + + @created_at.setter + def created_at(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "created_at", value) + + @property + @pulumi.getter + def domain(self) -> Optional[pulumi.Input[str]]: + """ + The domain associated with the database. + """ + return pulumi.get(self, "domain") + + @domain.setter + def domain(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "domain", value) + + @property + @pulumi.getter + def extensions(self) -> Optional[pulumi.Input['DatabaseExtensionsArgs']]: + """ + Extensions configuration for the database. + """ + return pulumi.get(self, "extensions") + + @extensions.setter + def extensions(self, value: Optional[pulumi.Input['DatabaseExtensionsArgs']]): + pulumi.set(self, "extensions", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + """ + The name of the database. + """ + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter + def nodes(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]]]: + """ + Map of nodes in the database. + """ + return pulumi.get(self, "nodes") + + @nodes.setter + def nodes(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input['DatabaseNodesArgs']]]]): + pulumi.set(self, "nodes", value) + + @property + @pulumi.getter + def options(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]: + """ + A list of options for the database. + """ + return pulumi.get(self, "options") + + @options.setter + def options(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]): + pulumi.set(self, "options", value) + + @property + @pulumi.getter(name="pgVersion") + def pg_version(self) -> Optional[pulumi.Input[str]]: + """ + The PostgreSQL version of the database. + """ + return pulumi.get(self, "pg_version") + + @pg_version.setter + def pg_version(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "pg_version", value) + + @property + @pulumi.getter + def roles(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]]: + """ + List of roles in the database. + """ + return pulumi.get(self, "roles") + + @roles.setter + def roles(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['DatabaseRoleArgs']]]]): + pulumi.set(self, "roles", value) + + @property + @pulumi.getter + def status(self) -> Optional[pulumi.Input[str]]: + """ + The current status of the database. + """ + return pulumi.get(self, "status") + + @status.setter + def status(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "status", value) + + +class Database(pulumi.CustomResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + backups: Optional[pulumi.Input[pulumi.InputType['DatabaseBackupsArgs']]] = None, + cluster_id: Optional[pulumi.Input[str]] = None, + config_version: Optional[pulumi.Input[str]] = None, + extensions: Optional[pulumi.Input[pulumi.InputType['DatabaseExtensionsArgs']]] = None, + name: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Mapping[str, pulumi.Input[pulumi.InputType['DatabaseNodesArgs']]]]] = None, + options: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + roles: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseRoleArgs']]]]] = None, + __props__=None): + """ + Manages a pgEdge database. + + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[pulumi.InputType['DatabaseBackupsArgs']] backups: Backup configuration for the database. + :param pulumi.Input[str] cluster_id: The ID of the cluster this database belongs to. + :param pulumi.Input[str] config_version: The configuration version of the database. + :param pulumi.Input[pulumi.InputType['DatabaseExtensionsArgs']] extensions: Extensions configuration for the database. + :param pulumi.Input[str] name: The name of the database. + :param pulumi.Input[Mapping[str, pulumi.Input[pulumi.InputType['DatabaseNodesArgs']]]] nodes: Map of nodes in the database. + :param pulumi.Input[Sequence[pulumi.Input[str]]] options: A list of options for the database. + :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseRoleArgs']]]] roles: List of roles in the database. + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: DatabaseArgs, + opts: Optional[pulumi.ResourceOptions] = None): + """ + Manages a pgEdge database. + + :param str resource_name: The name of the resource. + :param DatabaseArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(DatabaseArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + backups: Optional[pulumi.Input[pulumi.InputType['DatabaseBackupsArgs']]] = None, + cluster_id: Optional[pulumi.Input[str]] = None, + config_version: Optional[pulumi.Input[str]] = None, + extensions: Optional[pulumi.Input[pulumi.InputType['DatabaseExtensionsArgs']]] = None, + name: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Mapping[str, pulumi.Input[pulumi.InputType['DatabaseNodesArgs']]]]] = None, + options: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + roles: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseRoleArgs']]]]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = DatabaseArgs.__new__(DatabaseArgs) + + __props__.__dict__["backups"] = backups + if cluster_id is None and not opts.urn: + raise TypeError("Missing required property 'cluster_id'") + __props__.__dict__["cluster_id"] = cluster_id + __props__.__dict__["config_version"] = config_version + __props__.__dict__["extensions"] = extensions + __props__.__dict__["name"] = name + if nodes is None and not opts.urn: + raise TypeError("Missing required property 'nodes'") + __props__.__dict__["nodes"] = nodes + __props__.__dict__["options"] = options + __props__.__dict__["roles"] = roles + __props__.__dict__["components"] = None + __props__.__dict__["created_at"] = None + __props__.__dict__["domain"] = None + __props__.__dict__["pg_version"] = None + __props__.__dict__["status"] = None + super(Database, __self__).__init__( + 'pgedge:index/database:Database', + resource_name, + __props__, + opts) + + @staticmethod + def get(resource_name: str, + id: pulumi.Input[str], + opts: Optional[pulumi.ResourceOptions] = None, + backups: Optional[pulumi.Input[pulumi.InputType['DatabaseBackupsArgs']]] = None, + cluster_id: Optional[pulumi.Input[str]] = None, + components: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseComponentArgs']]]]] = None, + config_version: Optional[pulumi.Input[str]] = None, + created_at: Optional[pulumi.Input[str]] = None, + domain: Optional[pulumi.Input[str]] = None, + extensions: Optional[pulumi.Input[pulumi.InputType['DatabaseExtensionsArgs']]] = None, + name: Optional[pulumi.Input[str]] = None, + nodes: Optional[pulumi.Input[Mapping[str, pulumi.Input[pulumi.InputType['DatabaseNodesArgs']]]]] = None, + options: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None, + pg_version: Optional[pulumi.Input[str]] = None, + roles: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseRoleArgs']]]]] = None, + status: Optional[pulumi.Input[str]] = None) -> 'Database': + """ + Get an existing Database resource's state with the given name, id, and optional extra + properties used to qualify the lookup. + + :param str resource_name: The unique name of the resulting resource. + :param pulumi.Input[str] id: The unique provider ID of the resource to lookup. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[pulumi.InputType['DatabaseBackupsArgs']] backups: Backup configuration for the database. + :param pulumi.Input[str] cluster_id: The ID of the cluster this database belongs to. + :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseComponentArgs']]]] components: List of components in the database. + :param pulumi.Input[str] config_version: The configuration version of the database. + :param pulumi.Input[str] created_at: The timestamp when the database was created. + :param pulumi.Input[str] domain: The domain associated with the database. + :param pulumi.Input[pulumi.InputType['DatabaseExtensionsArgs']] extensions: Extensions configuration for the database. + :param pulumi.Input[str] name: The name of the database. + :param pulumi.Input[Mapping[str, pulumi.Input[pulumi.InputType['DatabaseNodesArgs']]]] nodes: Map of nodes in the database. + :param pulumi.Input[Sequence[pulumi.Input[str]]] options: A list of options for the database. + :param pulumi.Input[str] pg_version: The PostgreSQL version of the database. + :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['DatabaseRoleArgs']]]] roles: List of roles in the database. + :param pulumi.Input[str] status: The current status of the database. + """ + opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id)) + + __props__ = _DatabaseState.__new__(_DatabaseState) + + __props__.__dict__["backups"] = backups + __props__.__dict__["cluster_id"] = cluster_id + __props__.__dict__["components"] = components + __props__.__dict__["config_version"] = config_version + __props__.__dict__["created_at"] = created_at + __props__.__dict__["domain"] = domain + __props__.__dict__["extensions"] = extensions + __props__.__dict__["name"] = name + __props__.__dict__["nodes"] = nodes + __props__.__dict__["options"] = options + __props__.__dict__["pg_version"] = pg_version + __props__.__dict__["roles"] = roles + __props__.__dict__["status"] = status + return Database(resource_name, opts=opts, __props__=__props__) + + @property + @pulumi.getter + def backups(self) -> pulumi.Output['outputs.DatabaseBackups']: + """ + Backup configuration for the database. + """ + return pulumi.get(self, "backups") + + @property + @pulumi.getter(name="clusterId") + def cluster_id(self) -> pulumi.Output[str]: + """ + The ID of the cluster this database belongs to. + """ + return pulumi.get(self, "cluster_id") + + @property + @pulumi.getter + def components(self) -> pulumi.Output[Sequence['outputs.DatabaseComponent']]: + """ + List of components in the database. + """ + return pulumi.get(self, "components") + + @property + @pulumi.getter(name="configVersion") + def config_version(self) -> pulumi.Output[str]: + """ + The configuration version of the database. + """ + return pulumi.get(self, "config_version") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> pulumi.Output[str]: + """ + The timestamp when the database was created. + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def domain(self) -> pulumi.Output[str]: + """ + The domain associated with the database. + """ + return pulumi.get(self, "domain") + + @property + @pulumi.getter + def extensions(self) -> pulumi.Output['outputs.DatabaseExtensions']: + """ + Extensions configuration for the database. + """ + return pulumi.get(self, "extensions") + + @property + @pulumi.getter + def name(self) -> pulumi.Output[str]: + """ + The name of the database. + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def nodes(self) -> pulumi.Output[Mapping[str, 'outputs.DatabaseNodes']]: + """ + Map of nodes in the database. + """ + return pulumi.get(self, "nodes") + + @property + @pulumi.getter + def options(self) -> pulumi.Output[Optional[Sequence[str]]]: + """ + A list of options for the database. + """ + return pulumi.get(self, "options") + + @property + @pulumi.getter(name="pgVersion") + def pg_version(self) -> pulumi.Output[str]: + """ + The PostgreSQL version of the database. + """ + return pulumi.get(self, "pg_version") + + @property + @pulumi.getter + def roles(self) -> pulumi.Output[Sequence['outputs.DatabaseRole']]: + """ + List of roles in the database. + """ + return pulumi.get(self, "roles") + + @property + @pulumi.getter + def status(self) -> pulumi.Output[str]: + """ + The current status of the database. + """ + return pulumi.get(self, "status") + diff --git a/sdk/python/pgEdge_pulumi_pgedge/get_backup_stores.py b/sdk/python/pgEdge_pulumi_pgedge/get_backup_stores.py new file mode 100644 index 0000000..560d267 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/get_backup_stores.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'GetBackupStoresResult', + 'AwaitableGetBackupStoresResult', + 'get_backup_stores', + 'get_backup_stores_output', +] + +@pulumi.output_type +class GetBackupStoresResult: + """ + A collection of values returned by getBackupStores. + """ + def __init__(__self__, backup_stores=None, id=None): + if backup_stores and not isinstance(backup_stores, list): + raise TypeError("Expected argument 'backup_stores' to be a list") + pulumi.set(__self__, "backup_stores", backup_stores) + if id and not isinstance(id, str): + raise TypeError("Expected argument 'id' to be a str") + pulumi.set(__self__, "id", id) + + @property + @pulumi.getter(name="backupStores") + def backup_stores(self) -> Sequence['outputs.GetBackupStoresBackupStoreResult']: + return pulumi.get(self, "backup_stores") + + @property + @pulumi.getter + def id(self) -> str: + """ + The provider-assigned unique ID for this managed resource. + """ + return pulumi.get(self, "id") + + +class AwaitableGetBackupStoresResult(GetBackupStoresResult): + # pylint: disable=using-constant-test + def __await__(self): + if False: + yield self + return GetBackupStoresResult( + backup_stores=self.backup_stores, + id=self.id) + + +def get_backup_stores(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetBackupStoresResult: + """ + Use this data source to access information about an existing resource. + """ + __args__ = dict() + opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts) + __ret__ = pulumi.runtime.invoke('pgedge:index/getBackupStores:getBackupStores', __args__, opts=opts, typ=GetBackupStoresResult).value + + return AwaitableGetBackupStoresResult( + backup_stores=pulumi.get(__ret__, 'backup_stores'), + id=pulumi.get(__ret__, 'id')) + + +@_utilities.lift_output_func(get_backup_stores) +def get_backup_stores_output(opts: Optional[pulumi.InvokeOptions] = None) -> pulumi.Output[GetBackupStoresResult]: + """ + Use this data source to access information about an existing resource. + """ + ... diff --git a/sdk/python/pgEdge_pulumi_pgedge/get_cloud_accounts.py b/sdk/python/pgEdge_pulumi_pgedge/get_cloud_accounts.py new file mode 100644 index 0000000..130d0cc --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/get_cloud_accounts.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'GetCloudAccountsResult', + 'AwaitableGetCloudAccountsResult', + 'get_cloud_accounts', + 'get_cloud_accounts_output', +] + +@pulumi.output_type +class GetCloudAccountsResult: + """ + A collection of values returned by getCloudAccounts. + """ + def __init__(__self__, cloud_accounts=None, id=None): + if cloud_accounts and not isinstance(cloud_accounts, list): + raise TypeError("Expected argument 'cloud_accounts' to be a list") + pulumi.set(__self__, "cloud_accounts", cloud_accounts) + if id and not isinstance(id, str): + raise TypeError("Expected argument 'id' to be a str") + pulumi.set(__self__, "id", id) + + @property + @pulumi.getter(name="cloudAccounts") + def cloud_accounts(self) -> Sequence['outputs.GetCloudAccountsCloudAccountResult']: + return pulumi.get(self, "cloud_accounts") + + @property + @pulumi.getter + def id(self) -> str: + """ + The provider-assigned unique ID for this managed resource. + """ + return pulumi.get(self, "id") + + +class AwaitableGetCloudAccountsResult(GetCloudAccountsResult): + # pylint: disable=using-constant-test + def __await__(self): + if False: + yield self + return GetCloudAccountsResult( + cloud_accounts=self.cloud_accounts, + id=self.id) + + +def get_cloud_accounts(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetCloudAccountsResult: + """ + Data source for pgEdge cloud accounts. + """ + __args__ = dict() + opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts) + __ret__ = pulumi.runtime.invoke('pgedge:index/getCloudAccounts:getCloudAccounts', __args__, opts=opts, typ=GetCloudAccountsResult).value + + return AwaitableGetCloudAccountsResult( + cloud_accounts=pulumi.get(__ret__, 'cloud_accounts'), + id=pulumi.get(__ret__, 'id')) + + +@_utilities.lift_output_func(get_cloud_accounts) +def get_cloud_accounts_output(opts: Optional[pulumi.InvokeOptions] = None) -> pulumi.Output[GetCloudAccountsResult]: + """ + Data source for pgEdge cloud accounts. + """ + ... diff --git a/sdk/python/pgEdge_pulumi_pgedge/get_clusters.py b/sdk/python/pgEdge_pulumi_pgedge/get_clusters.py new file mode 100644 index 0000000..03be7f7 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/get_clusters.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'GetClustersResult', + 'AwaitableGetClustersResult', + 'get_clusters', + 'get_clusters_output', +] + +@pulumi.output_type +class GetClustersResult: + """ + A collection of values returned by getClusters. + """ + def __init__(__self__, clusters=None, id=None): + if clusters and not isinstance(clusters, list): + raise TypeError("Expected argument 'clusters' to be a list") + pulumi.set(__self__, "clusters", clusters) + if id and not isinstance(id, str): + raise TypeError("Expected argument 'id' to be a str") + pulumi.set(__self__, "id", id) + + @property + @pulumi.getter + def clusters(self) -> Sequence['outputs.GetClustersClusterResult']: + return pulumi.get(self, "clusters") + + @property + @pulumi.getter + def id(self) -> str: + """ + The provider-assigned unique ID for this managed resource. + """ + return pulumi.get(self, "id") + + +class AwaitableGetClustersResult(GetClustersResult): + # pylint: disable=using-constant-test + def __await__(self): + if False: + yield self + return GetClustersResult( + clusters=self.clusters, + id=self.id) + + +def get_clusters(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetClustersResult: + """ + Data source for pgEdge clusters. + """ + __args__ = dict() + opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts) + __ret__ = pulumi.runtime.invoke('pgedge:index/getClusters:getClusters', __args__, opts=opts, typ=GetClustersResult).value + + return AwaitableGetClustersResult( + clusters=pulumi.get(__ret__, 'clusters'), + id=pulumi.get(__ret__, 'id')) + + +@_utilities.lift_output_func(get_clusters) +def get_clusters_output(opts: Optional[pulumi.InvokeOptions] = None) -> pulumi.Output[GetClustersResult]: + """ + Data source for pgEdge clusters. + """ + ... diff --git a/sdk/python/pgEdge_pulumi_pgedge/get_databases.py b/sdk/python/pgEdge_pulumi_pgedge/get_databases.py new file mode 100644 index 0000000..8cfac99 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/get_databases.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'GetDatabasesResult', + 'AwaitableGetDatabasesResult', + 'get_databases', + 'get_databases_output', +] + +@pulumi.output_type +class GetDatabasesResult: + """ + A collection of values returned by getDatabases. + """ + def __init__(__self__, databases=None, id=None): + if databases and not isinstance(databases, list): + raise TypeError("Expected argument 'databases' to be a list") + pulumi.set(__self__, "databases", databases) + if id and not isinstance(id, str): + raise TypeError("Expected argument 'id' to be a str") + pulumi.set(__self__, "id", id) + + @property + @pulumi.getter + def databases(self) -> Sequence['outputs.GetDatabasesDatabaseResult']: + return pulumi.get(self, "databases") + + @property + @pulumi.getter + def id(self) -> str: + """ + The provider-assigned unique ID for this managed resource. + """ + return pulumi.get(self, "id") + + +class AwaitableGetDatabasesResult(GetDatabasesResult): + # pylint: disable=using-constant-test + def __await__(self): + if False: + yield self + return GetDatabasesResult( + databases=self.databases, + id=self.id) + + +def get_databases(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetDatabasesResult: + """ + Data source for pgEdge databases + """ + __args__ = dict() + opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts) + __ret__ = pulumi.runtime.invoke('pgedge:index/getDatabases:getDatabases', __args__, opts=opts, typ=GetDatabasesResult).value + + return AwaitableGetDatabasesResult( + databases=pulumi.get(__ret__, 'databases'), + id=pulumi.get(__ret__, 'id')) + + +@_utilities.lift_output_func(get_databases) +def get_databases_output(opts: Optional[pulumi.InvokeOptions] = None) -> pulumi.Output[GetDatabasesResult]: + """ + Data source for pgEdge databases + """ + ... diff --git a/sdk/python/pgEdge_pulumi_pgedge/get_ssh_keys.py b/sdk/python/pgEdge_pulumi_pgedge/get_ssh_keys.py new file mode 100644 index 0000000..ccc540e --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/get_ssh_keys.py @@ -0,0 +1,75 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'GetSSHKeysResult', + 'AwaitableGetSSHKeysResult', + 'get_ssh_keys', + 'get_ssh_keys_output', +] + +@pulumi.output_type +class GetSSHKeysResult: + """ + A collection of values returned by getSSHKeys. + """ + def __init__(__self__, id=None, ssh_keys=None): + if id and not isinstance(id, str): + raise TypeError("Expected argument 'id' to be a str") + pulumi.set(__self__, "id", id) + if ssh_keys and not isinstance(ssh_keys, list): + raise TypeError("Expected argument 'ssh_keys' to be a list") + pulumi.set(__self__, "ssh_keys", ssh_keys) + + @property + @pulumi.getter + def id(self) -> str: + """ + The provider-assigned unique ID for this managed resource. + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter(name="sshKeys") + def ssh_keys(self) -> Sequence['outputs.GetSSHKeysSshKeyResult']: + return pulumi.get(self, "ssh_keys") + + +class AwaitableGetSSHKeysResult(GetSSHKeysResult): + # pylint: disable=using-constant-test + def __await__(self): + if False: + yield self + return GetSSHKeysResult( + id=self.id, + ssh_keys=self.ssh_keys) + + +def get_ssh_keys(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetSSHKeysResult: + """ + Data source for pgEdge SSH keys. + """ + __args__ = dict() + opts = pulumi.InvokeOptions.merge(_utilities.get_invoke_opts_defaults(), opts) + __ret__ = pulumi.runtime.invoke('pgedge:index/getSSHKeys:getSSHKeys', __args__, opts=opts, typ=GetSSHKeysResult).value + + return AwaitableGetSSHKeysResult( + id=pulumi.get(__ret__, 'id'), + ssh_keys=pulumi.get(__ret__, 'ssh_keys')) + + +@_utilities.lift_output_func(get_ssh_keys) +def get_ssh_keys_output(opts: Optional[pulumi.InvokeOptions] = None) -> pulumi.Output[GetSSHKeysResult]: + """ + Data source for pgEdge SSH keys. + """ + ... diff --git a/sdk/python/pgEdge_pulumi_pgedge/outputs.py b/sdk/python/pgEdge_pulumi_pgedge/outputs.py new file mode 100644 index 0000000..56281f3 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/outputs.py @@ -0,0 +1,2567 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities +from . import outputs + +__all__ = [ + 'ClusterFirewallRule', + 'ClusterNetwork', + 'ClusterNode', + 'DatabaseBackups', + 'DatabaseBackupsConfig', + 'DatabaseBackupsConfigRepository', + 'DatabaseBackupsConfigSchedule', + 'DatabaseComponent', + 'DatabaseExtensions', + 'DatabaseNodes', + 'DatabaseNodesConnection', + 'DatabaseNodesExtensions', + 'DatabaseNodesLocation', + 'DatabaseNodesRegion', + 'DatabaseRole', + 'GetBackupStoresBackupStoreResult', + 'GetCloudAccountsCloudAccountResult', + 'GetClustersClusterResult', + 'GetClustersClusterFirewallRuleResult', + 'GetClustersClusterNetworkResult', + 'GetClustersClusterNodeResult', + 'GetDatabasesDatabaseResult', + 'GetDatabasesDatabaseBackupsResult', + 'GetDatabasesDatabaseBackupsConfigResult', + 'GetDatabasesDatabaseBackupsConfigRepositoryResult', + 'GetDatabasesDatabaseBackupsConfigScheduleResult', + 'GetDatabasesDatabaseComponentResult', + 'GetDatabasesDatabaseExtensionsResult', + 'GetDatabasesDatabaseNodesResult', + 'GetDatabasesDatabaseNodesConnectionResult', + 'GetDatabasesDatabaseNodesExtensionsResult', + 'GetDatabasesDatabaseNodesLocationResult', + 'GetDatabasesDatabaseNodesRegionResult', + 'GetDatabasesDatabaseRoleResult', + 'GetSSHKeysSshKeyResult', +] + +@pulumi.output_type +class ClusterFirewallRule(dict): + def __init__(__self__, *, + name: str, + port: int, + sources: Sequence[str]): + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "port", port) + pulumi.set(__self__, "sources", sources) + + @property + @pulumi.getter + def name(self) -> str: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def port(self) -> int: + return pulumi.get(self, "port") + + @property + @pulumi.getter + def sources(self) -> Sequence[str]: + return pulumi.get(self, "sources") + + +@pulumi.output_type +class ClusterNetwork(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "publicSubnets": + suggest = "public_subnets" + elif key == "externalId": + suggest = "external_id" + elif key == "privateSubnets": + suggest = "private_subnets" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in ClusterNetwork. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + ClusterNetwork.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + ClusterNetwork.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + cidr: str, + public_subnets: Sequence[str], + region: str, + external: Optional[bool] = None, + external_id: Optional[str] = None, + name: Optional[str] = None, + private_subnets: Optional[Sequence[str]] = None): + """ + :param str cidr: CIDR of the network + :param Sequence[str] public_subnets: List of public subnets + :param str region: Region of the network + :param bool external: Whether the network is external + :param str external_id: External ID of the network + :param str name: Name of the network + :param Sequence[str] private_subnets: List of private subnets + """ + pulumi.set(__self__, "cidr", cidr) + pulumi.set(__self__, "public_subnets", public_subnets) + pulumi.set(__self__, "region", region) + if external is not None: + pulumi.set(__self__, "external", external) + if external_id is not None: + pulumi.set(__self__, "external_id", external_id) + if name is not None: + pulumi.set(__self__, "name", name) + if private_subnets is not None: + pulumi.set(__self__, "private_subnets", private_subnets) + + @property + @pulumi.getter + def cidr(self) -> str: + """ + CIDR of the network + """ + return pulumi.get(self, "cidr") + + @property + @pulumi.getter(name="publicSubnets") + def public_subnets(self) -> Sequence[str]: + """ + List of public subnets + """ + return pulumi.get(self, "public_subnets") + + @property + @pulumi.getter + def region(self) -> str: + """ + Region of the network + """ + return pulumi.get(self, "region") + + @property + @pulumi.getter + def external(self) -> Optional[bool]: + """ + Whether the network is external + """ + return pulumi.get(self, "external") + + @property + @pulumi.getter(name="externalId") + def external_id(self) -> Optional[str]: + """ + External ID of the network + """ + return pulumi.get(self, "external_id") + + @property + @pulumi.getter + def name(self) -> Optional[str]: + """ + Name of the network + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="privateSubnets") + def private_subnets(self) -> Optional[Sequence[str]]: + """ + List of private subnets + """ + return pulumi.get(self, "private_subnets") + + +@pulumi.output_type +class ClusterNode(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "instanceType": + suggest = "instance_type" + elif key == "availabilityZone": + suggest = "availability_zone" + elif key == "volumeIops": + suggest = "volume_iops" + elif key == "volumeSize": + suggest = "volume_size" + elif key == "volumeType": + suggest = "volume_type" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in ClusterNode. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + ClusterNode.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + ClusterNode.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + instance_type: str, + name: str, + region: str, + availability_zone: Optional[str] = None, + volume_iops: Optional[int] = None, + volume_size: Optional[int] = None, + volume_type: Optional[str] = None): + pulumi.set(__self__, "instance_type", instance_type) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "region", region) + if availability_zone is not None: + pulumi.set(__self__, "availability_zone", availability_zone) + if volume_iops is not None: + pulumi.set(__self__, "volume_iops", volume_iops) + if volume_size is not None: + pulumi.set(__self__, "volume_size", volume_size) + if volume_type is not None: + pulumi.set(__self__, "volume_type", volume_type) + + @property + @pulumi.getter(name="instanceType") + def instance_type(self) -> str: + return pulumi.get(self, "instance_type") + + @property + @pulumi.getter + def name(self) -> str: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def region(self) -> str: + return pulumi.get(self, "region") + + @property + @pulumi.getter(name="availabilityZone") + def availability_zone(self) -> Optional[str]: + return pulumi.get(self, "availability_zone") + + @property + @pulumi.getter(name="volumeIops") + def volume_iops(self) -> Optional[int]: + return pulumi.get(self, "volume_iops") + + @property + @pulumi.getter(name="volumeSize") + def volume_size(self) -> Optional[int]: + return pulumi.get(self, "volume_size") + + @property + @pulumi.getter(name="volumeType") + def volume_type(self) -> Optional[str]: + return pulumi.get(self, "volume_type") + + +@pulumi.output_type +class DatabaseBackups(dict): + def __init__(__self__, *, + configs: Optional[Sequence['outputs.DatabaseBackupsConfig']] = None, + provider: Optional[str] = None): + """ + :param Sequence['DatabaseBackupsConfigArgs'] configs: List of backup configurations. + :param str provider: The backup provider. + """ + if configs is not None: + pulumi.set(__self__, "configs", configs) + if provider is not None: + pulumi.set(__self__, "provider", provider) + + @property + @pulumi.getter + def configs(self) -> Optional[Sequence['outputs.DatabaseBackupsConfig']]: + """ + List of backup configurations. + """ + return pulumi.get(self, "configs") + + @property + @pulumi.getter + def provider(self) -> Optional[str]: + """ + The backup provider. + """ + return pulumi.get(self, "provider") + + +@pulumi.output_type +class DatabaseBackupsConfig(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "nodeName": + suggest = "node_name" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseBackupsConfig. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseBackupsConfig.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseBackupsConfig.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + id: Optional[str] = None, + node_name: Optional[str] = None, + repositories: Optional[Sequence['outputs.DatabaseBackupsConfigRepository']] = None, + schedules: Optional[Sequence['outputs.DatabaseBackupsConfigSchedule']] = None): + """ + :param str id: Unique identifier for the backup config. + :param str node_name: Name of the node. + :param Sequence['DatabaseBackupsConfigRepositoryArgs'] repositories: List of backup repositories. + :param Sequence['DatabaseBackupsConfigScheduleArgs'] schedules: List of backup schedules. + """ + if id is not None: + pulumi.set(__self__, "id", id) + if node_name is not None: + pulumi.set(__self__, "node_name", node_name) + if repositories is not None: + pulumi.set(__self__, "repositories", repositories) + if schedules is not None: + pulumi.set(__self__, "schedules", schedules) + + @property + @pulumi.getter + def id(self) -> Optional[str]: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter(name="nodeName") + def node_name(self) -> Optional[str]: + """ + Name of the node. + """ + return pulumi.get(self, "node_name") + + @property + @pulumi.getter + def repositories(self) -> Optional[Sequence['outputs.DatabaseBackupsConfigRepository']]: + """ + List of backup repositories. + """ + return pulumi.get(self, "repositories") + + @property + @pulumi.getter + def schedules(self) -> Optional[Sequence['outputs.DatabaseBackupsConfigSchedule']]: + """ + List of backup schedules. + """ + return pulumi.get(self, "schedules") + + +@pulumi.output_type +class DatabaseBackupsConfigRepository(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "azureAccount": + suggest = "azure_account" + elif key == "azureContainer": + suggest = "azure_container" + elif key == "azureEndpoint": + suggest = "azure_endpoint" + elif key == "backupStoreId": + suggest = "backup_store_id" + elif key == "basePath": + suggest = "base_path" + elif key == "gcsBucket": + suggest = "gcs_bucket" + elif key == "gcsEndpoint": + suggest = "gcs_endpoint" + elif key == "retentionFull": + suggest = "retention_full" + elif key == "retentionFullType": + suggest = "retention_full_type" + elif key == "s3Bucket": + suggest = "s3_bucket" + elif key == "s3Endpoint": + suggest = "s3_endpoint" + elif key == "s3Region": + suggest = "s3_region" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseBackupsConfigRepository. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseBackupsConfigRepository.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseBackupsConfigRepository.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + azure_account: Optional[str] = None, + azure_container: Optional[str] = None, + azure_endpoint: Optional[str] = None, + backup_store_id: Optional[str] = None, + base_path: Optional[str] = None, + gcs_bucket: Optional[str] = None, + gcs_endpoint: Optional[str] = None, + id: Optional[str] = None, + retention_full: Optional[int] = None, + retention_full_type: Optional[str] = None, + s3_bucket: Optional[str] = None, + s3_endpoint: Optional[str] = None, + s3_region: Optional[str] = None, + type: Optional[str] = None): + """ + :param str azure_account: Azure account for azure-type repositories. + :param str azure_container: Azure container for azure-type repositories. + :param str azure_endpoint: Azure endpoint for azure-type repositories. + :param str backup_store_id: ID of the backup store to use. If specified, other fields will be automatically populated. + :param str base_path: Base path for the repository. + :param str gcs_bucket: GCS bucket name for gcs-type repositories. + :param str gcs_endpoint: GCS endpoint for gcs-type repositories. + :param str id: Unique identifier for the backup config. + :param int retention_full: Retention period for full backups. + :param str retention_full_type: Type of retention for full backups. + :param str s3_bucket: S3 bucket name for s3-type repositories. + :param str s3_endpoint: S3 endpoint for s3-type repositories. + :param str s3_region: S3 region for s3-type repositories. + :param str type: Repository type (e.g., s3, gcs, azure). + """ + if azure_account is not None: + pulumi.set(__self__, "azure_account", azure_account) + if azure_container is not None: + pulumi.set(__self__, "azure_container", azure_container) + if azure_endpoint is not None: + pulumi.set(__self__, "azure_endpoint", azure_endpoint) + if backup_store_id is not None: + pulumi.set(__self__, "backup_store_id", backup_store_id) + if base_path is not None: + pulumi.set(__self__, "base_path", base_path) + if gcs_bucket is not None: + pulumi.set(__self__, "gcs_bucket", gcs_bucket) + if gcs_endpoint is not None: + pulumi.set(__self__, "gcs_endpoint", gcs_endpoint) + if id is not None: + pulumi.set(__self__, "id", id) + if retention_full is not None: + pulumi.set(__self__, "retention_full", retention_full) + if retention_full_type is not None: + pulumi.set(__self__, "retention_full_type", retention_full_type) + if s3_bucket is not None: + pulumi.set(__self__, "s3_bucket", s3_bucket) + if s3_endpoint is not None: + pulumi.set(__self__, "s3_endpoint", s3_endpoint) + if s3_region is not None: + pulumi.set(__self__, "s3_region", s3_region) + if type is not None: + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="azureAccount") + def azure_account(self) -> Optional[str]: + """ + Azure account for azure-type repositories. + """ + return pulumi.get(self, "azure_account") + + @property + @pulumi.getter(name="azureContainer") + def azure_container(self) -> Optional[str]: + """ + Azure container for azure-type repositories. + """ + return pulumi.get(self, "azure_container") + + @property + @pulumi.getter(name="azureEndpoint") + def azure_endpoint(self) -> Optional[str]: + """ + Azure endpoint for azure-type repositories. + """ + return pulumi.get(self, "azure_endpoint") + + @property + @pulumi.getter(name="backupStoreId") + def backup_store_id(self) -> Optional[str]: + """ + ID of the backup store to use. If specified, other fields will be automatically populated. + """ + return pulumi.get(self, "backup_store_id") + + @property + @pulumi.getter(name="basePath") + def base_path(self) -> Optional[str]: + """ + Base path for the repository. + """ + return pulumi.get(self, "base_path") + + @property + @pulumi.getter(name="gcsBucket") + def gcs_bucket(self) -> Optional[str]: + """ + GCS bucket name for gcs-type repositories. + """ + return pulumi.get(self, "gcs_bucket") + + @property + @pulumi.getter(name="gcsEndpoint") + def gcs_endpoint(self) -> Optional[str]: + """ + GCS endpoint for gcs-type repositories. + """ + return pulumi.get(self, "gcs_endpoint") + + @property + @pulumi.getter + def id(self) -> Optional[str]: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter(name="retentionFull") + def retention_full(self) -> Optional[int]: + """ + Retention period for full backups. + """ + return pulumi.get(self, "retention_full") + + @property + @pulumi.getter(name="retentionFullType") + def retention_full_type(self) -> Optional[str]: + """ + Type of retention for full backups. + """ + return pulumi.get(self, "retention_full_type") + + @property + @pulumi.getter(name="s3Bucket") + def s3_bucket(self) -> Optional[str]: + """ + S3 bucket name for s3-type repositories. + """ + return pulumi.get(self, "s3_bucket") + + @property + @pulumi.getter(name="s3Endpoint") + def s3_endpoint(self) -> Optional[str]: + """ + S3 endpoint for s3-type repositories. + """ + return pulumi.get(self, "s3_endpoint") + + @property + @pulumi.getter(name="s3Region") + def s3_region(self) -> Optional[str]: + """ + S3 region for s3-type repositories. + """ + return pulumi.get(self, "s3_region") + + @property + @pulumi.getter + def type(self) -> Optional[str]: + """ + Repository type (e.g., s3, gcs, azure). + """ + return pulumi.get(self, "type") + + +@pulumi.output_type +class DatabaseBackupsConfigSchedule(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "cronExpression": + suggest = "cron_expression" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseBackupsConfigSchedule. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseBackupsConfigSchedule.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseBackupsConfigSchedule.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + cron_expression: str, + id: str, + type: str): + """ + :param str cron_expression: Cron expression for the schedule. + :param str id: Unique identifier for the backup config. + :param str type: Repository type (e.g., s3, gcs, azure). + """ + pulumi.set(__self__, "cron_expression", cron_expression) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="cronExpression") + def cron_expression(self) -> str: + """ + Cron expression for the schedule. + """ + return pulumi.get(self, "cron_expression") + + @property + @pulumi.getter + def id(self) -> str: + """ + Unique identifier for the backup config. + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def type(self) -> str: + """ + Repository type (e.g., s3, gcs, azure). + """ + return pulumi.get(self, "type") + + +@pulumi.output_type +class DatabaseComponent(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "releaseDate": + suggest = "release_date" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseComponent. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseComponent.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseComponent.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + id: Optional[str] = None, + name: Optional[str] = None, + release_date: Optional[str] = None, + status: Optional[str] = None, + version: Optional[str] = None): + if id is not None: + pulumi.set(__self__, "id", id) + if name is not None: + pulumi.set(__self__, "name", name) + if release_date is not None: + pulumi.set(__self__, "release_date", release_date) + if status is not None: + pulumi.set(__self__, "status", status) + if version is not None: + pulumi.set(__self__, "version", version) + + @property + @pulumi.getter + def id(self) -> Optional[str]: + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> Optional[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="releaseDate") + def release_date(self) -> Optional[str]: + return pulumi.get(self, "release_date") + + @property + @pulumi.getter + def status(self) -> Optional[str]: + return pulumi.get(self, "status") + + @property + @pulumi.getter + def version(self) -> Optional[str]: + return pulumi.get(self, "version") + + +@pulumi.output_type +class DatabaseExtensions(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "autoManage": + suggest = "auto_manage" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseExtensions. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseExtensions.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseExtensions.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + auto_manage: Optional[bool] = None, + availables: Optional[Sequence[str]] = None, + requesteds: Optional[Sequence[str]] = None): + if auto_manage is not None: + pulumi.set(__self__, "auto_manage", auto_manage) + if availables is not None: + pulumi.set(__self__, "availables", availables) + if requesteds is not None: + pulumi.set(__self__, "requesteds", requesteds) + + @property + @pulumi.getter(name="autoManage") + def auto_manage(self) -> Optional[bool]: + return pulumi.get(self, "auto_manage") + + @property + @pulumi.getter + def availables(self) -> Optional[Sequence[str]]: + return pulumi.get(self, "availables") + + @property + @pulumi.getter + def requesteds(self) -> Optional[Sequence[str]]: + return pulumi.get(self, "requesteds") + + +@pulumi.output_type +class DatabaseNodes(dict): + def __init__(__self__, *, + name: str, + connection: Optional['outputs.DatabaseNodesConnection'] = None, + extensions: Optional['outputs.DatabaseNodesExtensions'] = None, + location: Optional['outputs.DatabaseNodesLocation'] = None, + region: Optional['outputs.DatabaseNodesRegion'] = None): + pulumi.set(__self__, "name", name) + if connection is not None: + pulumi.set(__self__, "connection", connection) + if extensions is not None: + pulumi.set(__self__, "extensions", extensions) + if location is not None: + pulumi.set(__self__, "location", location) + if region is not None: + pulumi.set(__self__, "region", region) + + @property + @pulumi.getter + def name(self) -> str: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def connection(self) -> Optional['outputs.DatabaseNodesConnection']: + return pulumi.get(self, "connection") + + @property + @pulumi.getter + def extensions(self) -> Optional['outputs.DatabaseNodesExtensions']: + return pulumi.get(self, "extensions") + + @property + @pulumi.getter + def location(self) -> Optional['outputs.DatabaseNodesLocation']: + return pulumi.get(self, "location") + + @property + @pulumi.getter + def region(self) -> Optional['outputs.DatabaseNodesRegion']: + return pulumi.get(self, "region") + + +@pulumi.output_type +class DatabaseNodesConnection(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "externalIpAddress": + suggest = "external_ip_address" + elif key == "internalHost": + suggest = "internal_host" + elif key == "internalIpAddress": + suggest = "internal_ip_address" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseNodesConnection. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseNodesConnection.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseNodesConnection.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + database: Optional[str] = None, + external_ip_address: Optional[str] = None, + host: Optional[str] = None, + internal_host: Optional[str] = None, + internal_ip_address: Optional[str] = None, + password: Optional[str] = None, + port: Optional[int] = None, + username: Optional[str] = None): + if database is not None: + pulumi.set(__self__, "database", database) + if external_ip_address is not None: + pulumi.set(__self__, "external_ip_address", external_ip_address) + if host is not None: + pulumi.set(__self__, "host", host) + if internal_host is not None: + pulumi.set(__self__, "internal_host", internal_host) + if internal_ip_address is not None: + pulumi.set(__self__, "internal_ip_address", internal_ip_address) + if password is not None: + pulumi.set(__self__, "password", password) + if port is not None: + pulumi.set(__self__, "port", port) + if username is not None: + pulumi.set(__self__, "username", username) + + @property + @pulumi.getter + def database(self) -> Optional[str]: + return pulumi.get(self, "database") + + @property + @pulumi.getter(name="externalIpAddress") + def external_ip_address(self) -> Optional[str]: + return pulumi.get(self, "external_ip_address") + + @property + @pulumi.getter + def host(self) -> Optional[str]: + return pulumi.get(self, "host") + + @property + @pulumi.getter(name="internalHost") + def internal_host(self) -> Optional[str]: + return pulumi.get(self, "internal_host") + + @property + @pulumi.getter(name="internalIpAddress") + def internal_ip_address(self) -> Optional[str]: + return pulumi.get(self, "internal_ip_address") + + @property + @pulumi.getter + def password(self) -> Optional[str]: + return pulumi.get(self, "password") + + @property + @pulumi.getter + def port(self) -> Optional[int]: + return pulumi.get(self, "port") + + @property + @pulumi.getter + def username(self) -> Optional[str]: + return pulumi.get(self, "username") + + +@pulumi.output_type +class DatabaseNodesExtensions(dict): + def __init__(__self__, *, + errors: Optional[Mapping[str, str]] = None, + installeds: Optional[Sequence[str]] = None): + if errors is not None: + pulumi.set(__self__, "errors", errors) + if installeds is not None: + pulumi.set(__self__, "installeds", installeds) + + @property + @pulumi.getter + def errors(self) -> Optional[Mapping[str, str]]: + return pulumi.get(self, "errors") + + @property + @pulumi.getter + def installeds(self) -> Optional[Sequence[str]]: + return pulumi.get(self, "installeds") + + +@pulumi.output_type +class DatabaseNodesLocation(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "metroCode": + suggest = "metro_code" + elif key == "postalCode": + suggest = "postal_code" + elif key == "regionCode": + suggest = "region_code" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseNodesLocation. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseNodesLocation.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseNodesLocation.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + city: Optional[str] = None, + code: Optional[str] = None, + country: Optional[str] = None, + latitude: Optional[float] = None, + longitude: Optional[float] = None, + metro_code: Optional[str] = None, + name: Optional[str] = None, + postal_code: Optional[str] = None, + region: Optional[str] = None, + region_code: Optional[str] = None, + timezone: Optional[str] = None): + if city is not None: + pulumi.set(__self__, "city", city) + if code is not None: + pulumi.set(__self__, "code", code) + if country is not None: + pulumi.set(__self__, "country", country) + if latitude is not None: + pulumi.set(__self__, "latitude", latitude) + if longitude is not None: + pulumi.set(__self__, "longitude", longitude) + if metro_code is not None: + pulumi.set(__self__, "metro_code", metro_code) + if name is not None: + pulumi.set(__self__, "name", name) + if postal_code is not None: + pulumi.set(__self__, "postal_code", postal_code) + if region is not None: + pulumi.set(__self__, "region", region) + if region_code is not None: + pulumi.set(__self__, "region_code", region_code) + if timezone is not None: + pulumi.set(__self__, "timezone", timezone) + + @property + @pulumi.getter + def city(self) -> Optional[str]: + return pulumi.get(self, "city") + + @property + @pulumi.getter + def code(self) -> Optional[str]: + return pulumi.get(self, "code") + + @property + @pulumi.getter + def country(self) -> Optional[str]: + return pulumi.get(self, "country") + + @property + @pulumi.getter + def latitude(self) -> Optional[float]: + return pulumi.get(self, "latitude") + + @property + @pulumi.getter + def longitude(self) -> Optional[float]: + return pulumi.get(self, "longitude") + + @property + @pulumi.getter(name="metroCode") + def metro_code(self) -> Optional[str]: + return pulumi.get(self, "metro_code") + + @property + @pulumi.getter + def name(self) -> Optional[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="postalCode") + def postal_code(self) -> Optional[str]: + return pulumi.get(self, "postal_code") + + @property + @pulumi.getter + def region(self) -> Optional[str]: + return pulumi.get(self, "region") + + @property + @pulumi.getter(name="regionCode") + def region_code(self) -> Optional[str]: + return pulumi.get(self, "region_code") + + @property + @pulumi.getter + def timezone(self) -> Optional[str]: + return pulumi.get(self, "timezone") + + +@pulumi.output_type +class DatabaseNodesRegion(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "availabilityZones": + suggest = "availability_zones" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseNodesRegion. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseNodesRegion.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseNodesRegion.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + active: Optional[bool] = None, + availability_zones: Optional[Sequence[str]] = None, + cloud: Optional[str] = None, + code: Optional[str] = None, + name: Optional[str] = None, + parent: Optional[str] = None): + if active is not None: + pulumi.set(__self__, "active", active) + if availability_zones is not None: + pulumi.set(__self__, "availability_zones", availability_zones) + if cloud is not None: + pulumi.set(__self__, "cloud", cloud) + if code is not None: + pulumi.set(__self__, "code", code) + if name is not None: + pulumi.set(__self__, "name", name) + if parent is not None: + pulumi.set(__self__, "parent", parent) + + @property + @pulumi.getter + def active(self) -> Optional[bool]: + return pulumi.get(self, "active") + + @property + @pulumi.getter(name="availabilityZones") + def availability_zones(self) -> Optional[Sequence[str]]: + return pulumi.get(self, "availability_zones") + + @property + @pulumi.getter + def cloud(self) -> Optional[str]: + return pulumi.get(self, "cloud") + + @property + @pulumi.getter + def code(self) -> Optional[str]: + return pulumi.get(self, "code") + + @property + @pulumi.getter + def name(self) -> Optional[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def parent(self) -> Optional[str]: + return pulumi.get(self, "parent") + + +@pulumi.output_type +class DatabaseRole(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "bypassRls": + suggest = "bypass_rls" + elif key == "connectionLimit": + suggest = "connection_limit" + elif key == "createDb": + suggest = "create_db" + elif key == "createRole": + suggest = "create_role" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in DatabaseRole. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + DatabaseRole.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + DatabaseRole.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + bypass_rls: Optional[bool] = None, + connection_limit: Optional[int] = None, + create_db: Optional[bool] = None, + create_role: Optional[bool] = None, + inherit: Optional[bool] = None, + login: Optional[bool] = None, + name: Optional[str] = None, + replication: Optional[bool] = None, + superuser: Optional[bool] = None): + if bypass_rls is not None: + pulumi.set(__self__, "bypass_rls", bypass_rls) + if connection_limit is not None: + pulumi.set(__self__, "connection_limit", connection_limit) + if create_db is not None: + pulumi.set(__self__, "create_db", create_db) + if create_role is not None: + pulumi.set(__self__, "create_role", create_role) + if inherit is not None: + pulumi.set(__self__, "inherit", inherit) + if login is not None: + pulumi.set(__self__, "login", login) + if name is not None: + pulumi.set(__self__, "name", name) + if replication is not None: + pulumi.set(__self__, "replication", replication) + if superuser is not None: + pulumi.set(__self__, "superuser", superuser) + + @property + @pulumi.getter(name="bypassRls") + def bypass_rls(self) -> Optional[bool]: + return pulumi.get(self, "bypass_rls") + + @property + @pulumi.getter(name="connectionLimit") + def connection_limit(self) -> Optional[int]: + return pulumi.get(self, "connection_limit") + + @property + @pulumi.getter(name="createDb") + def create_db(self) -> Optional[bool]: + return pulumi.get(self, "create_db") + + @property + @pulumi.getter(name="createRole") + def create_role(self) -> Optional[bool]: + return pulumi.get(self, "create_role") + + @property + @pulumi.getter + def inherit(self) -> Optional[bool]: + return pulumi.get(self, "inherit") + + @property + @pulumi.getter + def login(self) -> Optional[bool]: + return pulumi.get(self, "login") + + @property + @pulumi.getter + def name(self) -> Optional[str]: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def replication(self) -> Optional[bool]: + return pulumi.get(self, "replication") + + @property + @pulumi.getter + def superuser(self) -> Optional[bool]: + return pulumi.get(self, "superuser") + + +@pulumi.output_type +class GetBackupStoresBackupStoreResult(dict): + def __init__(__self__, *, + cloud_account_id: str, + cloud_account_type: str, + cluster_ids: Sequence[str], + created_at: str, + id: str, + name: str, + properties: Mapping[str, str], + status: str): + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + pulumi.set(__self__, "cloud_account_type", cloud_account_type) + pulumi.set(__self__, "cluster_ids", cluster_ids) + pulumi.set(__self__, "created_at", created_at) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "properties", properties) + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> str: + return pulumi.get(self, "cloud_account_id") + + @property + @pulumi.getter(name="cloudAccountType") + def cloud_account_type(self) -> str: + return pulumi.get(self, "cloud_account_type") + + @property + @pulumi.getter(name="clusterIds") + def cluster_ids(self) -> Sequence[str]: + return pulumi.get(self, "cluster_ids") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> str: + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def id(self) -> str: + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + return pulumi.get(self, "name") + + @property + @pulumi.getter + def properties(self) -> Mapping[str, str]: + return pulumi.get(self, "properties") + + @property + @pulumi.getter + def status(self) -> str: + return pulumi.get(self, "status") + + +@pulumi.output_type +class GetCloudAccountsCloudAccountResult(dict): + def __init__(__self__, *, + created_at: str, + description: str, + id: str, + name: str, + properties: Mapping[str, str], + type: str): + """ + :param str created_at: Creation time of the cloud account + :param str description: Description of the cloud account + :param str id: ID of the cloud account + :param str name: Name of the cloud account + :param Mapping[str, str] properties: Additional properties of the cloud account + :param str type: Type of the cloud account (e.g., AWS, Azure, GCP) + """ + pulumi.set(__self__, "created_at", created_at) + pulumi.set(__self__, "description", description) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "properties", properties) + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> str: + """ + Creation time of the cloud account + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def description(self) -> str: + """ + Description of the cloud account + """ + return pulumi.get(self, "description") + + @property + @pulumi.getter + def id(self) -> str: + """ + ID of the cloud account + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the cloud account + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def properties(self) -> Mapping[str, str]: + """ + Additional properties of the cloud account + """ + return pulumi.get(self, "properties") + + @property + @pulumi.getter + def type(self) -> str: + """ + Type of the cloud account (e.g., AWS, Azure, GCP) + """ + return pulumi.get(self, "type") + + +@pulumi.output_type +class GetClustersClusterResult(dict): + def __init__(__self__, *, + backup_store_ids: Sequence[str], + capacity: int, + cloud_account_id: str, + created_at: str, + firewall_rules: Sequence['outputs.GetClustersClusterFirewallRuleResult'], + id: str, + name: str, + networks: Sequence['outputs.GetClustersClusterNetworkResult'], + node_location: str, + nodes: Sequence['outputs.GetClustersClusterNodeResult'], + regions: Sequence[str], + resource_tags: Mapping[str, str], + ssh_key_id: str, + status: str): + """ + :param Sequence[str] backup_store_ids: Backup store IDs of the cluster + :param int capacity: Capacity of the cluster + :param str cloud_account_id: Cloud account ID of the cluster + :param str created_at: Created at of the cluster + :param str id: ID of the cluster + :param str name: Name of the cluster + :param str node_location: Node location of the cluster. Must be either 'public' or 'private'. + :param Mapping[str, str] resource_tags: Resource tags of the cluster + :param str ssh_key_id: SSH key ID of the cluster + :param str status: Status of the cluster + """ + pulumi.set(__self__, "backup_store_ids", backup_store_ids) + pulumi.set(__self__, "capacity", capacity) + pulumi.set(__self__, "cloud_account_id", cloud_account_id) + pulumi.set(__self__, "created_at", created_at) + pulumi.set(__self__, "firewall_rules", firewall_rules) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "networks", networks) + pulumi.set(__self__, "node_location", node_location) + pulumi.set(__self__, "nodes", nodes) + pulumi.set(__self__, "regions", regions) + pulumi.set(__self__, "resource_tags", resource_tags) + pulumi.set(__self__, "ssh_key_id", ssh_key_id) + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter(name="backupStoreIds") + def backup_store_ids(self) -> Sequence[str]: + """ + Backup store IDs of the cluster + """ + return pulumi.get(self, "backup_store_ids") + + @property + @pulumi.getter + def capacity(self) -> int: + """ + Capacity of the cluster + """ + return pulumi.get(self, "capacity") + + @property + @pulumi.getter(name="cloudAccountId") + def cloud_account_id(self) -> str: + """ + Cloud account ID of the cluster + """ + return pulumi.get(self, "cloud_account_id") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> str: + """ + Created at of the cluster + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter(name="firewallRules") + def firewall_rules(self) -> Sequence['outputs.GetClustersClusterFirewallRuleResult']: + return pulumi.get(self, "firewall_rules") + + @property + @pulumi.getter + def id(self) -> str: + """ + ID of the cluster + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the cluster + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def networks(self) -> Sequence['outputs.GetClustersClusterNetworkResult']: + return pulumi.get(self, "networks") + + @property + @pulumi.getter(name="nodeLocation") + def node_location(self) -> str: + """ + Node location of the cluster. Must be either 'public' or 'private'. + """ + return pulumi.get(self, "node_location") + + @property + @pulumi.getter + def nodes(self) -> Sequence['outputs.GetClustersClusterNodeResult']: + return pulumi.get(self, "nodes") + + @property + @pulumi.getter + def regions(self) -> Sequence[str]: + return pulumi.get(self, "regions") + + @property + @pulumi.getter(name="resourceTags") + def resource_tags(self) -> Mapping[str, str]: + """ + Resource tags of the cluster + """ + return pulumi.get(self, "resource_tags") + + @property + @pulumi.getter(name="sshKeyId") + def ssh_key_id(self) -> str: + """ + SSH key ID of the cluster + """ + return pulumi.get(self, "ssh_key_id") + + @property + @pulumi.getter + def status(self) -> str: + """ + Status of the cluster + """ + return pulumi.get(self, "status") + + +@pulumi.output_type +class GetClustersClusterFirewallRuleResult(dict): + def __init__(__self__, *, + name: str, + port: int, + sources: Sequence[str]): + """ + :param str name: Name of the firewall rule + :param int port: Port for the firewall rule + :param Sequence[str] sources: Sources for the firewall rule + """ + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "port", port) + pulumi.set(__self__, "sources", sources) + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the firewall rule + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def port(self) -> int: + """ + Port for the firewall rule + """ + return pulumi.get(self, "port") + + @property + @pulumi.getter + def sources(self) -> Sequence[str]: + """ + Sources for the firewall rule + """ + return pulumi.get(self, "sources") + + +@pulumi.output_type +class GetClustersClusterNetworkResult(dict): + def __init__(__self__, *, + cidr: str, + external: bool, + external_id: str, + name: str, + private_subnets: Sequence[str], + public_subnets: Sequence[str], + region: str): + """ + :param str cidr: CIDR of the network + :param bool external: Is the network external + :param str external_id: External ID of the network + :param str name: Name of the firewall rule + :param str region: Region of the network + """ + pulumi.set(__self__, "cidr", cidr) + pulumi.set(__self__, "external", external) + pulumi.set(__self__, "external_id", external_id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "private_subnets", private_subnets) + pulumi.set(__self__, "public_subnets", public_subnets) + pulumi.set(__self__, "region", region) + + @property + @pulumi.getter + def cidr(self) -> str: + """ + CIDR of the network + """ + return pulumi.get(self, "cidr") + + @property + @pulumi.getter + def external(self) -> bool: + """ + Is the network external + """ + return pulumi.get(self, "external") + + @property + @pulumi.getter(name="externalId") + def external_id(self) -> str: + """ + External ID of the network + """ + return pulumi.get(self, "external_id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the firewall rule + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="privateSubnets") + def private_subnets(self) -> Sequence[str]: + return pulumi.get(self, "private_subnets") + + @property + @pulumi.getter(name="publicSubnets") + def public_subnets(self) -> Sequence[str]: + return pulumi.get(self, "public_subnets") + + @property + @pulumi.getter + def region(self) -> str: + """ + Region of the network + """ + return pulumi.get(self, "region") + + +@pulumi.output_type +class GetClustersClusterNodeResult(dict): + def __init__(__self__, *, + availability_zone: str, + instance_type: str, + name: str, + options: Sequence[str], + region: str, + volume_iops: int, + volume_size: int, + volume_type: str): + """ + :param str availability_zone: Cloud provider availability zone name + :param str instance_type: Instance type used for the node + :param str name: Name of the firewall rule + :param str region: Region of the network + :param int volume_iops: Volume IOPS of the node data volume + :param int volume_size: Volume size of the node data volume + :param str volume_type: Volume type of the node data volume + """ + pulumi.set(__self__, "availability_zone", availability_zone) + pulumi.set(__self__, "instance_type", instance_type) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "options", options) + pulumi.set(__self__, "region", region) + pulumi.set(__self__, "volume_iops", volume_iops) + pulumi.set(__self__, "volume_size", volume_size) + pulumi.set(__self__, "volume_type", volume_type) + + @property + @pulumi.getter(name="availabilityZone") + def availability_zone(self) -> str: + """ + Cloud provider availability zone name + """ + return pulumi.get(self, "availability_zone") + + @property + @pulumi.getter(name="instanceType") + def instance_type(self) -> str: + """ + Instance type used for the node + """ + return pulumi.get(self, "instance_type") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the firewall rule + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def options(self) -> Sequence[str]: + return pulumi.get(self, "options") + + @property + @pulumi.getter + def region(self) -> str: + """ + Region of the network + """ + return pulumi.get(self, "region") + + @property + @pulumi.getter(name="volumeIops") + def volume_iops(self) -> int: + """ + Volume IOPS of the node data volume + """ + return pulumi.get(self, "volume_iops") + + @property + @pulumi.getter(name="volumeSize") + def volume_size(self) -> int: + """ + Volume size of the node data volume + """ + return pulumi.get(self, "volume_size") + + @property + @pulumi.getter(name="volumeType") + def volume_type(self) -> str: + """ + Volume type of the node data volume + """ + return pulumi.get(self, "volume_type") + + +@pulumi.output_type +class GetDatabasesDatabaseResult(dict): + def __init__(__self__, *, + backups: 'outputs.GetDatabasesDatabaseBackupsResult', + cluster_id: str, + components: Sequence['outputs.GetDatabasesDatabaseComponentResult'], + config_version: str, + created_at: str, + domain: str, + extensions: 'outputs.GetDatabasesDatabaseExtensionsResult', + id: str, + name: str, + nodes: Mapping[str, 'outputs.GetDatabasesDatabaseNodesResult'], + options: Sequence[str], + pg_version: str, + roles: Sequence['outputs.GetDatabasesDatabaseRoleResult'], + status: str): + """ + :param 'GetDatabasesDatabaseBackupsArgs' backups: Backup configuration for the database + :param str cluster_id: ID of the cluster this database belongs to + :param Sequence['GetDatabasesDatabaseComponentArgs'] components: Components of the database + :param str config_version: Configuration version of the database + :param str created_at: Creation timestamp of the database + :param str domain: Domain of the database + :param 'GetDatabasesDatabaseExtensionsArgs' extensions: Extensions configuration for the database + :param str id: ID of the database + :param str name: Name of the database + :param Mapping[str, 'GetDatabasesDatabaseNodesArgs'] nodes: Map of nodes in the database + :param Sequence[str] options: Options for the database + :param str pg_version: PostgreSQL version of the database + :param Sequence['GetDatabasesDatabaseRoleArgs'] roles: Roles in the database + :param str status: Status of the database + """ + pulumi.set(__self__, "backups", backups) + pulumi.set(__self__, "cluster_id", cluster_id) + pulumi.set(__self__, "components", components) + pulumi.set(__self__, "config_version", config_version) + pulumi.set(__self__, "created_at", created_at) + pulumi.set(__self__, "domain", domain) + pulumi.set(__self__, "extensions", extensions) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "nodes", nodes) + pulumi.set(__self__, "options", options) + pulumi.set(__self__, "pg_version", pg_version) + pulumi.set(__self__, "roles", roles) + pulumi.set(__self__, "status", status) + + @property + @pulumi.getter + def backups(self) -> 'outputs.GetDatabasesDatabaseBackupsResult': + """ + Backup configuration for the database + """ + return pulumi.get(self, "backups") + + @property + @pulumi.getter(name="clusterId") + def cluster_id(self) -> str: + """ + ID of the cluster this database belongs to + """ + return pulumi.get(self, "cluster_id") + + @property + @pulumi.getter + def components(self) -> Sequence['outputs.GetDatabasesDatabaseComponentResult']: + """ + Components of the database + """ + return pulumi.get(self, "components") + + @property + @pulumi.getter(name="configVersion") + def config_version(self) -> str: + """ + Configuration version of the database + """ + return pulumi.get(self, "config_version") + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> str: + """ + Creation timestamp of the database + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def domain(self) -> str: + """ + Domain of the database + """ + return pulumi.get(self, "domain") + + @property + @pulumi.getter + def extensions(self) -> 'outputs.GetDatabasesDatabaseExtensionsResult': + """ + Extensions configuration for the database + """ + return pulumi.get(self, "extensions") + + @property + @pulumi.getter + def id(self) -> str: + """ + ID of the database + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the database + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def nodes(self) -> Mapping[str, 'outputs.GetDatabasesDatabaseNodesResult']: + """ + Map of nodes in the database + """ + return pulumi.get(self, "nodes") + + @property + @pulumi.getter + def options(self) -> Sequence[str]: + """ + Options for the database + """ + return pulumi.get(self, "options") + + @property + @pulumi.getter(name="pgVersion") + def pg_version(self) -> str: + """ + PostgreSQL version of the database + """ + return pulumi.get(self, "pg_version") + + @property + @pulumi.getter + def roles(self) -> Sequence['outputs.GetDatabasesDatabaseRoleResult']: + """ + Roles in the database + """ + return pulumi.get(self, "roles") + + @property + @pulumi.getter + def status(self) -> str: + """ + Status of the database + """ + return pulumi.get(self, "status") + + +@pulumi.output_type +class GetDatabasesDatabaseBackupsResult(dict): + def __init__(__self__, *, + configs: Sequence['outputs.GetDatabasesDatabaseBackupsConfigResult'], + provider: str): + """ + :param Sequence['GetDatabasesDatabaseBackupsConfigArgs'] configs: Backup configurations + :param str provider: Backup provider + """ + pulumi.set(__self__, "configs", configs) + pulumi.set(__self__, "provider", provider) + + @property + @pulumi.getter + def configs(self) -> Sequence['outputs.GetDatabasesDatabaseBackupsConfigResult']: + """ + Backup configurations + """ + return pulumi.get(self, "configs") + + @property + @pulumi.getter + def provider(self) -> str: + """ + Backup provider + """ + return pulumi.get(self, "provider") + + +@pulumi.output_type +class GetDatabasesDatabaseBackupsConfigResult(dict): + def __init__(__self__, *, + id: str, + node_name: str, + repositories: Sequence['outputs.GetDatabasesDatabaseBackupsConfigRepositoryResult'], + schedules: Sequence['outputs.GetDatabasesDatabaseBackupsConfigScheduleResult']): + """ + :param str id: Backup configuration ID + :param str node_name: Node name + :param Sequence['GetDatabasesDatabaseBackupsConfigRepositoryArgs'] repositories: Backup repositories + :param Sequence['GetDatabasesDatabaseBackupsConfigScheduleArgs'] schedules: Backup schedules + """ + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "node_name", node_name) + pulumi.set(__self__, "repositories", repositories) + pulumi.set(__self__, "schedules", schedules) + + @property + @pulumi.getter + def id(self) -> str: + """ + Backup configuration ID + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter(name="nodeName") + def node_name(self) -> str: + """ + Node name + """ + return pulumi.get(self, "node_name") + + @property + @pulumi.getter + def repositories(self) -> Sequence['outputs.GetDatabasesDatabaseBackupsConfigRepositoryResult']: + """ + Backup repositories + """ + return pulumi.get(self, "repositories") + + @property + @pulumi.getter + def schedules(self) -> Sequence['outputs.GetDatabasesDatabaseBackupsConfigScheduleResult']: + """ + Backup schedules + """ + return pulumi.get(self, "schedules") + + +@pulumi.output_type +class GetDatabasesDatabaseBackupsConfigRepositoryResult(dict): + def __init__(__self__, *, + azure_account: str, + azure_container: str, + azure_endpoint: str, + backup_store_id: str, + base_path: str, + gcs_bucket: str, + gcs_endpoint: str, + id: str, + retention_full: int, + retention_full_type: str, + s3_bucket: str, + s3_endpoint: str, + s3_region: str, + type: str): + """ + :param str id: Backup configuration ID + """ + pulumi.set(__self__, "azure_account", azure_account) + pulumi.set(__self__, "azure_container", azure_container) + pulumi.set(__self__, "azure_endpoint", azure_endpoint) + pulumi.set(__self__, "backup_store_id", backup_store_id) + pulumi.set(__self__, "base_path", base_path) + pulumi.set(__self__, "gcs_bucket", gcs_bucket) + pulumi.set(__self__, "gcs_endpoint", gcs_endpoint) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "retention_full", retention_full) + pulumi.set(__self__, "retention_full_type", retention_full_type) + pulumi.set(__self__, "s3_bucket", s3_bucket) + pulumi.set(__self__, "s3_endpoint", s3_endpoint) + pulumi.set(__self__, "s3_region", s3_region) + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="azureAccount") + def azure_account(self) -> str: + return pulumi.get(self, "azure_account") + + @property + @pulumi.getter(name="azureContainer") + def azure_container(self) -> str: + return pulumi.get(self, "azure_container") + + @property + @pulumi.getter(name="azureEndpoint") + def azure_endpoint(self) -> str: + return pulumi.get(self, "azure_endpoint") + + @property + @pulumi.getter(name="backupStoreId") + def backup_store_id(self) -> str: + return pulumi.get(self, "backup_store_id") + + @property + @pulumi.getter(name="basePath") + def base_path(self) -> str: + return pulumi.get(self, "base_path") + + @property + @pulumi.getter(name="gcsBucket") + def gcs_bucket(self) -> str: + return pulumi.get(self, "gcs_bucket") + + @property + @pulumi.getter(name="gcsEndpoint") + def gcs_endpoint(self) -> str: + return pulumi.get(self, "gcs_endpoint") + + @property + @pulumi.getter + def id(self) -> str: + """ + Backup configuration ID + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter(name="retentionFull") + def retention_full(self) -> int: + return pulumi.get(self, "retention_full") + + @property + @pulumi.getter(name="retentionFullType") + def retention_full_type(self) -> str: + return pulumi.get(self, "retention_full_type") + + @property + @pulumi.getter(name="s3Bucket") + def s3_bucket(self) -> str: + return pulumi.get(self, "s3_bucket") + + @property + @pulumi.getter(name="s3Endpoint") + def s3_endpoint(self) -> str: + return pulumi.get(self, "s3_endpoint") + + @property + @pulumi.getter(name="s3Region") + def s3_region(self) -> str: + return pulumi.get(self, "s3_region") + + @property + @pulumi.getter + def type(self) -> str: + return pulumi.get(self, "type") + + +@pulumi.output_type +class GetDatabasesDatabaseBackupsConfigScheduleResult(dict): + def __init__(__self__, *, + cron_expression: str, + id: str, + type: str): + """ + :param str id: Backup configuration ID + """ + pulumi.set(__self__, "cron_expression", cron_expression) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "type", type) + + @property + @pulumi.getter(name="cronExpression") + def cron_expression(self) -> str: + return pulumi.get(self, "cron_expression") + + @property + @pulumi.getter + def id(self) -> str: + """ + Backup configuration ID + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def type(self) -> str: + return pulumi.get(self, "type") + + +@pulumi.output_type +class GetDatabasesDatabaseComponentResult(dict): + def __init__(__self__, *, + id: str, + name: str, + release_date: str, + status: str, + version: str): + """ + :param str id: Backup configuration ID + :param str name: Component name + :param str release_date: Component release date + :param str status: Component status + :param str version: Component version + """ + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "release_date", release_date) + pulumi.set(__self__, "status", status) + pulumi.set(__self__, "version", version) + + @property + @pulumi.getter + def id(self) -> str: + """ + Backup configuration ID + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Component name + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="releaseDate") + def release_date(self) -> str: + """ + Component release date + """ + return pulumi.get(self, "release_date") + + @property + @pulumi.getter + def status(self) -> str: + """ + Component status + """ + return pulumi.get(self, "status") + + @property + @pulumi.getter + def version(self) -> str: + """ + Component version + """ + return pulumi.get(self, "version") + + +@pulumi.output_type +class GetDatabasesDatabaseExtensionsResult(dict): + def __init__(__self__, *, + auto_manage: bool, + availables: Sequence[str], + requesteds: Sequence[str]): + """ + :param bool auto_manage: Auto-manage extensions + :param Sequence[str] availables: Available extensions + :param Sequence[str] requesteds: Requested extensions + """ + pulumi.set(__self__, "auto_manage", auto_manage) + pulumi.set(__self__, "availables", availables) + pulumi.set(__self__, "requesteds", requesteds) + + @property + @pulumi.getter(name="autoManage") + def auto_manage(self) -> bool: + """ + Auto-manage extensions + """ + return pulumi.get(self, "auto_manage") + + @property + @pulumi.getter + def availables(self) -> Sequence[str]: + """ + Available extensions + """ + return pulumi.get(self, "availables") + + @property + @pulumi.getter + def requesteds(self) -> Sequence[str]: + """ + Requested extensions + """ + return pulumi.get(self, "requesteds") + + +@pulumi.output_type +class GetDatabasesDatabaseNodesResult(dict): + def __init__(__self__, *, + connection: 'outputs.GetDatabasesDatabaseNodesConnectionResult', + extensions: 'outputs.GetDatabasesDatabaseNodesExtensionsResult', + location: 'outputs.GetDatabasesDatabaseNodesLocationResult', + name: str, + region: 'outputs.GetDatabasesDatabaseNodesRegionResult'): + """ + :param 'GetDatabasesDatabaseNodesConnectionArgs' connection: Node connection details + :param 'GetDatabasesDatabaseNodesExtensionsArgs' extensions: Extensions configuration for the database + :param 'GetDatabasesDatabaseNodesLocationArgs' location: Node location + :param str name: Component name + :param 'GetDatabasesDatabaseNodesRegionArgs' region: Node region + """ + pulumi.set(__self__, "connection", connection) + pulumi.set(__self__, "extensions", extensions) + pulumi.set(__self__, "location", location) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "region", region) + + @property + @pulumi.getter + def connection(self) -> 'outputs.GetDatabasesDatabaseNodesConnectionResult': + """ + Node connection details + """ + return pulumi.get(self, "connection") + + @property + @pulumi.getter + def extensions(self) -> 'outputs.GetDatabasesDatabaseNodesExtensionsResult': + """ + Extensions configuration for the database + """ + return pulumi.get(self, "extensions") + + @property + @pulumi.getter + def location(self) -> 'outputs.GetDatabasesDatabaseNodesLocationResult': + """ + Node location + """ + return pulumi.get(self, "location") + + @property + @pulumi.getter + def name(self) -> str: + """ + Component name + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def region(self) -> 'outputs.GetDatabasesDatabaseNodesRegionResult': + """ + Node region + """ + return pulumi.get(self, "region") + + +@pulumi.output_type +class GetDatabasesDatabaseNodesConnectionResult(dict): + def __init__(__self__, *, + database: str, + external_ip_address: str, + host: str, + internal_host: str, + internal_ip_address: str, + password: str, + port: int, + username: str): + pulumi.set(__self__, "database", database) + pulumi.set(__self__, "external_ip_address", external_ip_address) + pulumi.set(__self__, "host", host) + pulumi.set(__self__, "internal_host", internal_host) + pulumi.set(__self__, "internal_ip_address", internal_ip_address) + pulumi.set(__self__, "password", password) + pulumi.set(__self__, "port", port) + pulumi.set(__self__, "username", username) + + @property + @pulumi.getter + def database(self) -> str: + return pulumi.get(self, "database") + + @property + @pulumi.getter(name="externalIpAddress") + def external_ip_address(self) -> str: + return pulumi.get(self, "external_ip_address") + + @property + @pulumi.getter + def host(self) -> str: + return pulumi.get(self, "host") + + @property + @pulumi.getter(name="internalHost") + def internal_host(self) -> str: + return pulumi.get(self, "internal_host") + + @property + @pulumi.getter(name="internalIpAddress") + def internal_ip_address(self) -> str: + return pulumi.get(self, "internal_ip_address") + + @property + @pulumi.getter + def password(self) -> str: + return pulumi.get(self, "password") + + @property + @pulumi.getter + def port(self) -> int: + return pulumi.get(self, "port") + + @property + @pulumi.getter + def username(self) -> str: + return pulumi.get(self, "username") + + +@pulumi.output_type +class GetDatabasesDatabaseNodesExtensionsResult(dict): + def __init__(__self__, *, + errors: Mapping[str, str], + installeds: Sequence[str]): + pulumi.set(__self__, "errors", errors) + pulumi.set(__self__, "installeds", installeds) + + @property + @pulumi.getter + def errors(self) -> Mapping[str, str]: + return pulumi.get(self, "errors") + + @property + @pulumi.getter + def installeds(self) -> Sequence[str]: + return pulumi.get(self, "installeds") + + +@pulumi.output_type +class GetDatabasesDatabaseNodesLocationResult(dict): + def __init__(__self__, *, + city: str, + code: str, + country: str, + latitude: float, + longitude: float, + metro_code: str, + name: str, + postal_code: str, + region: str, + region_code: str, + timezone: str): + """ + :param str name: Component name + """ + pulumi.set(__self__, "city", city) + pulumi.set(__self__, "code", code) + pulumi.set(__self__, "country", country) + pulumi.set(__self__, "latitude", latitude) + pulumi.set(__self__, "longitude", longitude) + pulumi.set(__self__, "metro_code", metro_code) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "postal_code", postal_code) + pulumi.set(__self__, "region", region) + pulumi.set(__self__, "region_code", region_code) + pulumi.set(__self__, "timezone", timezone) + + @property + @pulumi.getter + def city(self) -> str: + return pulumi.get(self, "city") + + @property + @pulumi.getter + def code(self) -> str: + return pulumi.get(self, "code") + + @property + @pulumi.getter + def country(self) -> str: + return pulumi.get(self, "country") + + @property + @pulumi.getter + def latitude(self) -> float: + return pulumi.get(self, "latitude") + + @property + @pulumi.getter + def longitude(self) -> float: + return pulumi.get(self, "longitude") + + @property + @pulumi.getter(name="metroCode") + def metro_code(self) -> str: + return pulumi.get(self, "metro_code") + + @property + @pulumi.getter + def name(self) -> str: + """ + Component name + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="postalCode") + def postal_code(self) -> str: + return pulumi.get(self, "postal_code") + + @property + @pulumi.getter + def region(self) -> str: + return pulumi.get(self, "region") + + @property + @pulumi.getter(name="regionCode") + def region_code(self) -> str: + return pulumi.get(self, "region_code") + + @property + @pulumi.getter + def timezone(self) -> str: + return pulumi.get(self, "timezone") + + +@pulumi.output_type +class GetDatabasesDatabaseNodesRegionResult(dict): + def __init__(__self__, *, + active: bool, + availability_zones: Sequence[str], + cloud: str, + code: str, + name: str, + parent: str): + """ + :param str name: Component name + """ + pulumi.set(__self__, "active", active) + pulumi.set(__self__, "availability_zones", availability_zones) + pulumi.set(__self__, "cloud", cloud) + pulumi.set(__self__, "code", code) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "parent", parent) + + @property + @pulumi.getter + def active(self) -> bool: + return pulumi.get(self, "active") + + @property + @pulumi.getter(name="availabilityZones") + def availability_zones(self) -> Sequence[str]: + return pulumi.get(self, "availability_zones") + + @property + @pulumi.getter + def cloud(self) -> str: + return pulumi.get(self, "cloud") + + @property + @pulumi.getter + def code(self) -> str: + return pulumi.get(self, "code") + + @property + @pulumi.getter + def name(self) -> str: + """ + Component name + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def parent(self) -> str: + return pulumi.get(self, "parent") + + +@pulumi.output_type +class GetDatabasesDatabaseRoleResult(dict): + def __init__(__self__, *, + bypass_rls: bool, + connection_limit: int, + create_db: bool, + create_role: bool, + inherit: bool, + login: bool, + name: str, + replication: bool, + superuser: bool): + """ + :param str name: Component name + """ + pulumi.set(__self__, "bypass_rls", bypass_rls) + pulumi.set(__self__, "connection_limit", connection_limit) + pulumi.set(__self__, "create_db", create_db) + pulumi.set(__self__, "create_role", create_role) + pulumi.set(__self__, "inherit", inherit) + pulumi.set(__self__, "login", login) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "replication", replication) + pulumi.set(__self__, "superuser", superuser) + + @property + @pulumi.getter(name="bypassRls") + def bypass_rls(self) -> bool: + return pulumi.get(self, "bypass_rls") + + @property + @pulumi.getter(name="connectionLimit") + def connection_limit(self) -> int: + return pulumi.get(self, "connection_limit") + + @property + @pulumi.getter(name="createDb") + def create_db(self) -> bool: + return pulumi.get(self, "create_db") + + @property + @pulumi.getter(name="createRole") + def create_role(self) -> bool: + return pulumi.get(self, "create_role") + + @property + @pulumi.getter + def inherit(self) -> bool: + return pulumi.get(self, "inherit") + + @property + @pulumi.getter + def login(self) -> bool: + return pulumi.get(self, "login") + + @property + @pulumi.getter + def name(self) -> str: + """ + Component name + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter + def replication(self) -> bool: + return pulumi.get(self, "replication") + + @property + @pulumi.getter + def superuser(self) -> bool: + return pulumi.get(self, "superuser") + + +@pulumi.output_type +class GetSSHKeysSshKeyResult(dict): + def __init__(__self__, *, + created_at: str, + id: str, + name: str, + public_key: str): + """ + :param str created_at: Creation time of the SSH key + :param str id: ID of the SSH key + :param str name: Name of the SSH key + :param str public_key: Public key + """ + pulumi.set(__self__, "created_at", created_at) + pulumi.set(__self__, "id", id) + pulumi.set(__self__, "name", name) + pulumi.set(__self__, "public_key", public_key) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> str: + """ + Creation time of the SSH key + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def id(self) -> str: + """ + ID of the SSH key + """ + return pulumi.get(self, "id") + + @property + @pulumi.getter + def name(self) -> str: + """ + Name of the SSH key + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="publicKey") + def public_key(self) -> str: + """ + Public key + """ + return pulumi.get(self, "public_key") + + diff --git a/sdk/python/pgEdge_pulumi_pgedge/provider.py b/sdk/python/pgEdge_pulumi_pgedge/provider.py new file mode 100644 index 0000000..ca3b9d0 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/provider.py @@ -0,0 +1,110 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities + +__all__ = ['ProviderArgs', 'Provider'] + +@pulumi.input_type +class ProviderArgs: + def __init__(__self__, *, + base_url: Optional[pulumi.Input[str]] = None): + """ + The set of arguments for constructing a Provider resource. + :param pulumi.Input[str] base_url: Base Url to use when connecting to the PgEdge service. + """ + if base_url is None: + base_url = _utilities.get_env('PGEDGE_BASE_URL') + if base_url is not None: + pulumi.set(__self__, "base_url", base_url) + + @property + @pulumi.getter(name="baseUrl") + def base_url(self) -> Optional[pulumi.Input[str]]: + """ + Base Url to use when connecting to the PgEdge service. + """ + return pulumi.get(self, "base_url") + + @base_url.setter + def base_url(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "base_url", value) + + +class Provider(pulumi.ProviderResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + base_url: Optional[pulumi.Input[str]] = None, + __props__=None): + """ + The provider type for the pgedge package. By default, resources use package-wide configuration + settings, however an explicit `Provider` instance may be created and passed during resource + construction to achieve fine-grained programmatic control over provider settings. See the + [documentation](https://www.pulumi.com/docs/reference/programming-model/#providers) for more information. + + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[str] base_url: Base Url to use when connecting to the PgEdge service. + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: Optional[ProviderArgs] = None, + opts: Optional[pulumi.ResourceOptions] = None): + """ + The provider type for the pgedge package. By default, resources use package-wide configuration + settings, however an explicit `Provider` instance may be created and passed during resource + construction to achieve fine-grained programmatic control over provider settings. See the + [documentation](https://www.pulumi.com/docs/reference/programming-model/#providers) for more information. + + :param str resource_name: The name of the resource. + :param ProviderArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(ProviderArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + base_url: Optional[pulumi.Input[str]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = ProviderArgs.__new__(ProviderArgs) + + if base_url is None: + base_url = _utilities.get_env('PGEDGE_BASE_URL') + __props__.__dict__["base_url"] = base_url + super(Provider, __self__).__init__( + 'pgedge', + resource_name, + __props__, + opts) + + @property + @pulumi.getter(name="baseUrl") + def base_url(self) -> pulumi.Output[Optional[str]]: + """ + Base Url to use when connecting to the PgEdge service. + """ + return pulumi.get(self, "base_url") + diff --git a/sdk/python/pgEdge_pulumi_pgedge/pulumi-plugin.json b/sdk/python/pgEdge_pulumi_pgedge/pulumi-plugin.json new file mode 100644 index 0000000..bc61944 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/pulumi-plugin.json @@ -0,0 +1,5 @@ +{ + "resource": true, + "name": "pgedge", + "server": "github://api.github.com/pgEdge/pulumi-pgedge" +} diff --git a/sdk/python/pgEdge_pulumi_pgedge/py.typed b/sdk/python/pgEdge_pulumi_pgedge/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/sdk/python/pgEdge_pulumi_pgedge/ssh_key.py b/sdk/python/pgEdge_pulumi_pgedge/ssh_key.py new file mode 100644 index 0000000..77afee8 --- /dev/null +++ b/sdk/python/pgEdge_pulumi_pgedge/ssh_key.py @@ -0,0 +1,221 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import copy +import warnings +import pulumi +import pulumi.runtime +from typing import Any, Mapping, Optional, Sequence, Union, overload +from . import _utilities + +__all__ = ['SSHKeyArgs', 'SSHKey'] + +@pulumi.input_type +class SSHKeyArgs: + def __init__(__self__, *, + public_key: pulumi.Input[str], + name: Optional[pulumi.Input[str]] = None): + """ + The set of arguments for constructing a SSHKey resource. + :param pulumi.Input[str] public_key: The public key. + :param pulumi.Input[str] name: The name of the SSH key. + """ + pulumi.set(__self__, "public_key", public_key) + if name is not None: + pulumi.set(__self__, "name", name) + + @property + @pulumi.getter(name="publicKey") + def public_key(self) -> pulumi.Input[str]: + """ + The public key. + """ + return pulumi.get(self, "public_key") + + @public_key.setter + def public_key(self, value: pulumi.Input[str]): + pulumi.set(self, "public_key", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + """ + The name of the SSH key. + """ + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + +@pulumi.input_type +class _SSHKeyState: + def __init__(__self__, *, + created_at: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + public_key: Optional[pulumi.Input[str]] = None): + """ + Input properties used for looking up and filtering SSHKey resources. + :param pulumi.Input[str] created_at: The timestamp when the SSH key was created. + :param pulumi.Input[str] name: The name of the SSH key. + :param pulumi.Input[str] public_key: The public key. + """ + if created_at is not None: + pulumi.set(__self__, "created_at", created_at) + if name is not None: + pulumi.set(__self__, "name", name) + if public_key is not None: + pulumi.set(__self__, "public_key", public_key) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> Optional[pulumi.Input[str]]: + """ + The timestamp when the SSH key was created. + """ + return pulumi.get(self, "created_at") + + @created_at.setter + def created_at(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "created_at", value) + + @property + @pulumi.getter + def name(self) -> Optional[pulumi.Input[str]]: + """ + The name of the SSH key. + """ + return pulumi.get(self, "name") + + @name.setter + def name(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "name", value) + + @property + @pulumi.getter(name="publicKey") + def public_key(self) -> Optional[pulumi.Input[str]]: + """ + The public key. + """ + return pulumi.get(self, "public_key") + + @public_key.setter + def public_key(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "public_key", value) + + +class SSHKey(pulumi.CustomResource): + @overload + def __init__(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + name: Optional[pulumi.Input[str]] = None, + public_key: Optional[pulumi.Input[str]] = None, + __props__=None): + """ + Manages a pgEdge SSH key. + + :param str resource_name: The name of the resource. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[str] name: The name of the SSH key. + :param pulumi.Input[str] public_key: The public key. + """ + ... + @overload + def __init__(__self__, + resource_name: str, + args: SSHKeyArgs, + opts: Optional[pulumi.ResourceOptions] = None): + """ + Manages a pgEdge SSH key. + + :param str resource_name: The name of the resource. + :param SSHKeyArgs args: The arguments to use to populate this resource's properties. + :param pulumi.ResourceOptions opts: Options for the resource. + """ + ... + def __init__(__self__, resource_name: str, *args, **kwargs): + resource_args, opts = _utilities.get_resource_args_opts(SSHKeyArgs, pulumi.ResourceOptions, *args, **kwargs) + if resource_args is not None: + __self__._internal_init(resource_name, opts, **resource_args.__dict__) + else: + __self__._internal_init(resource_name, *args, **kwargs) + + def _internal_init(__self__, + resource_name: str, + opts: Optional[pulumi.ResourceOptions] = None, + name: Optional[pulumi.Input[str]] = None, + public_key: Optional[pulumi.Input[str]] = None, + __props__=None): + opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) + if not isinstance(opts, pulumi.ResourceOptions): + raise TypeError('Expected resource options to be a ResourceOptions instance') + if opts.id is None: + if __props__ is not None: + raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') + __props__ = SSHKeyArgs.__new__(SSHKeyArgs) + + __props__.__dict__["name"] = name + if public_key is None and not opts.urn: + raise TypeError("Missing required property 'public_key'") + __props__.__dict__["public_key"] = public_key + __props__.__dict__["created_at"] = None + super(SSHKey, __self__).__init__( + 'pgedge:index/sSHKey:SSHKey', + resource_name, + __props__, + opts) + + @staticmethod + def get(resource_name: str, + id: pulumi.Input[str], + opts: Optional[pulumi.ResourceOptions] = None, + created_at: Optional[pulumi.Input[str]] = None, + name: Optional[pulumi.Input[str]] = None, + public_key: Optional[pulumi.Input[str]] = None) -> 'SSHKey': + """ + Get an existing SSHKey resource's state with the given name, id, and optional extra + properties used to qualify the lookup. + + :param str resource_name: The unique name of the resulting resource. + :param pulumi.Input[str] id: The unique provider ID of the resource to lookup. + :param pulumi.ResourceOptions opts: Options for the resource. + :param pulumi.Input[str] created_at: The timestamp when the SSH key was created. + :param pulumi.Input[str] name: The name of the SSH key. + :param pulumi.Input[str] public_key: The public key. + """ + opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id)) + + __props__ = _SSHKeyState.__new__(_SSHKeyState) + + __props__.__dict__["created_at"] = created_at + __props__.__dict__["name"] = name + __props__.__dict__["public_key"] = public_key + return SSHKey(resource_name, opts=opts, __props__=__props__) + + @property + @pulumi.getter(name="createdAt") + def created_at(self) -> pulumi.Output[str]: + """ + The timestamp when the SSH key was created. + """ + return pulumi.get(self, "created_at") + + @property + @pulumi.getter + def name(self) -> pulumi.Output[str]: + """ + The name of the SSH key. + """ + return pulumi.get(self, "name") + + @property + @pulumi.getter(name="publicKey") + def public_key(self) -> pulumi.Output[str]: + """ + The public key. + """ + return pulumi.get(self, "public_key") + diff --git a/sdk/python/setup.py b/sdk/python/setup.py new file mode 100644 index 0000000..fe47f8f --- /dev/null +++ b/sdk/python/setup.py @@ -0,0 +1,46 @@ +# coding=utf-8 +# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. *** +# *** Do not edit by hand unless you're certain you know what you are doing! *** + +import errno +import os +from setuptools import setup, find_packages +from setuptools.command.install import install +from subprocess import check_call + + +VERSION = os.getenv("PULUMI_PYTHON_VERSION", "0.0.0") +def readme(): + try: + with open('README.md', encoding='utf-8') as f: + return f.read() + except FileNotFoundError: + return "pgedge Pulumi Package - Development Version" + + +setup(name='pgEdge_pulumi_pgedge', + python_requires='>=3.7', + version=VERSION, + description="A Pulumi package for creating and managing pgedge cloud resources.", + long_description=readme(), + long_description_content_type='text/markdown', + keywords='pulumi pgedge category/cloud category/database', + url='https://www.pgedge.com', + project_urls={ + 'Repository': 'https://github.com/pgEdge/pulumi-pgedge' + }, + license='Apache-2.0', + packages=find_packages(), + package_data={ + 'pgEdge_pulumi_pgedge': [ + 'py.typed', + 'pulumi-plugin.json', + ] + }, + install_requires=[ + 'importlib-metadata>=6.0.0,<7.0.0; python_version < "3.8"', + 'parver>=0.2.1', + 'pulumi>=3.0.0,<4.0.0', + 'semver>=2.8.1' + ], + zip_safe=False)