Merge remote-tracking branch 'origin/alpha'
# Conflicts: # .github/workflows/publish.yaml # generator/cmd/build/build.go # generator/cmd/rootCmd.go # generator/main.go # stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go
This commit is contained in:
commit
a310d1454a
20 changed files with 747 additions and 12 deletions
7
.github/workflows/publish.yaml
vendored
7
.github/workflows/publish.yaml
vendored
|
|
@ -119,6 +119,12 @@ jobs:
|
||||||
--gpgPubKeyFile=public_key.pem \
|
--gpgPubKeyFile=public_key.pem \
|
||||||
--version=${VERSION}
|
--version=${VERSION}
|
||||||
|
|
||||||
|
- name: Prepare documentation nav file
|
||||||
|
run: |
|
||||||
|
go run generator/main.go \
|
||||||
|
docs \
|
||||||
|
--outFile nav.md
|
||||||
|
|
||||||
- name: Publish provider to S3
|
- name: Publish provider to S3
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
|
|
@ -138,3 +144,4 @@ jobs:
|
||||||
ssh -o StrictHostKeyChecking=no ubuntu@${{ vars.DOCS_SERVER_IP }} 'rm -rf /srv/www/docs'
|
ssh -o StrictHostKeyChecking=no ubuntu@${{ vars.DOCS_SERVER_IP }} 'rm -rf /srv/www/docs'
|
||||||
echo "${{ github.ref_name }}" >docs/_version.txt
|
echo "${{ github.ref_name }}" >docs/_version.txt
|
||||||
scp -o StrictHostKeyChecking=no -r docs ubuntu@${{ vars.DOCS_SERVER_IP }}:/srv/www/
|
scp -o StrictHostKeyChecking=no -r docs ubuntu@${{ vars.DOCS_SERVER_IP }}:/srv/www/
|
||||||
|
scp -o StrictHostKeyChecking=no nav.md ubuntu@${{ vars.DOCS_SERVER_IP }}:/srv/www/
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,11 @@ import (
|
||||||
"go/token"
|
"go/token"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path"
|
"path"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/generator/cmd/tools"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Builder struct {
|
type Builder struct {
|
||||||
|
|
@ -276,20 +277,14 @@ func handleLine(line string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Builder) determineRoot() error {
|
func (b *Builder) determineRoot() error {
|
||||||
cmd := exec.Command("git", "rev-parse", "--show-toplevel")
|
root, err := tools.GetGitRoot()
|
||||||
out, err := cmd.Output()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
lines := strings.Split(string(out), "\n")
|
b.rootDir = root
|
||||||
if lines[0] == "" {
|
|
||||||
return fmt.Errorf("unable to determine root directory from git")
|
|
||||||
}
|
|
||||||
b.rootDir = lines[0]
|
|
||||||
if b.Verbose {
|
if b.Verbose {
|
||||||
slog.Info(" ... using root", "dir", b.rootDir)
|
slog.Info(" ... using root", "dir", b.rootDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
247
generator/cmd/docCmd.go
Normal file
247
generator/cmd/docCmd.go
Normal file
|
|
@ -0,0 +1,247 @@
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"text/template"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/generator/cmd/tools"
|
||||||
|
)
|
||||||
|
|
||||||
|
var outFile string
|
||||||
|
|
||||||
|
var docsCmd = &cobra.Command{
|
||||||
|
Use: "docs",
|
||||||
|
Short: "handle documentation",
|
||||||
|
Long: `...`,
|
||||||
|
RunE: func(_ *cobra.Command, _ []string) error {
|
||||||
|
// filePathStr := "stackit/internal/services/postgresflexalpha/database/datasources_gen/database_data_source_gen.go"
|
||||||
|
//
|
||||||
|
// src, err := os.ReadFile(filePathStr)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// i := interp.New(
|
||||||
|
// interp.Options{
|
||||||
|
// GoPath: "/home/henselinm/.asdf/installs/golang/1.25.6/packages",
|
||||||
|
// BuildTags: nil,
|
||||||
|
// Stdin: nil,
|
||||||
|
// Stdout: nil,
|
||||||
|
// Stderr: nil,
|
||||||
|
// Args: nil,
|
||||||
|
// Env: nil,
|
||||||
|
// SourcecodeFilesystem: nil,
|
||||||
|
// Unrestricted: false,
|
||||||
|
// },
|
||||||
|
//)
|
||||||
|
// err = i.Use(i.Symbols("github.com/hashicorp/terraform-plugin-framework-validators"))
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
// err = i.Use(stdlib.Symbols)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
// _, err = i.Eval(string(src))
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// v, err := i.Eval("DatabaseDataSourceSchema")
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// bar := v.Interface().(func(string) string)
|
||||||
|
//
|
||||||
|
// r := bar("Kung")
|
||||||
|
// println(r)
|
||||||
|
//
|
||||||
|
// evalPath, err := i.EvalPath(filePathStr)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// fmt.Printf("%+v\n", evalPath)
|
||||||
|
|
||||||
|
// _, err = i.Eval(`import "fmt"`)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
// _, err = i.Eval(`func Hallo() { fmt.Println("Hi!") }`)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
|
||||||
|
// v = i.Symbols("Hallo")
|
||||||
|
|
||||||
|
// fmt.Println(v)
|
||||||
|
return workDocs()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type NavDocs struct {
|
||||||
|
PageTitle string
|
||||||
|
Description string
|
||||||
|
NavigationTitle string
|
||||||
|
ProviderTitle string
|
||||||
|
IndexFound bool
|
||||||
|
Services []Service
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
ServiceTitle string
|
||||||
|
DataSources []ResItem
|
||||||
|
Resources []ResItem
|
||||||
|
}
|
||||||
|
|
||||||
|
type ResItem struct {
|
||||||
|
ItemName string
|
||||||
|
ItemLink string
|
||||||
|
}
|
||||||
|
|
||||||
|
func workDocs() error {
|
||||||
|
slog.Info("creating docs navigation")
|
||||||
|
root, err := tools.GetGitRoot()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("ERROR", "err", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
nav := NavDocs{
|
||||||
|
PageTitle: "STACKIT terraform provider PRIVATE-PREVIEW",
|
||||||
|
Description: "",
|
||||||
|
NavigationTitle: "Navigation",
|
||||||
|
ProviderTitle: "Provider",
|
||||||
|
IndexFound: false,
|
||||||
|
}
|
||||||
|
startPath := path.Join(root, "docs")
|
||||||
|
|
||||||
|
docs, err := os.ReadDir(startPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
services := make(map[string]Service)
|
||||||
|
dataSources := make(map[string][]ResItem)
|
||||||
|
resources := make(map[string][]ResItem)
|
||||||
|
|
||||||
|
for _, entry := range docs {
|
||||||
|
if !entry.IsDir() {
|
||||||
|
if entry.Name() == "index.md" {
|
||||||
|
slog.Debug(" found provider index file")
|
||||||
|
nav.IndexFound = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
slog.Debug(" found am ignored file", "fileName", entry.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.Name() != "data-sources" && entry.Name() != "resources" {
|
||||||
|
slog.Error("unable to handle entry, skipping", "entry", entry.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
elements, err := os.ReadDir(path.Join(startPath, entry.Name()))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, res := range elements {
|
||||||
|
if res.IsDir() {
|
||||||
|
slog.Warn("found unexpected directory", "dir", res.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`([a-z]+)_([a-z]+).md`)
|
||||||
|
matches := re.FindAllStringSubmatch(res.Name(), -1)
|
||||||
|
if matches == nil {
|
||||||
|
slog.Error("unable to identify resource", "item", res.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
services[matches[0][1]] = Service{
|
||||||
|
ServiceTitle: matches[0][1],
|
||||||
|
}
|
||||||
|
switch entry.Name() {
|
||||||
|
case "data-sources":
|
||||||
|
dataSources[matches[0][1]] = append(dataSources[matches[0][1]], ResItem{
|
||||||
|
ItemName: matches[0][2],
|
||||||
|
ItemLink: fmt.Sprintf("docs/%s/%s", entry.Name(), matches[0][0]),
|
||||||
|
})
|
||||||
|
case "resources":
|
||||||
|
resources[matches[0][1]] = append(resources[matches[0][1]], ResItem{
|
||||||
|
ItemName: matches[0][2],
|
||||||
|
ItemLink: fmt.Sprintf("docs/%s/%s", entry.Name(), matches[0][0]),
|
||||||
|
})
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("this should never have happened")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
keys := make([]string, 0, len(services))
|
||||||
|
for k := range services {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
|
for _, name := range keys {
|
||||||
|
item := services[name]
|
||||||
|
item.DataSources = dataSources[name]
|
||||||
|
item.Resources = resources[name]
|
||||||
|
nav.Services = append(nav.Services, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn := template.FuncMap{
|
||||||
|
"ucfirst": ucfirst,
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl, err := template.
|
||||||
|
New("nav.md.gompl").
|
||||||
|
Funcs(fn).
|
||||||
|
ParseFiles(path.Join(root, "generator", "cmd", "docs", "templates", "nav.md.gompl"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var f *os.File
|
||||||
|
f, err = os.Create(outFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = tmpl.Execute(f, nav)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = f.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
slog.Info("finished")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDocsCmd() *cobra.Command {
|
||||||
|
return docsCmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func ucfirst(s string) string {
|
||||||
|
if s == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.ToUpper(s[:1]) + s[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { // nolint: gochecknoinits
|
||||||
|
docsCmd.Flags().StringVarP(&outFile, "outFile", "o", "nav.md", "nav.md")
|
||||||
|
}
|
||||||
27
generator/cmd/docs/templates/nav.md.gompl
vendored
Normal file
27
generator/cmd/docs/templates/nav.md.gompl
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
page_title: {{ .PageTitle }}
|
||||||
|
description: {{ .Description }}
|
||||||
|
---
|
||||||
|
## {{ .NavigationTitle }}
|
||||||
|
### {{ .ProviderTitle }}
|
||||||
|
{{ if .IndexFound }}
|
||||||
|
[Provider](/docs/docs/index.md)
|
||||||
|
{{ end }}
|
||||||
|
{{- range $index, $service := .Services }}
|
||||||
|
### {{ $service.ServiceTitle }}
|
||||||
|
<details>
|
||||||
|
|
||||||
|
#### data sources
|
||||||
|
|
||||||
|
{{- range $service.DataSources }}
|
||||||
|
- [{{ .ItemName }}]({{ .ItemLink }})
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
#### resources
|
||||||
|
|
||||||
|
{{- range $service.Resources }}
|
||||||
|
- [{{ .ItemName }}]({{ .ItemLink }})
|
||||||
|
{{- end }}
|
||||||
|
</details>
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
@ -6,7 +6,7 @@ import (
|
||||||
|
|
||||||
func NewRootCmd() *cobra.Command {
|
func NewRootCmd() *cobra.Command {
|
||||||
return &cobra.Command{
|
return &cobra.Command{
|
||||||
Use: "build-tools",
|
Use: "generator",
|
||||||
Short: "...",
|
Short: "...",
|
||||||
Long: "...",
|
Long: "...",
|
||||||
SilenceErrors: true, // Error is beautified in a custom way before being printed
|
SilenceErrors: true, // Error is beautified in a custom way before being printed
|
||||||
|
|
|
||||||
20
generator/cmd/tools/tools.go
Normal file
20
generator/cmd/tools/tools.go
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetGitRoot() (string, error) {
|
||||||
|
cmd := exec.Command("git", "rev-parse", "--show-toplevel")
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
lines := strings.Split(string(out), "\n")
|
||||||
|
if lines[0] == "" {
|
||||||
|
return "", fmt.Errorf("unable to determine root directory from git")
|
||||||
|
}
|
||||||
|
return lines[0], nil
|
||||||
|
}
|
||||||
|
|
@ -31,6 +31,7 @@ func main() {
|
||||||
cmd.NewPublishCmd(),
|
cmd.NewPublishCmd(),
|
||||||
cmd.NewGetFieldsCmd(),
|
cmd.NewGetFieldsCmd(),
|
||||||
cmd.NewExamplesCmd(),
|
cmd.NewExamplesCmd(),
|
||||||
|
cmd.NewDocsCmd(),
|
||||||
)
|
)
|
||||||
|
|
||||||
err := rootCmd.Execute()
|
err := rootCmd.Execute()
|
||||||
|
|
|
||||||
97
golang-ci.yaml.bak
Normal file
97
golang-ci.yaml.bak
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
|
||||||
|
version: "2"
|
||||||
|
run:
|
||||||
|
concurrency: 4
|
||||||
|
output:
|
||||||
|
formats:
|
||||||
|
text:
|
||||||
|
print-linter-name: true
|
||||||
|
print-issued-lines: true
|
||||||
|
colors: true
|
||||||
|
path: stdout
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- bodyclose
|
||||||
|
- depguard
|
||||||
|
- errorlint
|
||||||
|
- forcetypeassert
|
||||||
|
- gochecknoinits
|
||||||
|
- gocritic
|
||||||
|
- gosec
|
||||||
|
- misspell
|
||||||
|
- nakedret
|
||||||
|
- revive
|
||||||
|
- sqlclosecheck
|
||||||
|
- wastedassign
|
||||||
|
disable:
|
||||||
|
- noctx
|
||||||
|
- unparam
|
||||||
|
settings:
|
||||||
|
depguard:
|
||||||
|
rules:
|
||||||
|
main:
|
||||||
|
list-mode: lax
|
||||||
|
allow:
|
||||||
|
- tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview
|
||||||
|
- github.com/hashicorp/terraform-plugin-framework
|
||||||
|
- github.com/hashicorp/terraform-plugin-log
|
||||||
|
- github.com/stackitcloud/stackit-sdk-go
|
||||||
|
deny:
|
||||||
|
- pkg: github.com/stretchr/testify
|
||||||
|
desc: Do not use a testing framework
|
||||||
|
gocritic:
|
||||||
|
disabled-checks:
|
||||||
|
- wrapperFunc
|
||||||
|
- typeDefFirst
|
||||||
|
- ifElseChain
|
||||||
|
- dupImport
|
||||||
|
- hugeParam
|
||||||
|
enabled-tags:
|
||||||
|
- performance
|
||||||
|
- style
|
||||||
|
- experimental
|
||||||
|
gosec:
|
||||||
|
excludes:
|
||||||
|
- G104
|
||||||
|
- G102
|
||||||
|
- G304
|
||||||
|
- G307
|
||||||
|
misspell:
|
||||||
|
locale: US
|
||||||
|
nakedret:
|
||||||
|
max-func-lines: 0
|
||||||
|
revive:
|
||||||
|
severity: error
|
||||||
|
rules:
|
||||||
|
- name: errorf
|
||||||
|
- name: context-as-argument
|
||||||
|
- name: error-return
|
||||||
|
- name: increment-decrement
|
||||||
|
- name: indent-error-flow
|
||||||
|
- name: superfluous-else
|
||||||
|
- name: unused-parameter
|
||||||
|
- name: unreachable-code
|
||||||
|
- name: atomic
|
||||||
|
- name: empty-lines
|
||||||
|
- name: early-return
|
||||||
|
exclusions:
|
||||||
|
paths:
|
||||||
|
- stackit-sdk-generator/
|
||||||
|
- generated/
|
||||||
|
- pkg_gen/
|
||||||
|
generated: lax
|
||||||
|
warn-unused: true
|
||||||
|
# Excluding configuration per-path, per-linter, per-text and per-source.
|
||||||
|
rules:
|
||||||
|
# Exclude some linters from running on tests files.
|
||||||
|
- path: _test\.go
|
||||||
|
linters:
|
||||||
|
- gochecknoinits
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
settings:
|
||||||
|
goimports:
|
||||||
|
local-prefixes:
|
||||||
|
- tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview
|
||||||
7
sample/.gitignore
vendored
Normal file
7
sample/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
*.json
|
||||||
|
*.bak
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.backup
|
||||||
|
terraform
|
||||||
|
variables.tf
|
||||||
|
*.tfrc
|
||||||
10
sample/config.tfrc.example
Normal file
10
sample/config.tfrc.example
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
provider_installation {
|
||||||
|
dev_overrides {
|
||||||
|
"registry.terraform.io/mhenselin/stackitprivatepreview" = "<CURRENT PROJECT PATH>/bin/"
|
||||||
|
}
|
||||||
|
|
||||||
|
# For all other providers, install them directly from their origin provider
|
||||||
|
# registries as normal. If you omit this, Terraform will _only_ use
|
||||||
|
# the dev_overrides block, and so no other providers will be available.
|
||||||
|
direct {}
|
||||||
|
}
|
||||||
4
sample/postgres/outputs.tf
Normal file
4
sample/postgres/outputs.tf
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
output "postgres_flavor" {
|
||||||
|
value = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id
|
||||||
|
}
|
||||||
116
sample/postgres/postresql.tf
Normal file
116
sample/postgres/postresql.tf
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
|
||||||
|
data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" {
|
||||||
|
project_id = var.project_id
|
||||||
|
region = "eu01"
|
||||||
|
cpu = 2
|
||||||
|
ram = 4
|
||||||
|
node_type = "Single"
|
||||||
|
storage_class = "premium-perf2-stackit"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_instance" "msh-sna-pe-example" {
|
||||||
|
project_id = var.project_id
|
||||||
|
name = "mshpetest2"
|
||||||
|
backup_schedule = "0 0 * * *"
|
||||||
|
retention_days = 45
|
||||||
|
flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id
|
||||||
|
replicas = 1
|
||||||
|
storage = {
|
||||||
|
# class = "premium-perf2-stackit"
|
||||||
|
performance_class = "premium-perf2-stackit"
|
||||||
|
size = 10
|
||||||
|
}
|
||||||
|
encryption = {
|
||||||
|
# key_id = stackit_kms_key.key.key_id
|
||||||
|
# keyring_id = stackit_kms_keyring.keyring.keyring_id
|
||||||
|
kek_key_id = var.key_id
|
||||||
|
kek_key_ring_id = var.keyring_id
|
||||||
|
kek_key_version = var.key_version
|
||||||
|
service_account = var.sa_email
|
||||||
|
}
|
||||||
|
network = {
|
||||||
|
acl = ["0.0.0.0/0", "193.148.160.0/19", "170.85.2.177/32"]
|
||||||
|
access_scope = "PUBLIC"
|
||||||
|
}
|
||||||
|
version = 17
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_instance" "msh-sna-pe-example2" {
|
||||||
|
project_id = var.project_id
|
||||||
|
name = "mshpetest2-1"
|
||||||
|
backup_schedule = "0 0 * * *"
|
||||||
|
retention_days = 45
|
||||||
|
flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id
|
||||||
|
replicas = 1
|
||||||
|
storage = {
|
||||||
|
# class = "premium-perf2-stackit"
|
||||||
|
performance_class = "premium-perf2-stackit"
|
||||||
|
size = 10
|
||||||
|
}
|
||||||
|
encryption = {
|
||||||
|
# key_id = stackit_kms_key.key.key_id
|
||||||
|
# keyring_id = stackit_kms_keyring.keyring.keyring_id
|
||||||
|
kek_key_id = var.key_id
|
||||||
|
kek_key_ring_id = var.keyring_id
|
||||||
|
kek_key_version = var.key_version
|
||||||
|
service_account = var.sa_email
|
||||||
|
}
|
||||||
|
network = {
|
||||||
|
acl = ["0.0.0.0/0", "193.148.160.0/19", "170.85.2.177/32"]
|
||||||
|
access_scope = "SNA"
|
||||||
|
}
|
||||||
|
version = 16
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbadminuser" {
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.instance_id
|
||||||
|
name = var.db_admin_username
|
||||||
|
roles = ["createdb", "login", "login"]
|
||||||
|
# roles = ["createdb", "login", "createrole"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbadminuser2" {
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example2.instance_id
|
||||||
|
name = var.db_admin_username
|
||||||
|
roles = ["createdb", "login"]
|
||||||
|
# roles = ["createdb", "login", "createrole"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbuser" {
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.instance_id
|
||||||
|
name = var.db_name
|
||||||
|
roles = ["login"]
|
||||||
|
# roles = ["createdb", "login", "createrole"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_postgresflexalpha_database" "example" {
|
||||||
|
count = 5
|
||||||
|
depends_on = [stackitprivatepreview_postgresflexalpha_user.ptlsdbadminuser]
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.instance_id
|
||||||
|
name = "${var.db_name}${count.index}"
|
||||||
|
owner = var.db_admin_username
|
||||||
|
}
|
||||||
|
|
||||||
|
# data "stackitprivatepreview_postgresflexalpha_instance" "datapsql" {
|
||||||
|
# project_id = var.project_id
|
||||||
|
# instance_id = var.instance_id
|
||||||
|
# region = "eu01"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# output "psql_instance_id" {
|
||||||
|
# value = data.stackitprivatepreview_postgresflexalpha_instance.datapsql.instance_id
|
||||||
|
# }
|
||||||
|
|
||||||
|
output "psql_user_password" {
|
||||||
|
value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.password
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
output "psql_user_conn" {
|
||||||
|
value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection_string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
25
sample/postgres/providers.tf
Normal file
25
sample/postgres/providers.tf
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
# stackit = {
|
||||||
|
# source = "registry.terraform.io/stackitcloud/stackit"
|
||||||
|
# version = "~> 0.70"
|
||||||
|
# }
|
||||||
|
stackitprivatepreview = {
|
||||||
|
source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview"
|
||||||
|
version = "> 0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# provider "stackit" {
|
||||||
|
# default_region = "eu01"
|
||||||
|
# enable_beta_resources = true
|
||||||
|
# service_account_key_path = "./service_account.json"
|
||||||
|
# }
|
||||||
|
|
||||||
|
provider "stackitprivatepreview" {
|
||||||
|
default_region = "eu01"
|
||||||
|
enable_beta_resources = true
|
||||||
|
service_account_key_path = "../service_account.json"
|
||||||
|
}
|
||||||
11
sample/postgres/variables.tf.example
Normal file
11
sample/postgres/variables.tf.example
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
variable "project_id" {
|
||||||
|
default = "<PROJECT ID UUID>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "sa_email" {
|
||||||
|
default = "<SERVICE ACCOUNT EMAIL>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "db_username" {
|
||||||
|
default = "<DB USERNAME>"
|
||||||
|
}
|
||||||
13
sample/sqlserver/flavor.tf
Normal file
13
sample/sqlserver/flavor.tf
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
data "stackitprivatepreview_sqlserverflexbeta_flavor" "sqlserver_flavor" {
|
||||||
|
project_id = var.project_id
|
||||||
|
region = "eu01"
|
||||||
|
cpu = 4
|
||||||
|
ram = 16
|
||||||
|
node_type = "Single"
|
||||||
|
storage_class = "premium-perf2-stackit"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "sqlserver_flavor" {
|
||||||
|
value = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id
|
||||||
|
}
|
||||||
25
sample/sqlserver/providers.tf
Normal file
25
sample/sqlserver/providers.tf
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
# stackit = {
|
||||||
|
# source = "registry.terraform.io/stackitcloud/stackit"
|
||||||
|
# version = "~> 0.70"
|
||||||
|
# }
|
||||||
|
stackitprivatepreview = {
|
||||||
|
source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview"
|
||||||
|
version = "> 0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# provider "stackit" {
|
||||||
|
# default_region = "eu01"
|
||||||
|
# enable_beta_resources = true
|
||||||
|
# service_account_key_path = "../service_account.json"
|
||||||
|
# }
|
||||||
|
|
||||||
|
provider "stackitprivatepreview" {
|
||||||
|
default_region = "eu01"
|
||||||
|
enable_beta_resources = true
|
||||||
|
service_account_key_path = "../service_account.json"
|
||||||
|
}
|
||||||
63
sample/sqlserver/sqlserver.tf
Normal file
63
sample/sqlserver/sqlserver.tf
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# resource "stackit_kms_keyring" "keyring" {
|
||||||
|
# project_id = var.project_id
|
||||||
|
# display_name = "msh-keyring01"
|
||||||
|
# description = "This is a test keyring for private endpoints"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# resource "stackit_kms_key" "key" {
|
||||||
|
# project_id = var.project_id
|
||||||
|
# keyring_id = stackit_kms_keyring.keyring.keyring_id
|
||||||
|
# display_name = "msh-key01"
|
||||||
|
# protection = "software"
|
||||||
|
# algorithm = "aes_256_gcm"
|
||||||
|
# purpose = "symmetric_encrypt_decrypt"
|
||||||
|
# access_scope = "SNA"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# output "keyid" {
|
||||||
|
# value = stackit_kms_key.key.key_id
|
||||||
|
# }
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-beta-sna-001" {
|
||||||
|
project_id = var.project_id
|
||||||
|
name = "msh-beta-sna-001"
|
||||||
|
backup_schedule = "0 3 * * *"
|
||||||
|
retention_days = 31
|
||||||
|
flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id
|
||||||
|
storage = {
|
||||||
|
class = "premium-perf2-stackit"
|
||||||
|
size = 10
|
||||||
|
}
|
||||||
|
version = 2022
|
||||||
|
encryption = {
|
||||||
|
#key_id = stackit_kms_key.key.key_id
|
||||||
|
#keyring_id = stackit_kms_keyring.keyring.keyring_id
|
||||||
|
#key_version = 1
|
||||||
|
# key with scope public
|
||||||
|
# kek_key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b"
|
||||||
|
kek_key_id = "c6878f92-ce55-4b79-8236-ba9d001d7967" # msh-k-001
|
||||||
|
# key_id = var.key_id
|
||||||
|
# kek_key_ring_id = var.keyring_id
|
||||||
|
kek_key_ring_id = "0dea3f5f-9947-4dda-a9d3-18418832cefe" # msh-kr-sna01
|
||||||
|
kek_key_version = var.key_version
|
||||||
|
service_account = var.sa_email
|
||||||
|
}
|
||||||
|
network = {
|
||||||
|
acl = ["0.0.0.0/0", "193.148.160.0/19"]
|
||||||
|
access_scope = "SNA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_sqlserverflexbeta_user" "betauser" {
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-beta-sna-001.instance_id
|
||||||
|
username = "betauser"
|
||||||
|
roles = ["##STACKIT_DatabaseManager##", "##STACKIT_LoginManager##"]
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "stackitprivatepreview_sqlserverflexbeta_database" "betadb" {
|
||||||
|
project_id = var.project_id
|
||||||
|
instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-beta-sna-001.instance_id
|
||||||
|
name = "mshtest002"
|
||||||
|
owner = stackitprivatepreview_sqlserverflexbeta_user.betauser.username
|
||||||
|
}
|
||||||
11
sample/sqlserver/variables.tf.example
Normal file
11
sample/sqlserver/variables.tf.example
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
variable "project_id" {
|
||||||
|
default = "<PROJECT ID UUID>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "sa_email" {
|
||||||
|
default = "<SERVICE ACCOUNT EMAIL>"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "db_username" {
|
||||||
|
default = "<DB USERNAME>"
|
||||||
|
}
|
||||||
53
sample/tf.sh
Executable file
53
sample/tf.sh
Executable file
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ./tf.sh apply > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "$0 usage:" && grep "[[:space:]].)\ #" "$0" | sed 's/#//' | sed -r 's/([a-z])\)/-\1/';
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[ $# -eq 0 ] && usage
|
||||||
|
|
||||||
|
CONFIG_FOLDER=$(dirname "$0")
|
||||||
|
BINARY=terraform
|
||||||
|
|
||||||
|
ADD=""
|
||||||
|
|
||||||
|
while getopts ":b:hdirt" arg; do
|
||||||
|
case $arg in
|
||||||
|
b) # Set binary (default is terraform).
|
||||||
|
BINARY=${OPTARG}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
d) # Set log level to DEBUG.
|
||||||
|
TF_LOG=DEBUG
|
||||||
|
export TF_LOG
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
i) # Set log level to INFO.
|
||||||
|
TF_LOG=INFO
|
||||||
|
export TF_LOG
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
r) # Set log level to INFO.
|
||||||
|
ADD="-refresh-only"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
t) # Set log level to TRACE.
|
||||||
|
TF_LOG=TRACE
|
||||||
|
export TF_LOG
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
h | *) # Display help.
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
TERRAFORM_CONFIG=${CONFIG_FOLDER}/config.tfrc
|
||||||
|
export TERRAFORM_CONFIG
|
||||||
|
|
||||||
|
${BINARY} "$@" ${ADD}
|
||||||
|
|
@ -314,11 +314,14 @@ func TestAccInstanceEncryption(t *testing.T) {
|
||||||
data.KekKeyID = os.Getenv("TF_ACC_KEK_KEY_ID")
|
data.KekKeyID = os.Getenv("TF_ACC_KEK_KEY_ID")
|
||||||
data.KekKeyRingID = os.Getenv("TF_ACC_KEK_KEY_RING_ID")
|
data.KekKeyRingID = os.Getenv("TF_ACC_KEK_KEY_RING_ID")
|
||||||
verString := os.Getenv("TF_ACC_KEK_KEY_VERSION")
|
verString := os.Getenv("TF_ACC_KEK_KEY_VERSION")
|
||||||
|
if verString == "" {
|
||||||
|
verString = "1"
|
||||||
|
}
|
||||||
version, err := strconv.ParseInt(verString, 0, 32)
|
version, err := strconv.ParseInt(verString, 0, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error coverting value to uint8: %+v", verString)
|
t.Errorf("error coverting value to uint8: '%+v'", verString)
|
||||||
}
|
}
|
||||||
data.KekKeyVersion = uint8(version) //nolint:gosec // not important its a test
|
data.KekKeyVersion = uint8(version) //nolint:gosec // not important it's a test
|
||||||
data.KekServiceAccount = os.Getenv("TF_ACC_KEK_SERVICE_ACCOUNT")
|
data.KekServiceAccount = os.Getenv("TF_ACC_KEK_SERVICE_ACCOUNT")
|
||||||
|
|
||||||
resource.ParallelTest(t, resource.TestCase{
|
resource.ParallelTest(t, resource.TestCase{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue