Compare commits
143 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ce4b847596 | |||
|
|
2453a32d01 | ||
|
|
0602a4b693 | ||
|
|
28b60de115 | ||
|
|
b705ce4aab | ||
|
|
83ca627cea | ||
|
|
739289fbb8 | ||
|
|
c89574c3e6 | ||
|
|
a1e61674c8 | ||
|
|
cb9ff26bb0 | ||
|
|
6932f9d305 | ||
|
|
712f8edf9e | ||
|
|
805ffe1f29 | ||
|
|
bf8d3fb437 | ||
| d7a7eb9cb3 | |||
|
|
b60f32c570 | ||
| 272e385318 | |||
| f731cf246f | |||
| 6365f63fc1 | |||
| 85ce76564f | |||
| 928481d26f | |||
| 0e64974821 | |||
| 371bb0d90f | |||
| caf7213bca | |||
| 9cf150437d | |||
| 523d96189f | |||
|
|
8ca233dd32 | ||
|
|
9bad8a6947 | ||
|
|
e3e7e7bd89 | ||
|
|
b112c5ee22 | ||
|
|
f2f31b939e | ||
|
|
c781ffafaa | ||
|
|
3715db2923 | ||
|
|
f83c8e8a9a | ||
|
|
af82decadd | ||
|
|
f5e0a53364 | ||
|
|
9d1c8eeaa7 | ||
|
|
8516e0419a | ||
|
|
e12afbe1ad | ||
|
|
c0c9dc8131 | ||
|
|
c3bc6ef5da | ||
|
|
4d865ae921 | ||
|
|
a355247845 | ||
|
|
be86069155 | ||
|
|
0adf28daf6 | ||
|
|
9402d6f291 | ||
|
|
cb7e573d26 | ||
|
|
6ef0ad2f93 | ||
|
|
31be0a0b54 | ||
|
|
71ddaa3345 | ||
|
|
775a0b5adb | ||
|
|
1a983e945b | ||
|
|
b152359706 | ||
| a844f6cc30 | |||
|
|
8e6b5a9bab | ||
|
|
cd4695ee68 | ||
|
|
5bd7958f09 | ||
| 8fc9170c9c | |||
|
|
294550f5ce | ||
|
|
ddc6640a32 | ||
|
|
4bc11c5f07 | ||
|
|
2287177302 | ||
|
|
6433bc2954 | ||
|
|
965b6013a6 | ||
|
|
8d530c45ea | ||
|
|
bdcb1ab532 | ||
|
|
818875976c | ||
|
|
e9de5a2840 | ||
|
|
fae22aa484 | ||
| abd1a439eb | |||
|
|
4c4a007a58 | ||
|
|
3275424089 | ||
|
|
f06aa41b96 | ||
|
|
1245dd17f2 | ||
|
|
28ceebecf8 | ||
|
|
2b7f3d45f3 | ||
|
|
0bdd7c3c32 | ||
|
|
44ad5e4fe2 | ||
|
|
628ce3b75c | ||
|
|
020845b48f | ||
|
|
5b4c1f4324 | ||
|
|
fc32db30b6 | ||
|
|
81443a3d02 | ||
|
|
c422910bbe | ||
|
|
e45695e07f | ||
|
|
48cada2cf3 | ||
|
|
7cc359ec59 | ||
|
|
a1d716d566 | ||
|
|
aac56e22b8 | ||
|
|
e4be812c68 | ||
|
|
9a7642cf33 | ||
|
|
3613bbea28 | ||
|
|
3c2eb0407c | ||
|
|
d776a86303 | ||
|
|
b49cbe3d55 | ||
|
|
71aff5fa32 | ||
|
|
407e45cd5c | ||
|
|
40b8f93fa2 | ||
|
|
b599e244e8 | ||
|
|
42c4f2e505 | ||
|
|
4b4efec196 | ||
|
|
945e6e08b0 | ||
|
|
efe2b577b0 | ||
|
|
545eac90df | ||
|
|
4e35273d6d | ||
|
|
6f1f18fd0a | ||
|
|
5aa436cfb8 | ||
|
|
4a98b99f1c | ||
|
|
c7b54717a1 | ||
|
|
0609b158c1 | ||
|
|
8d1b13f7b7 | ||
|
|
0be6da1ae1 | ||
|
|
c73a6e0d71 | ||
|
|
95ab4e37c4 | ||
|
|
b70cdcabf6 | ||
|
|
eb22dee25b | ||
|
|
61b8765c82 | ||
|
|
96c4175e74 | ||
|
|
a685a91f86 | ||
|
|
839841aee4 | ||
|
|
9f5b4ab771 | ||
|
|
4a326e9ceb | ||
|
|
a0fbc8dd4f | ||
|
|
9912b04c2a | ||
|
|
d527d9b474 | ||
|
|
5e515daafa | ||
|
|
fa748f6e5d | ||
|
|
c5e35b19f9 | ||
|
|
b5a9987b74 | ||
|
|
103038c0a3 | ||
|
|
f5a606153f | ||
|
|
9a806a8e2c | ||
|
|
56e71c8981 | ||
|
|
424cdcd2b3 | ||
|
|
165bd89fbf | ||
|
|
7fb4223f85 | ||
|
|
8112f328a2 | ||
|
|
5e867706c0 | ||
|
|
2e355d2ede | ||
|
|
b849521780 | ||
|
|
2797a10fcb | ||
|
|
d35fa26eb8 | ||
|
|
83dad0d6b3 |
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@@ -2,7 +2,7 @@ name: Release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- '*'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
@@ -17,9 +17,9 @@ jobs:
|
|||||||
run: git fetch --force --tags
|
run: git fetch --force --tags
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: 1.17
|
go-version: 1.18
|
||||||
|
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
id: import_gpg
|
id: import_gpg
|
||||||
@@ -29,7 +29,7 @@ jobs:
|
|||||||
passphrase: ${{ secrets.PASSPHRASE }}
|
passphrase: ${{ secrets.PASSPHRASE }}
|
||||||
|
|
||||||
- name: Run GoReleaser
|
- name: Run GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@v2
|
uses: goreleaser/goreleaser-action@v3
|
||||||
with:
|
with:
|
||||||
args: release --rm-dist --release-notes CHANGELOG.md
|
args: release --rm-dist --release-notes CHANGELOG.md
|
||||||
env:
|
env:
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,3 +2,6 @@ decort/vendor/
|
|||||||
examples/
|
examples/
|
||||||
url_scrapping/
|
url_scrapping/
|
||||||
terraform-provider-decort*
|
terraform-provider-decort*
|
||||||
|
.vscode/
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ linters:
|
|||||||
- dogsled
|
- dogsled
|
||||||
- errorlint
|
- errorlint
|
||||||
- exportloopref
|
- exportloopref
|
||||||
- gocognit
|
#- gocognit - disabled till better times
|
||||||
- goconst
|
- goconst
|
||||||
- gocyclo
|
- gocyclo
|
||||||
- gosec
|
- gosec
|
||||||
@@ -20,7 +20,7 @@ linters:
|
|||||||
linters-settings:
|
linters-settings:
|
||||||
errcheck:
|
errcheck:
|
||||||
exclude-functions:
|
exclude-functions:
|
||||||
- (*github.com/hashicorp/terraform-plugin-sdk/helper/schema.ResourceData).Set
|
- (*github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.ResourceData).Set
|
||||||
staticcheck:
|
staticcheck:
|
||||||
go: "1.18"
|
go: "1.18"
|
||||||
checks:
|
checks:
|
||||||
@@ -28,6 +28,8 @@ linters-settings:
|
|||||||
- -SA1019
|
- -SA1019
|
||||||
nestif:
|
nestif:
|
||||||
min-complexity: 7
|
min-complexity: 7
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 40
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
max-same-issues: 0
|
max-same-issues: 0
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ before:
|
|||||||
builds:
|
builds:
|
||||||
- env:
|
- env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
|
main: ./cmd/decort
|
||||||
mod_timestamp: '{{ .CommitTimestamp }}'
|
mod_timestamp: '{{ .CommitTimestamp }}'
|
||||||
flags:
|
flags:
|
||||||
- -trimpath
|
- -trimpath
|
||||||
@@ -15,9 +16,12 @@ builds:
|
|||||||
goarch:
|
goarch:
|
||||||
- amd64
|
- amd64
|
||||||
- '386'
|
- '386'
|
||||||
|
- arm64
|
||||||
ignore:
|
ignore:
|
||||||
- goos: darwin
|
- goos: darwin
|
||||||
goarch: '386'
|
goarch: '386'
|
||||||
|
- goos: windows
|
||||||
|
goarch: arm64
|
||||||
binary: '{{ .ProjectName }}_v{{ .Version }}'
|
binary: '{{ .ProjectName }}_v{{ .Version }}'
|
||||||
archives:
|
archives:
|
||||||
- format: zip
|
- format: zip
|
||||||
|
|||||||
39
CHANGELOG.md
39
CHANGELOG.md
@@ -1,35 +1,6 @@
|
|||||||
### Bug fixes
|
## Version 4.4.3
|
||||||
- changing boot\_disk\_size in kvmvm
|
|
||||||
- downsizing CPU and RAM in kvmvm
|
|
||||||
- pfw recreation if public\_port\_end unspecified
|
|
||||||
|
|
||||||
### New datasources
|
### Bugfix
|
||||||
- disk\_list
|
- Fixed panic
|
||||||
- rg\_list
|
- Fixed field description in cloudapi/kvmvm/resource_compute
|
||||||
- account\_list
|
- Fixed field owner in request create lb in cloudapi/cloudbroker
|
||||||
- account\_computes\_list
|
|
||||||
- account\_disks\_list
|
|
||||||
- account\_vins\_list
|
|
||||||
- account\_audits\_list
|
|
||||||
- account
|
|
||||||
- account\_rg\_list
|
|
||||||
- account\_counsumed\_units
|
|
||||||
- account\_counsumed\_units\_by\_type
|
|
||||||
- account\_reserved\_units
|
|
||||||
- account\_templates\_list
|
|
||||||
- account\_deleted\_list
|
|
||||||
- bservice\_list
|
|
||||||
- bservice\_snapshot\_list
|
|
||||||
- bservice\_deleted\_list
|
|
||||||
- bservice
|
|
||||||
- bservice\_group
|
|
||||||
- extnet\_default
|
|
||||||
- extnet\_list
|
|
||||||
- extnet
|
|
||||||
- extnet\_computes\_list
|
|
||||||
- vins\_list
|
|
||||||
|
|
||||||
### New resources
|
|
||||||
- account
|
|
||||||
- bservice
|
|
||||||
- bservice\_group
|
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
pipeline {
|
|
||||||
agent {
|
|
||||||
kubernetes {
|
|
||||||
yaml '''
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Pod
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: alpine
|
|
||||||
image: alpine:3.15
|
|
||||||
command:
|
|
||||||
- sleep
|
|
||||||
- infinity
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stages {
|
|
||||||
stage('Dependency check') {
|
|
||||||
environment {
|
|
||||||
DEPCHECKDB = credentials('depcheck-postgres')
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
container('alpine') {
|
|
||||||
sh 'apk update && apk add openjdk11 java-postgresql-jdbc go'
|
|
||||||
dependencyCheck additionalArguments: '-f JSON -f HTML -n --enableExperimental \
|
|
||||||
-l deplog \
|
|
||||||
--dbDriverName org.postgresql.Driver \
|
|
||||||
--dbDriverPath /usr/share/java/postgresql-jdbc.jar \
|
|
||||||
--dbUser $DEPCHECKDB_USR \
|
|
||||||
--dbPassword $DEPCHECKDB_PSW \
|
|
||||||
--connectionString jdbc:postgresql://postgres-postgresql.postgres/depcheck', odcInstallation: 'depcheck'
|
|
||||||
sh 'cat deplog'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('SonarQube analysis') {
|
|
||||||
environment {
|
|
||||||
SONARSCANNER_HOME = tool 'sonarscanner'
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
withSonarQubeEnv('sonarqube') {
|
|
||||||
sh '$SONARSCANNER_HOME/bin/sonar-scanner'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('SonarQube quality gate') {
|
|
||||||
steps {
|
|
||||||
waitForQualityGate webhookSecretId: 'sonar-webhook', abortPipeline: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
98
Makefile
98
Makefile
@@ -1,39 +1,85 @@
|
|||||||
TEST?=$$(go list ./... | grep -v 'vendor')
|
TEST?=$$(go list ./... | grep -v 'vendor')
|
||||||
HOSTNAME=digitalenergy.online
|
HOSTNAME=basis
|
||||||
NAMESPACE=decort
|
NAMESPACE=decort
|
||||||
NAME=terraform-provider-decort
|
NAME=terraform-provider-decort
|
||||||
#BINARY=terraform-provider-${NAME}
|
BINDIR = ./bin
|
||||||
BINARY=${NAME}.exe
|
ZIPDIR = ./zip
|
||||||
VERSION=0.2
|
BINARY=${NAME}
|
||||||
#OS_ARCH=darwin_amd64
|
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
||||||
OS_ARCH=windows_amd64
|
MAINPATH = ./cmd/decort/
|
||||||
|
VERSION=4.4.3
|
||||||
|
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
|
||||||
|
|
||||||
|
FILES = ${BINARY}_${VERSION}_darwin_amd64\
|
||||||
|
${BINARY}_${VERSION}_darwin_arm64\
|
||||||
|
${BINARY}_${VERSION}_freebsd_386\
|
||||||
|
${BINARY}_${VERSION}_freebsd_amd64\
|
||||||
|
${BINARY}_${VERSION}_freebsd_arm\
|
||||||
|
${BINARY}_${VERSION}_linux_386\
|
||||||
|
${BINARY}_${VERSION}_linux_amd64\
|
||||||
|
${BINARY}_${VERSION}_linux_arm\
|
||||||
|
${BINARY}_${VERSION}_linux_arm64\
|
||||||
|
${BINARY}_${VERSION}_openbsd_386\
|
||||||
|
${BINARY}_${VERSION}_openbsd_amd64\
|
||||||
|
${BINARY}_${VERSION}_solaris_amd64\
|
||||||
|
${BINARY}_${VERSION}_windows_386.exe\
|
||||||
|
${BINARY}_${VERSION}_windows_amd64.exe\
|
||||||
|
|
||||||
|
BINS = $(addprefix bin/, $(FILES))
|
||||||
|
|
||||||
default: install
|
default: install
|
||||||
|
|
||||||
build:
|
image:
|
||||||
go build -o ${BINARY}
|
GOOS=linux GOARCH=amd64 go build -o terraform-provider-decort ./cmd/decort/
|
||||||
|
docker build . -t rudecs/tf:3.2.2
|
||||||
|
rm terraform-provider-decort
|
||||||
|
|
||||||
release:
|
lint:
|
||||||
GOOS=darwin GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_darwin_amd64
|
golangci-lint run --timeout 600s
|
||||||
GOOS=freebsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_freebsd_386
|
|
||||||
GOOS=freebsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_freebsd_amd64
|
st:
|
||||||
GOOS=freebsd GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_freebsd_arm
|
go build -o ${BINARY} ${MAINPATH}
|
||||||
GOOS=linux GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_linux_386
|
cp ${BINARY} ${WORKPATH}
|
||||||
GOOS=linux GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_linux_amd64
|
rm ${BINARY}
|
||||||
GOOS=linux GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_linux_arm
|
|
||||||
GOOS=openbsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_openbsd_386
|
build:
|
||||||
GOOS=openbsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_openbsd_amd64
|
go build -o ${BINARY} ${MAINPATH}
|
||||||
GOOS=solaris GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_solaris_amd64
|
|
||||||
GOOS=windows GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_windows_386
|
release: $(FILES)
|
||||||
GOOS=windows GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_windows_amd64
|
|
||||||
|
$(FILES) : $(BINDIR) $(ZIPDIR) $(BINS)
|
||||||
|
zip -r $(ZIPDIR)/$@.zip $(BINDIR)/$@
|
||||||
|
zip -rj $(ZIPDIR)/$@.zip scripts/install.bat scripts/install.sh
|
||||||
|
|
||||||
|
$(BINDIR):
|
||||||
|
mkdir $@
|
||||||
|
|
||||||
|
$(ZIPDIR):
|
||||||
|
mkdir $@
|
||||||
|
|
||||||
|
$(BINS):
|
||||||
|
GOOS=darwin GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_darwin_amd64 $(MAINPATH)
|
||||||
|
GOOS=darwin GOARCH=arm64 go build -o ./bin/${BINARY}_${VERSION}_darwin_arm64 $(MAINPATH)
|
||||||
|
GOOS=freebsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_freebsd_386 $(MAINPATH)
|
||||||
|
GOOS=freebsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_freebsd_amd64 $(MAINPATH)
|
||||||
|
GOOS=freebsd GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_freebsd_arm $(MAINPATH)
|
||||||
|
GOOS=linux GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_linux_386 $(MAINPATH)
|
||||||
|
GOOS=linux GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_linux_amd64 $(MAINPATH)
|
||||||
|
GOOS=linux GOARCH=arm go build -o ./bin/${BINARY}_${VERSION}_linux_arm $(MAINPATH)
|
||||||
|
GOOS=linux GOARCH=arm64 go build -o ./bin/${BINARY}_${VERSION}_linux_arm64 ${MAINPATH}
|
||||||
|
GOOS=openbsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_openbsd_386 $(MAINPATH)
|
||||||
|
GOOS=openbsd GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_openbsd_amd64 $(MAINPATH)
|
||||||
|
GOOS=solaris GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_solaris_amd64 $(MAINPATH)
|
||||||
|
GOOS=windows GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_windows_386.exe $(MAINPATH)
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_windows_amd64.exe $(MAINPATH)
|
||||||
|
|
||||||
install: build
|
install: build
|
||||||
mkdir -p ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}
|
mkdir -p ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}
|
||||||
mv ${BINARY} ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}
|
mv ${BINARY} ~/.terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAME}/${VERSION}/${OS_ARCH}
|
||||||
|
|
||||||
test:
|
test:
|
||||||
go test -i $(TEST) || exit 1
|
go test -i $(TEST) || exit 1
|
||||||
echo $(TEST) | xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4
|
echo $(TEST) | xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4
|
||||||
|
|
||||||
testacc:
|
testacc:
|
||||||
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m
|
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m
|
||||||
|
|||||||
203
README.md
203
README.md
@@ -1,69 +1,116 @@
|
|||||||
# terraform-provider-decort
|
# terraform-provider-decort
|
||||||
|
|
||||||
Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT)
|
Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT)
|
||||||
|
|
||||||
Внимание: провайдер версии rc-1.25 разработан для DECORT API 3.7.x.
|
## Соответсвие версий платформы версиям провайдера
|
||||||
Для более старых версий можно использовать:
|
|
||||||
- DECORT API 3.6.x - версия провайдера rc-1.10
|
| Версия DECORT API | Версия провайдера Terraform |
|
||||||
- DECORT API до 3.6.0 - terraform DECS provider (https://github.com/rudecs/terraform-provider-decs)
|
| ------ | ------ |
|
||||||
|
| 3.8.8 | 4.4.x |
|
||||||
|
| 3.8.7 | 4.3.x |
|
||||||
|
| 3.8.6 | 4.0.x, 4.1.x, 4.2.x |
|
||||||
|
| 3.8.5 | 3.4.x |
|
||||||
|
| 3.8.0 - 3.8.4 | 3.3.1 |
|
||||||
|
| 3.7.x | rc-1.25 |
|
||||||
|
| 3.6.x | rc-1.10 |
|
||||||
|
| до 3.6.0 | [terraform-provider-decs](https://github.com/rudecs/terraform-provider-decs) |
|
||||||
|
|
||||||
|
## Режимы работы
|
||||||
|
|
||||||
|
Провайдер позволяет работать в двух режимах:
|
||||||
|
|
||||||
|
- Режим пользователя,
|
||||||
|
- Режим администратора. <br>
|
||||||
|
Используйте ресурсы `decort_cb_` для администрирования. <br>
|
||||||
|
Вики проекта: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
|
||||||
## Возможности провайдера
|
## Возможности провайдера
|
||||||
- Работа с Compute instances,
|
|
||||||
- Работа с disks,
|
- Работа с Compute instances,
|
||||||
|
- Работа с disks,
|
||||||
- Работа с k8s,
|
- Работа с k8s,
|
||||||
- Работа с image,
|
- Работа с image,
|
||||||
|
- Работа с flipgroups,
|
||||||
|
- Работа с stacks,
|
||||||
- Работа с reource groups,
|
- Работа с reource groups,
|
||||||
- Работа с VINS,
|
- Работа с VINS,
|
||||||
- Работа с pfw,
|
- Работа с pfw,
|
||||||
- Работа с accounts,
|
- Работа с accounts,
|
||||||
- Работа с snapshots,
|
- Работа с snapshots,
|
||||||
- Работа с pcidevice,
|
|
||||||
- Работа с sep,
|
|
||||||
- Работа с vgpu,
|
|
||||||
- Работа с bservice,
|
- Работа с bservice,
|
||||||
- Работа с extnets.
|
- Работа с extnets,
|
||||||
|
- Работа с locations,
|
||||||
|
- Работа с load balancer.
|
||||||
|
|
||||||
Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki
|
Вики проекта: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
|
||||||
## Начало
|
## Установка
|
||||||
Старт возможен по двум путям:
|
Начиная с версии провайдера `4.3.0` в релизном архиве находятся скрипты-инсталляторы.
|
||||||
1. Установка через собранные пакеты.
|
Чтобы выполнить установку, необходимо:
|
||||||
2. Ручная установка.
|
1. Перейти по адресу: https://repository.basistech.ru/BASIS/terraform-provider-decort/releases
|
||||||
|
2. Выбрать необходимую версию провайдера подходящую под операционную систему.
|
||||||
|
3. Скачать архив.
|
||||||
|
4. Распаковать архив.
|
||||||
|
5. Выполнить скрипт установщика, `install.sh` или `install.bat` для Windows.<br/>
|
||||||
|
*Для запуска `install.sh` не забудьте изменить права доступа к файлу*
|
||||||
|
```bash
|
||||||
|
chmod u+x install.sh
|
||||||
|
```
|
||||||
|
6. Дождаться сообщения об успешной установке. Установщик выведет актуальный блок конфигурации провайдера, скопируйте его
|
||||||
|
```bash
|
||||||
|
DECORT provider version 4.3.0 has been successfully installed
|
||||||
|
|
||||||
### Установка через собранные пакеты.
|
Copy this provider configuration to main.tf file:
|
||||||
1. Скачайте и установите terraform по ссылке: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
terraform {
|
||||||
2. Создайте файл `main.tf` и добавьте в него следующий блок.
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
version = "4.3.0"
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
7. После этого, создайте файл `main.tf` в рабочей директории, которая может находится в любом удобном для пользователя месте.
|
||||||
|
В данном примере, рабочая директория с файлом main.tf находится по пути:
|
||||||
|
```bash
|
||||||
|
~/work/tfdir/main.tf
|
||||||
|
```
|
||||||
|
8. Вставьте в `main.tf` блок конфигурации провайдера, который был выведен на экран установщиком:
|
||||||
|
```terraform
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
version = "4.3.0"
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
9. Добавьте в файл блок с инициализацией провайдера.
|
||||||
```terraform
|
```terraform
|
||||||
provider "decort" {
|
provider "decort" {
|
||||||
authenticator = "oauth2"
|
authenticator = "oauth2"
|
||||||
#controller_url = <DECORT_CONTROLLER_URL>
|
controller_url = "https://mr4.digitalenergy.online"
|
||||||
controller_url = "https://ds1.digitalenergy.online"
|
|
||||||
#oauth2_url = <DECORT_SSO_URL>
|
|
||||||
oauth2_url = "https://sso.digitalenergy.online"
|
oauth2_url = "https://sso.digitalenergy.online"
|
||||||
allow_unverified_ssl = true
|
allow_unverified_ssl = true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
3. Выполните команду
|
|
||||||
```
|
10. В консоли выполните команду
|
||||||
|
```bash
|
||||||
terraform init
|
terraform init
|
||||||
```
|
```
|
||||||
Провайдер автоматически будет установлен на ваш компьютер из terraform registry.
|
|
||||||
|
|
||||||
### Ручная установка
|
11. В случае успешной установки, Terraform инициализирует провайдер и будет готов к дальнейшей работе.
|
||||||
1. Скачайте и установите Go по ссылке: https://go.dev/dl/
|
|
||||||
2. Скачайте и установите terraform по ссылке: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
## Установка из релизов
|
||||||
3. Склонируйте репозиторий с провайдером, выполнив команду:
|
Terraform провайдер DECORT имеет скомпилированные релизные версии, которые расположены по адресу: [Релизы](https://repository.basistech.ru/BASIS/terraform-provider-decort/releases).
|
||||||
```bash
|
Чтобы выполнить установку из релиза, необходимо:
|
||||||
git clone https://github.com/rudecs/terraform-provider-decort.git
|
1. Перейти по адресу: https://repository.basistech.ru/BASIS/terraform-provider-decort/releases
|
||||||
```
|
2. Выбрать необходимую версию провайдера подходящую под операционную систему.
|
||||||
4. Перейдите в скачанную папку с провайдером и выполните команду
|
3. Скачать архив.
|
||||||
```bash
|
4. Распаковать архив.
|
||||||
go build -o terraform-provider-decort
|
5. Полученный файл (в директории `bin/`) необходимо поместить:
|
||||||
```
|
|
||||||
Если вы знаете как устроен _makefile_, то можно изменить в файле `Makefile` параметры под вашу ОС и выполнить команду
|
|
||||||
```bash
|
|
||||||
make build
|
|
||||||
```
|
|
||||||
5. Полученный файл необходимо поместить:
|
|
||||||
Linux:
|
Linux:
|
||||||
```bash
|
```bash
|
||||||
~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target}
|
~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target}
|
||||||
@@ -72,51 +119,81 @@ Windows:
|
|||||||
```powershell
|
```powershell
|
||||||
%APPDATA%\terraform.d\plugins\${host_name}\${namespace}\${type}\${version}\${target}
|
%APPDATA%\terraform.d\plugins\${host_name}\${namespace}\${type}\${version}\${target}
|
||||||
```
|
```
|
||||||
ВНИМАНИЕ: для ОС Windows `%APP_DATA%` является каталогом, в котором будут помещены будущие файлы terraform.
|
|
||||||
Где:
|
Где:
|
||||||
- host_name - имя хоста, держателя провайдера, например, digitalenergy.online
|
- host_name - имя хоста, держателя провайдера, например, basis
|
||||||
- namespace - пространство имен хоста, например decort
|
- namespace - пространство имен хоста, например decort
|
||||||
- type - тип провайдера, может совпадать с пространством имен, например, decort
|
- type - тип провайдера, может совпадать с пространством имен, например, decort
|
||||||
- version - версия провайдера, например 1.2
|
- version - версия провайдера, например 4.3.0
|
||||||
- target - версия ОС, например windows_amd64
|
- target - архитектура операционной системы, например windows_amd64
|
||||||
6. После этого, создайте файл `main.tf`.
|
|
||||||
7. Добавьте в него следующий блок
|
В примере ниже используется путь до провайдера на машине с ОС Linux:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
~/.terraform.d/plugins/basis/decort/decort/4.3.0/linux_amd64/tf-provider
|
||||||
|
^ ^ ^ ^ ^ ^
|
||||||
|
host_name | | | | | |
|
||||||
|
| | | | |
|
||||||
|
namespace | | | | |
|
||||||
|
| | | |
|
||||||
|
type | | | |
|
||||||
|
| | |
|
||||||
|
version | | |
|
||||||
|
| |
|
||||||
|
target | |
|
||||||
|
|
|
||||||
|
исполняемый файл |
|
||||||
|
```
|
||||||
|
|
||||||
|
6. После этого, создайте файл `main.tf` в рабочей директории, которая может находится в любом удобном для пользователя месте.
|
||||||
|
В данном примере, рабочая директория с файлом main.tf находится по пути:
|
||||||
|
```bash
|
||||||
|
~/work/tfdir/main.tf
|
||||||
|
```
|
||||||
|
7. Добавьте в `main.tf` следующий блок
|
||||||
```terraform
|
```terraform
|
||||||
terraform {
|
terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
decort = {
|
decort = {
|
||||||
version = "1.2"
|
version = "4.3.0"
|
||||||
source = "digitalenergy.online/decort/decort"
|
source = "basis/decort/decort"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
В поле `version` указывается версия провайдера.
|
В поле `version` указывается версия провайдера.
|
||||||
Обязательный параметр
|
<br/>
|
||||||
Тип поля - строка
|
**ВНИМАНИЕ: Версии в блоке и в пути к исполняемому файлу провайдера должны совпадать!**
|
||||||
ВНИМАНИЕ: Версии в блоке и в репозитории, в который был помещен провайдер должны совпадать!
|
|
||||||
|
|
||||||
В поле `source` помещается путь до репозитория с версией вида:
|
В поле `source` помещается путь до репозитория с версией вида:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
${host_name}/${namespace}/${type}
|
${host_name}/${namespace}/${type}
|
||||||
```
|
```
|
||||||
ВНИМАНИЕ: все параметры должны совпадать с путем репозитория, в котором помещен провайдер.
|
|
||||||
|
|
||||||
8. В консоле выполнить команду
|
**ВНИМАНИЕ: Версии в блоке и в пути к исполняемому файлу провайдера должны совпадать!**
|
||||||
|
|
||||||
|
8. Добавьте в файл блок с инициализацией провайдера.
|
||||||
|
```terraform
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "oauth2"
|
||||||
|
controller_url = "https://mr4.digitalenergy.online"
|
||||||
|
oauth2_url = "https://sso.digitalenergy.online"
|
||||||
|
allow_unverified_ssl = true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
9. В консоли выполните команду
|
||||||
```bash
|
```bash
|
||||||
terraform init
|
terraform init
|
||||||
```
|
```
|
||||||
|
|
||||||
9. Если все прошло хорошо - ошибок не будет.
|
10. В случае успешной установки, Terraform инициализирует провайдер и будет готов к дальнейшей работе.
|
||||||
|
|
||||||
Более подробно о сборке провайдера можно найти по ссылке: https://learn.hashicorp.com/tutorials/terraform/provider-use?in=terraform/providers
|
|
||||||
|
|
||||||
## Примеры работы
|
## Примеры работы
|
||||||
Примеры работы можно найти:
|
|
||||||
- На вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki
|
|
||||||
- В папке `samples`
|
|
||||||
|
|
||||||
Схемы к terraform'у доступны:
|
Примеры работы можно найти:
|
||||||
- В папке `docs`
|
|
||||||
|
- На вики проекта: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
- В папке `samples`
|
||||||
|
|
||||||
Хорошей работы!
|
Хорошей работы!
|
||||||
|
|||||||
75
README_EN.md
75
README_EN.md
@@ -1,13 +1,30 @@
|
|||||||
# terraform-provider-decort
|
# terraform-provider-decort
|
||||||
|
|
||||||
Terraform provider for Digital Energy Cloud Orchestration Technology (DECORT) platform
|
Terraform provider for Digital Energy Cloud Orchestration Technology (DECORT) platform
|
||||||
|
|
||||||
NOTE: provider rc-1.25 is designed for DECORT API 3.7.x. For older API versions please use:
|
## Mapping of platform versions with provider versions
|
||||||
- DECORT API 3.6.x versions - provider version rc-1.10
|
|
||||||
- DECORT API versions prior to 3.6.0 - Terraform DECS provider (https://github.com/rudecs/terraform-provider-decs)
|
| DECORT API version | Terraform provider version |
|
||||||
|
| ------ | ------ |
|
||||||
|
| 3.8.5 | 3.4.x |
|
||||||
|
| 3.8.0 - 3.8.4 | 3.3.1 |
|
||||||
|
| 3.7.x | rc-1.25 |
|
||||||
|
| 3.6.x | rc-1.10 |
|
||||||
|
| до 3.6.0 | [terraform-provider-decs](https://github.com/rudecs/terraform-provider-decs) |
|
||||||
|
|
||||||
|
## Working modes
|
||||||
|
|
||||||
|
The provider support two working modes:
|
||||||
|
|
||||||
|
- User mode,
|
||||||
|
- Administator mode.
|
||||||
|
Use flag DECORT_ADMIN_MODE for swithcing beetwen modes.
|
||||||
|
See user guide at https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Work with Compute instances,
|
|
||||||
- Work with disks,
|
- Work with Compute instances,
|
||||||
|
- Work with disks,
|
||||||
- Work with k8s,
|
- Work with k8s,
|
||||||
- Work with image,
|
- Work with image,
|
||||||
- Work with reource groups,
|
- Work with reource groups,
|
||||||
@@ -19,21 +36,26 @@ NOTE: provider rc-1.25 is designed for DECORT API 3.7.x. For older API versions
|
|||||||
- Work with sep,
|
- Work with sep,
|
||||||
- Work with vgpu,
|
- Work with vgpu,
|
||||||
- Work with bservice,
|
- Work with bservice,
|
||||||
- Work with extnets.
|
- Work with extnets,
|
||||||
|
- Work with locations,
|
||||||
|
- Work with load balancers.
|
||||||
|
|
||||||
This provider supports Import operations on pre-existing resources.
|
This provider supports Import operations on pre-existing resources.
|
||||||
|
|
||||||
See user guide at https://github.com/rudecs/terraform-provider-decort/wiki
|
See user guide at https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
|
||||||
|
|
||||||
## Get Started
|
## Get Started
|
||||||
Two ways for starting:
|
|
||||||
|
Two ways for starting:
|
||||||
|
|
||||||
1. Installing via binary packages
|
1. Installing via binary packages
|
||||||
2. Manual installing
|
2. Manual installing
|
||||||
|
|
||||||
### Installing via binary packages
|
### Installing via binary packages
|
||||||
|
|
||||||
1. Download and install terraform: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
1. Download and install terraform: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
||||||
2. Create a file `main.tf` and add to it next section.
|
2. Create a file `main.tf` and add to it next section.
|
||||||
|
|
||||||
```terraform
|
```terraform
|
||||||
provider "decort" {
|
provider "decort" {
|
||||||
authenticator = "oauth2"
|
authenticator = "oauth2"
|
||||||
@@ -44,45 +66,62 @@ provider "decort" {
|
|||||||
allow_unverified_ssl = true
|
allow_unverified_ssl = true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Execute next command
|
3. Execute next command
|
||||||
|
|
||||||
```
|
```
|
||||||
terraform init
|
terraform init
|
||||||
```
|
```
|
||||||
|
|
||||||
The Provider will automatically install on your computer from the terrafrom registry.
|
The Provider will automatically install on your computer from the terrafrom registry.
|
||||||
|
|
||||||
### Manual installing
|
### Manual installing
|
||||||
|
|
||||||
1. Download and install Go Programming Language: https://go.dev/dl/
|
1. Download and install Go Programming Language: https://go.dev/dl/
|
||||||
2. Download and install terraform: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
2. Download and install terraform: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started
|
||||||
3. Clone provider's repo:
|
3. Clone provider's repo:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/rudecs/terraform-provider-decort.git
|
git clone https://github.com/rudecs/terraform-provider-decort.git
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Change directory to clone provider's and execute next command
|
4. Change directory to clone provider's and execute next command
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go build -o terraform-provider-decort
|
go build -o terraform-provider-decort
|
||||||
```
|
```
|
||||||
|
|
||||||
If you have experience with _makefile_, you can change `Makefile`'s paramters and execute next command
|
If you have experience with _makefile_, you can change `Makefile`'s paramters and execute next command
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make build
|
make build
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Now move compilled file to:
|
5. Now move compilled file to:
|
||||||
Linux:
|
Linux:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target}
|
~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target}
|
||||||
```
|
```
|
||||||
|
|
||||||
Windows:
|
Windows:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
%APPDATA%\terraform.d\plugins\${host_name}/${namespace}/${type}/${version}/${target}
|
%APPDATA%\terraform.d\plugins\${host_name}/${namespace}/${type}/${version}/${target}
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: for Windows OS `%APP_DATA%` is a cataloge, where will place terraform files.
|
NOTE: for Windows OS `%APP_DATA%` is a cataloge, where will place terraform files.
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
- host_name - digitalenergy.online
|
- host_name - digitalenergy.online
|
||||||
- namespace - decort
|
- namespace - decort
|
||||||
- type - decort
|
- type - decort
|
||||||
- version - 1.2
|
- version - 1.2
|
||||||
- target - windows_amd64
|
- target - windows_amd64
|
||||||
|
|
||||||
6. After all, create a file `main.tf`.
|
6. After all, create a file `main.tf`.
|
||||||
7. Add to the file next code section
|
7. Add to the file next code section
|
||||||
|
|
||||||
```terraform
|
```terraform
|
||||||
terraform {
|
terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
@@ -93,18 +132,22 @@ terraform {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`version`- field for provider's version
|
`version`- field for provider's version
|
||||||
Required
|
Required
|
||||||
String
|
String
|
||||||
Note: Versions in code section and in a repository must be equal!
|
Note: Versions in code section and in a repository must be equal!
|
||||||
|
|
||||||
`source` - path to repository with provider's version
|
`source` - path to repository with provider's version
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
${host_name}/${namespace}/${type}
|
${host_name}/${namespace}/${type}
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: all paramters must be equal to the repository path!
|
NOTE: all paramters must be equal to the repository path!
|
||||||
|
|
||||||
8. Execute command in your terminal
|
8. Execute command in your terminal
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
terraform init
|
terraform init
|
||||||
```
|
```
|
||||||
@@ -114,10 +157,12 @@ terraform init
|
|||||||
More details about the provider's building process: https://learn.hashicorp.com/tutorials/terraform/provider-use?in=terraform/providers
|
More details about the provider's building process: https://learn.hashicorp.com/tutorials/terraform/provider-use?in=terraform/providers
|
||||||
|
|
||||||
## Examples and Samples
|
## Examples and Samples
|
||||||
- Examples: https://github.com/rudecs/terraform-provider-decort/wiki
|
|
||||||
- Samples: see in repository `samples`
|
- Examples: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
|
- Samples: see in repository `samples`
|
||||||
|
|
||||||
Terraform schemas in:
|
Terraform schemas in:
|
||||||
- See in repository `docs`
|
|
||||||
|
- See in repository `docs`
|
||||||
|
|
||||||
Good work!
|
Good work!
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
Authors:
|
||||||
|
Petr Krutov, <petr.krutov@digitalenergy.online>
|
||||||
|
Stanislav Solovev, <spsolovev@digitalenergy.online>
|
||||||
|
Kasim Baybikov, <kmbaybikov@basistech.ru>
|
||||||
|
Tim Tkachev, <tvtkachev@basistech.ru>
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -19,12 +23,12 @@ limitations under the License.
|
|||||||
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
|
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
|
||||||
Orchestration Technology) with Terraform by Hashicorp.
|
Orchestration Technology) with Terraform by Hashicorp.
|
||||||
|
|
||||||
Source code: https://github.com/rudecs/terraform-provider-decort
|
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
|
||||||
|
|
||||||
Please see README.md to learn where to place source code so that it
|
Please see README.md to learn where to place source code so that it
|
||||||
builds seamlessly.
|
builds seamlessly.
|
||||||
|
|
||||||
Documentation: https://github.com/rudecs/terraform-provider-decort/wiki
|
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package main
|
||||||
@@ -32,10 +36,10 @@ package main
|
|||||||
import (
|
import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/plugin"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/terraform"
|
"github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
|
||||||
|
|
||||||
"github.com/rudecs/terraform-provider-decort/decort"
|
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/provider"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs
|
//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs
|
||||||
@@ -45,8 +49,8 @@ func main() {
|
|||||||
log.Debug("Debug logging enabled")
|
log.Debug("Debug logging enabled")
|
||||||
|
|
||||||
plugin.Serve(&plugin.ServeOpts{
|
plugin.Serve(&plugin.ServeOpts{
|
||||||
ProviderFunc: func() terraform.ResourceProvider {
|
ProviderFunc: func() *schema.Provider {
|
||||||
return decort.Provider()
|
return provider.Provider()
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func dataSourceAccountDeletedListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
accountDeletedList, err := utilityAccountDeletedListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenAccountList(accountDeletedList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountDeletedList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceAccountDeletedListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceAccountListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func flattenAccountDisksList(adl AccountDisksList) []map[string]interface{} {
|
|
||||||
res := make([]map[string]interface{}, 0)
|
|
||||||
for _, ad := range adl {
|
|
||||||
temp := map[string]interface{}{
|
|
||||||
"disk_id": ad.ID,
|
|
||||||
"disk_name": ad.Name,
|
|
||||||
"pool": ad.Pool,
|
|
||||||
"sep_id": ad.SepId,
|
|
||||||
"size_max": ad.SizeMax,
|
|
||||||
"type": ad.Type,
|
|
||||||
}
|
|
||||||
res = append(res, temp)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountDisksListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
accountDisksList, err := utilityAccountDisksListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenAccountDisksList(accountDisksList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountDisksListSchemaMake() map[string]*schema.Schema {
|
|
||||||
res := map[string]*schema.Schema{
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "ID of the account",
|
|
||||||
},
|
|
||||||
"items": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Search Result",
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"disk_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"disk_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"pool": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"size_max": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountDisksList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceAccountDisksListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceAccountDisksListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,306 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func flattenAccountList(al AccountCloudApiList) []map[string]interface{} {
|
|
||||||
res := make([]map[string]interface{}, 0)
|
|
||||||
for _, acc := range al {
|
|
||||||
temp := map[string]interface{}{
|
|
||||||
"acl": flattenRgAcl(acc.Acl),
|
|
||||||
"created_time": acc.CreatedTime,
|
|
||||||
"deleted_time": acc.DeletedTime,
|
|
||||||
"account_id": acc.ID,
|
|
||||||
"account_name": acc.Name,
|
|
||||||
"status": acc.Status,
|
|
||||||
"updated_time": acc.UpdatedTime,
|
|
||||||
}
|
|
||||||
res = append(res, temp)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
func flattenAccountList(al AccountList) []map[string]interface{} {
|
|
||||||
res := make([]map[string]interface{}, 0)
|
|
||||||
for _, acc := range al {
|
|
||||||
temp := map[string]interface{}{
|
|
||||||
"dc_location": acc.DCLocation,
|
|
||||||
"ckey": acc.CKey,
|
|
||||||
"meta": flattenMeta(acc.Meta),
|
|
||||||
|
|
||||||
"acl": flattenRgAcl(acc.Acl),
|
|
||||||
|
|
||||||
"company": acc.Company,
|
|
||||||
"companyurl": acc.CompanyUrl,
|
|
||||||
"created_by": acc.CreatedBy,
|
|
||||||
|
|
||||||
"created_time": acc.CreatedTime,
|
|
||||||
|
|
||||||
"deactivation_time": acc.DeactiovationTime,
|
|
||||||
"deleted_by": acc.DeletedBy,
|
|
||||||
|
|
||||||
"deleted_time": acc.DeletedTime,
|
|
||||||
|
|
||||||
"displayname": acc.DisplayName,
|
|
||||||
"guid": acc.GUID,
|
|
||||||
|
|
||||||
"account_id": acc.ID,
|
|
||||||
"account_name": acc.Name,
|
|
||||||
|
|
||||||
"resource_limits": flattenRgResourceLimits(acc.ResourceLimits),
|
|
||||||
"send_access_emails": acc.SendAccessEmails,
|
|
||||||
"service_account": acc.ServiceAccount,
|
|
||||||
|
|
||||||
"status": acc.Status,
|
|
||||||
"updated_time": acc.UpdatedTime,
|
|
||||||
|
|
||||||
"version": acc.Version,
|
|
||||||
"vins": acc.Vins,
|
|
||||||
|
|
||||||
}
|
|
||||||
res = append(res, temp)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func dataSourceAccountListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
accountList, err := utilityAccountListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenAccountList(accountList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountListSchemaMake() map[string]*schema.Schema {
|
|
||||||
res := map[string]*schema.Schema{
|
|
||||||
"page": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Page number",
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Page size",
|
|
||||||
},
|
|
||||||
"items": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"dc_location": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ckey": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},*/
|
|
||||||
"acl": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"explicit": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"right": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"user_group_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"company": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"companyurl": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
"created_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"deactivation_time": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
"deleted_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"displayname": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"resource_limits": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"cu_c": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_d": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_i": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_m": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_np": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gpu_units": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"send_access_emails": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"service_account": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
"version": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"vins": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceAccountList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceAccountListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceAccountListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func dataSourceBasicServiceDeletedListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
basicServiceDeletedList, err := utilityBasicServiceDeletedListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenBasicServiceList(basicServiceDeletedList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceBasicServiceDeletedList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceBasicServiceDeletedListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceBasicServiceListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
// "net/url"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
func flattenDisk(d *schema.ResourceData, disk_facts string) error {
|
|
||||||
// This function expects disk_facts string to contain a response from disks/get API
|
|
||||||
//
|
|
||||||
// NOTE: this function modifies ResourceData argument - as such it should never be called
|
|
||||||
// from resourceDiskExists(...) method. Use utilityDiskCheckPresence instead.
|
|
||||||
|
|
||||||
log.Debugf("flattenDisk: ready to unmarshal string %s", disk_facts)
|
|
||||||
|
|
||||||
model := DiskRecord{}
|
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(disk_facts), &model)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("flattenDisk: disk ID %d, disk AccountID %d", model.ID, model.AccountID)
|
|
||||||
|
|
||||||
d.SetId(fmt.Sprintf("%d", model.ID))
|
|
||||||
// d.Set("disk_id", model.ID) - we should NOT update disk_id in the schema. If it was set - it is already set, if it wasn't - we shouldn't
|
|
||||||
d.Set("name", model.Name)
|
|
||||||
d.Set("account_id", model.AccountID)
|
|
||||||
d.Set("account_name", model.AccountName)
|
|
||||||
d.Set("size", model.SizeMax)
|
|
||||||
// d.Set("sizeUsed", model.SizeUsed)
|
|
||||||
d.Set("type", model.Type)
|
|
||||||
d.Set("image_id", model.ImageID)
|
|
||||||
d.Set("sep_id", model.SepID)
|
|
||||||
d.Set("sep_type", model.SepType)
|
|
||||||
d.Set("pool", model.Pool)
|
|
||||||
// d.Set("compute_id", model.ComputeID)
|
|
||||||
|
|
||||||
d.Set("description", model.Desc)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceDiskRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
disk_facts, err := utilityDiskCheckPresence(d, m)
|
|
||||||
if disk_facts == "" {
|
|
||||||
// if empty string is returned from utilityDiskCheckPresence then there is no
|
|
||||||
// such Disk and err tells so - just return it to the calling party
|
|
||||||
d.SetId("") // ensure ID is empty
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return flattenDisk(d, disk_facts)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceDiskSchemaMake() map[string]*schema.Schema {
|
|
||||||
rets := map[string]*schema.Schema{
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Name of this disk. NOTE: disk names are NOT unique within an account. If disk ID is specified, disk name is ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"disk_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "ID of the disk to get. If disk ID is specified, then disk name and account ID are ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "ID of the account this disk belongs to. If disk ID is specified, then account ID is ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
// The rest of the data source Disk schema are all computed
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Storage end-point provider serving this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"pool": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Pool where this disk is located.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Size of the disk in GB.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Type of this disk. E.g. D for data disks, B for boot.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"description": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "User-defined text description of this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Name of the account this disk belongs to. If account ID is specified, account name is ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"image_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "ID of the image, which this disk was cloned from (valid for disk clones only).",
|
|
||||||
},
|
|
||||||
|
|
||||||
"sep_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Type of the storage end-point provider serving this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
"snapshots": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource {
|
|
||||||
Schema: snapshotSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "List of user-created snapshots for this disk."
|
|
||||||
},
|
|
||||||
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Current model status of this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"tech_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Current technical status of this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"compute_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "ID of the compute instance where this disk is attached to, or 0 for unattached disk.",
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
return rets
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceDisk() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceDiskRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceDiskSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func dataSourceExtnetDefaultRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
extnetId, err := utilityExtnetDefaultCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
extnetIdInt, err := strconv.ParseInt(extnetId, 10, 32)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.Set("net_id", extnetIdInt)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceExtnetDefaultSchemaMake() map[string]*schema.Schema {
|
|
||||||
res := map[string]*schema.Schema{
|
|
||||||
"net_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceExtnetDefault() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceExtnetDefaultRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceExtnetDefaultSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func flattenExtnetList(el ExtnetList) []map[string]interface{} {
|
|
||||||
res := make([]map[string]interface{}, 0)
|
|
||||||
for _, e := range el {
|
|
||||||
temp := map[string]interface{}{
|
|
||||||
"net_id": e.ID,
|
|
||||||
"ipcidr": e.IPCidr,
|
|
||||||
"name": e.Name,
|
|
||||||
}
|
|
||||||
res = append(res, temp)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceExtnetListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
extnetList, err := utilityExtnetListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenExtnetList(extnetList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
|
|
||||||
res := map[string]*schema.Schema{
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "filter by account ID",
|
|
||||||
},
|
|
||||||
"page": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Page number",
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Page size",
|
|
||||||
},
|
|
||||||
"items": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"net_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ipcidr": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceExtnetList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceExtnetListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceExtnetListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func flattenImageList(il ImageList) []map[string]interface{} {
|
|
||||||
res := make([]map[string]interface{}, 0)
|
|
||||||
for _, item := range il {
|
|
||||||
temp := map[string]interface{}{
|
|
||||||
"name": item.Name,
|
|
||||||
"url": item.Url,
|
|
||||||
"gid": item.Gid,
|
|
||||||
"guid": item.Guid,
|
|
||||||
"drivers": item.Drivers,
|
|
||||||
"image_id": item.ImageId,
|
|
||||||
"boot_type": item.Boottype,
|
|
||||||
"bootable": item.Bootable,
|
|
||||||
"image_type": item.Imagetype,
|
|
||||||
"status": item.Status,
|
|
||||||
"tech_status": item.TechStatus,
|
|
||||||
"version": item.Version,
|
|
||||||
"username": item.Username,
|
|
||||||
"username_dl": item.UsernameDL,
|
|
||||||
"password": item.Password,
|
|
||||||
"password_dl": item.PasswordDL,
|
|
||||||
"purge_attempts": item.PurgeAttempts,
|
|
||||||
"architecture": item.Architecture,
|
|
||||||
"account_id": item.AccountId,
|
|
||||||
"computeci_id": item.ComputeciId,
|
|
||||||
"enabled": item.Enabled,
|
|
||||||
"reference_id": item.ReferenceId,
|
|
||||||
"res_id": item.ResId,
|
|
||||||
"res_name": item.ResName,
|
|
||||||
"rescuecd": item.Rescuecd,
|
|
||||||
"provider_name": item.ProviderName,
|
|
||||||
"milestones": item.Milestones,
|
|
||||||
"size": item.Size,
|
|
||||||
"sep_id": item.SepId,
|
|
||||||
"link_to": item.LinkTo,
|
|
||||||
"unc_path": item.UNCPath,
|
|
||||||
"pool_name": item.PoolName,
|
|
||||||
"hot_resize": item.Hotresize,
|
|
||||||
"history": flattenHistory(item.History),
|
|
||||||
"last_modified": item.LastModified,
|
|
||||||
"meta": flattenMeta(item.Meta),
|
|
||||||
"desc": item.Desc,
|
|
||||||
"shared_with": item.SharedWith,
|
|
||||||
}
|
|
||||||
res = append(res, temp)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceImageListRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
imageList, err := utilityImageListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
d.Set("items", flattenImageList(imageList))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceImageListSchemaMake() map[string]*schema.Schema {
|
|
||||||
rets := map[string]*schema.Schema{
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "filter images by storage endpoint provider ID",
|
|
||||||
},
|
|
||||||
"shared_with": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "filter images by account ID availability",
|
|
||||||
},
|
|
||||||
"page": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "page number",
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "page size",
|
|
||||||
},
|
|
||||||
"items": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Description: "image list",
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: dataSourceImageSchemaMake(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return rets
|
|
||||||
}
|
|
||||||
|
|
||||||
func dataSourceImageList() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Read: dataSourceImageListRead,
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: dataSourceImageListSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1486
decort/models_api.go
1486
decort/models_api.go
File diff suppressed because it is too large
Load Diff
@@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
|
|
||||||
func nodeMasterDefault() K8sNodeRecord {
|
|
||||||
return K8sNodeRecord{
|
|
||||||
Num: 1,
|
|
||||||
Cpu: 2,
|
|
||||||
Ram: 2048,
|
|
||||||
Disk: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func nodeWorkerDefault() K8sNodeRecord {
|
|
||||||
return K8sNodeRecord{
|
|
||||||
Num: 1,
|
|
||||||
Cpu: 1,
|
|
||||||
Ram: 1024,
|
|
||||||
Disk: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseNode(nodeList []interface{}) K8sNodeRecord {
|
|
||||||
node := nodeList[0].(map[string]interface{})
|
|
||||||
|
|
||||||
return K8sNodeRecord{
|
|
||||||
Num: node["num"].(int),
|
|
||||||
Cpu: node["cpu"].(int),
|
|
||||||
Ram: node["ram"].(int),
|
|
||||||
Disk: node["disk"].(int),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func nodeToResource(node K8sNodeRecord) []interface{} {
|
|
||||||
mp := make(map[string]interface{})
|
|
||||||
|
|
||||||
mp["num"] = node.Num
|
|
||||||
mp["cpu"] = node.Cpu
|
|
||||||
mp["ram"] = node.Ram
|
|
||||||
mp["disk"] = node.Disk
|
|
||||||
|
|
||||||
return []interface{}{mp}
|
|
||||||
}
|
|
||||||
|
|
||||||
func nodeK8sSubresourceSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"num": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "Number of nodes to create.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Node CPU count.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Node RAM in MB.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"disk": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Node boot disk size in GB.",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/terraform"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Provider() *schema.Provider {
|
|
||||||
return &schema.Provider{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"authenticator": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
StateFunc: stateFuncToLower,
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{"oauth2", "legacy", "jwt"}, true), // ignore case while validating
|
|
||||||
Description: "Authentication mode to use when connecting to DECORT cloud API. Should be one of 'oauth2', 'legacy' or 'jwt'.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"oauth2_url": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
StateFunc: stateFuncToLower,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_OAUTH2_URL", nil),
|
|
||||||
Description: "OAuth2 application URL in 'oauth2' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"controller_url": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
StateFunc: stateFuncToLower,
|
|
||||||
Description: "URL of DECORT Cloud controller to use. API calls will be directed to this URL.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"user": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_USER", nil),
|
|
||||||
Description: "User name for DECORT cloud API operations in 'legacy' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"password": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_PASSWORD", nil),
|
|
||||||
Description: "User password for DECORT cloud API operations in 'legacy' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"app_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_APP_ID", nil),
|
|
||||||
Description: "Application ID to access DECORT cloud API in 'oauth2' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"app_secret": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_APP_SECRET", nil),
|
|
||||||
Description: "Application secret to access DECORT cloud API in 'oauth2' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"jwt": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
DefaultFunc: schema.EnvDefaultFunc("DECORT_JWT", nil),
|
|
||||||
Description: "JWT to access DECORT cloud API in 'jwt' authentication mode.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"allow_unverified_ssl": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "If true, DECORT API will not verify SSL certificates. Use this with caution and in trusted environments only!",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
ResourcesMap: map[string]*schema.Resource{
|
|
||||||
"decort_resgroup": resourceResgroup(),
|
|
||||||
"decort_kvmvm": resourceCompute(),
|
|
||||||
"decort_disk": resourceDisk(),
|
|
||||||
"decort_vins": resourceVins(),
|
|
||||||
"decort_pfw": resourcePfw(),
|
|
||||||
"decort_k8s": resourceK8s(),
|
|
||||||
"decort_k8s_wg": resourceK8sWg(),
|
|
||||||
"decort_image": resourceImage(),
|
|
||||||
"decort_virtual_image": resourceVirtualImage(),
|
|
||||||
"decort_cdrom_image": resourceCDROMImage(),
|
|
||||||
"decort_delete_images": resourceDeleteImages(),
|
|
||||||
"decort_snapshot": resourceSnapshot(),
|
|
||||||
"decort_pcidevice": resourcePcidevice(),
|
|
||||||
"decort_sep": resourceSep(),
|
|
||||||
"decort_sep_config": resourceSepConfig(),
|
|
||||||
"decort_account": resourceAccount(),
|
|
||||||
"decort_bservice": resourceBasicService(),
|
|
||||||
"decort_bservice_group": resourceBasicServiceGroup(),
|
|
||||||
},
|
|
||||||
|
|
||||||
DataSourcesMap: map[string]*schema.Resource{
|
|
||||||
"decort_account": dataSourceAccount(),
|
|
||||||
"decort_resgroup": dataSourceResgroup(),
|
|
||||||
"decort_kvmvm": dataSourceCompute(),
|
|
||||||
"decort_image": dataSourceImage(),
|
|
||||||
"decort_disk": dataSourceDisk(),
|
|
||||||
"decort_vins": dataSourceVins(),
|
|
||||||
"decort_grid": dataSourceGrid(),
|
|
||||||
"decort_grid_list": dataSourceGridList(),
|
|
||||||
"decort_image_list": dataSourceImageList(),
|
|
||||||
"decort_image_list_stacks": dataSourceImageListStacks(),
|
|
||||||
"decort_snapshot_list": dataSourceSnapshotList(),
|
|
||||||
"decort_vgpu": dataSourceVGPU(),
|
|
||||||
"decort_pcidevice": dataSourcePcidevice(),
|
|
||||||
"decort_pcidevice_list": dataSourcePcideviceList(),
|
|
||||||
"decort_sep_list": dataSourceSepList(),
|
|
||||||
"decort_sep": dataSourceSep(),
|
|
||||||
"decort_sep_consumption": dataSourceSepConsumption(),
|
|
||||||
"decort_sep_disk_list": dataSourceSepDiskList(),
|
|
||||||
"decort_sep_config": dataSourceSepConfig(),
|
|
||||||
"decort_sep_pool": dataSourceSepPool(),
|
|
||||||
"decort_disk_list": dataSourceDiskList(),
|
|
||||||
"decort_rg_list": dataSourceRgList(),
|
|
||||||
"decort_account_list": dataSourceAccountList(),
|
|
||||||
"decort_account_computes_list": dataSourceAccountComputesList(),
|
|
||||||
"decort_account_disks_list": dataSourceAccountDisksList(),
|
|
||||||
"decort_account_vins_list": dataSourceAccountVinsList(),
|
|
||||||
"decort_account_audits_list": dataSourceAccountAuditsList(),
|
|
||||||
"decort_account_rg_list": dataSourceAccountRGList(),
|
|
||||||
"decort_account_consumed_units": dataSourceAccountConsumedUnits(),
|
|
||||||
"decort_account_consumed_units_by_type": dataSourceAccountConsumedUnitsByType(),
|
|
||||||
"decort_account_reserved_units": dataSourceAccountReservedUnits(),
|
|
||||||
"decort_account_templates_list": dataSourceAccountTemplatessList(),
|
|
||||||
"decort_account_deleted_list": dataSourceAccountDeletedList(),
|
|
||||||
"decort_account_flipgroups_list": dataSourceAccountFlipGroupsList(),
|
|
||||||
"decort_bservice_list": dataSourceBasicServiceList(),
|
|
||||||
"decort_bservice": dataSourceBasicService(),
|
|
||||||
"decort_bservice_snapshot_list": dataSourceBasicServiceSnapshotList(),
|
|
||||||
"decort_bservice_group": dataSourceBasicServiceGroup(),
|
|
||||||
"decort_bservice_deleted_list": dataSourceBasicServiceDeletedList(),
|
|
||||||
"decort_extnet_list": dataSourceExtnetList(),
|
|
||||||
"decort_extnet_computes_list": dataSourceExtnetComputesList(),
|
|
||||||
"decort_extnet": dataSourceExtnet(),
|
|
||||||
"decort_extnet_default": dataSourceExtnetDefault(),
|
|
||||||
"decort_vins_list": dataSourceVinsList(),
|
|
||||||
// "decort_pfw": dataSourcePfw(),
|
|
||||||
},
|
|
||||||
|
|
||||||
ConfigureFunc: providerConfigure,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func stateFuncToLower(argval interface{}) string {
|
|
||||||
return strings.ToLower(argval.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
func stateFuncToUpper(argval interface{}) string {
|
|
||||||
return strings.ToUpper(argval.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
func providerConfigure(d *schema.ResourceData) (interface{}, error) {
|
|
||||||
decsController, err := ControllerConfigure(d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize global default Grid ID - it will be needed to create some resource types, e.g. disks
|
|
||||||
gridId, err := decsController.utilityLocationGetDefaultGridID()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if gridId == 0 {
|
|
||||||
return nil, fmt.Errorf("providerConfigure: invalid default Grid ID = 0")
|
|
||||||
}
|
|
||||||
|
|
||||||
return decsController, nil
|
|
||||||
}
|
|
||||||
@@ -1,794 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceAccountCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceAccountCreate")
|
|
||||||
|
|
||||||
if accountId, ok := d.GetOk("account_id"); ok {
|
|
||||||
if exists, err := resourceAccountExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId(strconv.Itoa(accountId.(int)))
|
|
||||||
err = resourceAccountRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided account id does not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("name", d.Get("account_name").(string))
|
|
||||||
urlValues.Add("username", d.Get("username").(string))
|
|
||||||
|
|
||||||
if emailaddress, ok := d.GetOk("emailaddress"); ok {
|
|
||||||
urlValues.Add("emailaddress", emailaddress.(string))
|
|
||||||
}
|
|
||||||
if sendAccessEmails, ok := d.GetOk("send_access_emails"); ok {
|
|
||||||
urlValues.Add("sendAccessEmails", strconv.FormatBool(sendAccessEmails.(bool)))
|
|
||||||
}
|
|
||||||
if resLimits, ok := d.GetOk("resource_limits"); ok {
|
|
||||||
resLimit := resLimits.([]interface{})[0]
|
|
||||||
resLimitConv := resLimit.(map[string]interface{})
|
|
||||||
if resLimitConv["cu_m"] != nil {
|
|
||||||
maxMemCap := int(resLimitConv["cu_m"].(float64))
|
|
||||||
if maxMemCap == 0 {
|
|
||||||
urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_d"] != nil {
|
|
||||||
maxDiskCap := int(resLimitConv["cu_d"].(float64))
|
|
||||||
if maxDiskCap == 0 {
|
|
||||||
urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_c"] != nil {
|
|
||||||
maxCPUCap := int(resLimitConv["cu_c"].(float64))
|
|
||||||
if maxCPUCap == 0 {
|
|
||||||
urlValues.Add("maxCPUCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_i"] != nil {
|
|
||||||
maxNumPublicIP := int(resLimitConv["cu_i"].(float64))
|
|
||||||
if maxNumPublicIP == 0 {
|
|
||||||
urlValues.Add("maxNumPublicIP", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_np"] != nil {
|
|
||||||
maxNP := int(resLimitConv["cu_np"].(float64))
|
|
||||||
if maxNP == 0 {
|
|
||||||
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["gpu_units"] != nil {
|
|
||||||
gpuUnits := int(resLimitConv["gpu_units"].(float64))
|
|
||||||
if gpuUnits == 0 {
|
|
||||||
urlValues.Add("gpu_units", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("gpu_units", strconv.Itoa(gpuUnits))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
accountId, err := controller.decortAPICall("POST", accountCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(accountId)
|
|
||||||
d.Set("account_id", accountId)
|
|
||||||
|
|
||||||
err = resourceAccountRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(id.String())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccountRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceAccountRead")
|
|
||||||
|
|
||||||
acc, err := utilityAccountCheckPresence(d, m)
|
|
||||||
if acc == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("dc_location", acc.DCLocation)
|
|
||||||
d.Set("resources", flattenAccResources(acc.Resources))
|
|
||||||
d.Set("ckey", acc.CKey)
|
|
||||||
d.Set("meta", flattenMeta(acc.Meta))
|
|
||||||
d.Set("acl", flattenAccAcl(acc.Acl))
|
|
||||||
d.Set("company", acc.Company)
|
|
||||||
d.Set("companyurl", acc.CompanyUrl)
|
|
||||||
d.Set("created_by", acc.CreatedBy)
|
|
||||||
d.Set("created_time", acc.CreatedTime)
|
|
||||||
d.Set("deactivation_time", acc.DeactiovationTime)
|
|
||||||
d.Set("deleted_by", acc.DeletedBy)
|
|
||||||
d.Set("deleted_time", acc.DeletedTime)
|
|
||||||
d.Set("displayname", acc.DisplayName)
|
|
||||||
d.Set("guid", acc.GUID)
|
|
||||||
d.Set("account_id", acc.ID)
|
|
||||||
d.Set("account_name", acc.Name)
|
|
||||||
d.Set("resource_limits", flattenRgResourceLimits(acc.ResourceLimits))
|
|
||||||
d.Set("send_access_emails", acc.SendAccessEmails)
|
|
||||||
d.Set("service_account", acc.ServiceAccount)
|
|
||||||
d.Set("status", acc.Status)
|
|
||||||
d.Set("updated_time", acc.UpdatedTime)
|
|
||||||
d.Set("version", acc.Version)
|
|
||||||
d.Set("vins", acc.Vins)
|
|
||||||
d.Set("vinses", acc.Vinses)
|
|
||||||
d.Set("computes", flattenAccComputes(acc.Computes))
|
|
||||||
d.Set("machines", flattenAccMachines(acc.Machines))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccountDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceAccountDelete")
|
|
||||||
|
|
||||||
account, err := utilityAccountCheckPresence(d, m)
|
|
||||||
if account == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool)))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", accountDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccountExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceAccountExists")
|
|
||||||
|
|
||||||
account, err := utilityAccountCheckPresence(d, m)
|
|
||||||
if account == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccountEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceAccountEdit")
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
if d.HasChange("enable") {
|
|
||||||
api := accountDisableAPI
|
|
||||||
enable := d.Get("enable").(bool)
|
|
||||||
if enable {
|
|
||||||
api = accountEnableAPI
|
|
||||||
}
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("account_name") {
|
|
||||||
urlValues.Add("name", d.Get("account_name").(string))
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", accountUpdateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
if d.HasChange("resource_limits") {
|
|
||||||
resLimit := d.Get("resource_limits").([]interface{})[0]
|
|
||||||
resLimitConv := resLimit.(map[string]interface{})
|
|
||||||
|
|
||||||
if resLimitConv["cu_m"] != nil {
|
|
||||||
maxMemCap := int(resLimitConv["cu_m"].(float64))
|
|
||||||
if maxMemCap == 0 {
|
|
||||||
urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_d"] != nil {
|
|
||||||
maxDiskCap := int(resLimitConv["cu_d"].(float64))
|
|
||||||
if maxDiskCap == 0 {
|
|
||||||
urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_c"] != nil {
|
|
||||||
maxCPUCap := int(resLimitConv["cu_c"].(float64))
|
|
||||||
if maxCPUCap == 0 {
|
|
||||||
urlValues.Add("maxCPUCapacity", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_i"] != nil {
|
|
||||||
maxNumPublicIP := int(resLimitConv["cu_i"].(float64))
|
|
||||||
if maxNumPublicIP == 0 {
|
|
||||||
urlValues.Add("maxNumPublicIP", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["cu_np"] != nil {
|
|
||||||
maxNP := int(resLimitConv["cu_np"].(float64))
|
|
||||||
if maxNP == 0 {
|
|
||||||
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if resLimitConv["gpu_units"] != nil {
|
|
||||||
gpuUnits := int(resLimitConv["gpu_units"].(float64))
|
|
||||||
if gpuUnits == 0 {
|
|
||||||
urlValues.Add("gpu_units", strconv.Itoa(-1))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("gpu_units", strconv.Itoa(gpuUnits))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", accountUpdateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("send_access_emails") {
|
|
||||||
urlValues.Add("sendAccessEmails", strconv.FormatBool(d.Get("send_access_emails").(bool)))
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", accountUpdateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("restore") {
|
|
||||||
restore := d.Get("restore").(bool)
|
|
||||||
if restore {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", accountRestoreAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("users") {
|
|
||||||
deletedUsers := make([]interface{}, 0)
|
|
||||||
addedUsers := make([]interface{}, 0)
|
|
||||||
updatedUsers := make([]interface{}, 0)
|
|
||||||
|
|
||||||
old, new := d.GetChange("users")
|
|
||||||
oldConv := old.([]interface{})
|
|
||||||
newConv := new.([]interface{})
|
|
||||||
for _, el := range oldConv {
|
|
||||||
if !isContainsUser(newConv, el) {
|
|
||||||
deletedUsers = append(deletedUsers, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, el := range newConv {
|
|
||||||
if !isContainsUser(oldConv, el) {
|
|
||||||
addedUsers = append(addedUsers, el)
|
|
||||||
} else {
|
|
||||||
if isChangedUser(oldConv, el) {
|
|
||||||
updatedUsers = append(updatedUsers, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(deletedUsers) > 0 {
|
|
||||||
for _, user := range deletedUsers {
|
|
||||||
userConv := user.(map[string]interface{})
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("userId", userConv["user_id"].(string))
|
|
||||||
urlValues.Add("recursivedelete", strconv.FormatBool(userConv["recursive_delete"].(bool)))
|
|
||||||
_, err := c.decortAPICall("POST", accountDeleteUserAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(addedUsers) > 0 {
|
|
||||||
for _, user := range addedUsers {
|
|
||||||
userConv := user.(map[string]interface{})
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("userId", userConv["user_id"].(string))
|
|
||||||
urlValues.Add("accesstype", strings.ToUpper(userConv["access_type"].(string)))
|
|
||||||
_, err := c.decortAPICall("POST", accountAddUserAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(updatedUsers) > 0 {
|
|
||||||
for _, user := range updatedUsers {
|
|
||||||
userConv := user.(map[string]interface{})
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("userId", userConv["user_id"].(string))
|
|
||||||
urlValues.Add("accesstype", strings.ToUpper(userConv["access_type"].(string)))
|
|
||||||
_, err := c.decortAPICall("POST", accountUpdateUserAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isContainsUser(els []interface{}, el interface{}) bool {
|
|
||||||
for _, elOld := range els {
|
|
||||||
elOldConv := elOld.(map[string]interface{})
|
|
||||||
elConv := el.(map[string]interface{})
|
|
||||||
if elOldConv["user_id"].(string) == elConv["user_id"].(string) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func isChangedUser(els []interface{}, el interface{}) bool {
|
|
||||||
for _, elOld := range els {
|
|
||||||
elOldConv := elOld.(map[string]interface{})
|
|
||||||
elConv := el.(map[string]interface{})
|
|
||||||
if elOldConv["user_id"].(string) == elConv["user_id"].(string) &&
|
|
||||||
(!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string)) ||
|
|
||||||
elOldConv["recursive_delete"].(bool) != elConv["recursive_delete"].(bool)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccountSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "account name",
|
|
||||||
},
|
|
||||||
"username": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "username of owner the account",
|
|
||||||
},
|
|
||||||
"emailaddress": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Description: "email",
|
|
||||||
},
|
|
||||||
"send_access_emails": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: true,
|
|
||||||
Description: "if true send emails when a user is granted access to resources",
|
|
||||||
},
|
|
||||||
"users": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"user_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"access_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"recursive_delete": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"restore": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Description: "restore a deleted account",
|
|
||||||
},
|
|
||||||
"permanently": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "whether to completely delete the account",
|
|
||||||
},
|
|
||||||
"enable": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Description: "enable/disable account",
|
|
||||||
},
|
|
||||||
"resource_limits": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"cu_c": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_d": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_i": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_m": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"cu_np": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gpu_units": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"dc_location": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"current": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"disksize": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"extips": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"exttraffic": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"reserved": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"disksize": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"extips": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"exttraffic": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"ckey": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"acl": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"can_be_deleted": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"explicit": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"right": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"user_group_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"company": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"companyurl": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deactivation_time": {
|
|
||||||
Type: schema.TypeFloat,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"displayname": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"service_account": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"version": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"vins": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"computes": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"started": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"stopped": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"machines": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"halted": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"running": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"vinses": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceAccount() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceAccountCreate,
|
|
||||||
Read: resourceAccountRead,
|
|
||||||
Update: resourceAccountEdit,
|
|
||||||
Delete: resourceAccountDelete,
|
|
||||||
Exists: resourceAccountExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceAccountSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,554 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceBasicServiceCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceCreate")
|
|
||||||
|
|
||||||
if serviceId, ok := d.GetOk("service_id"); ok {
|
|
||||||
if exists, err := resourceBasicServiceExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(strconv.Itoa(serviceId.(int)))
|
|
||||||
d.Set("service_id", strconv.Itoa(serviceId.(int)))
|
|
||||||
err = resourceBasicServiceRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId(id.String())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided service id does not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("name", d.Get("service_name").(string))
|
|
||||||
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
|
|
||||||
|
|
||||||
if sshKey, ok := d.GetOk("ssh_key"); ok {
|
|
||||||
urlValues.Add("sshKey", sshKey.(string))
|
|
||||||
}
|
|
||||||
if sshUser, ok := d.GetOk("ssh_user"); ok {
|
|
||||||
urlValues.Add("sshUser", sshUser.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
serviceId, err := controller.decortAPICall("POST", bserviceCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(serviceId)
|
|
||||||
d.Set("service_id", serviceId)
|
|
||||||
|
|
||||||
err = resourceBasicServiceRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(id.String())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceRead")
|
|
||||||
|
|
||||||
bs, err := utilityBasicServiceCheckPresence(d, m)
|
|
||||||
if bs == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("account_id", bs.AccountId)
|
|
||||||
d.Set("account_name", bs.AccountName)
|
|
||||||
d.Set("base_domain", bs.BaseDomain)
|
|
||||||
d.Set("computes", flattenBasicServiceComputes(bs.Computes))
|
|
||||||
d.Set("cpu_total", bs.CPUTotal)
|
|
||||||
d.Set("created_by", bs.CreatedBy)
|
|
||||||
d.Set("created_time", bs.CreatedTime)
|
|
||||||
d.Set("deleted_by", bs.DeletedBy)
|
|
||||||
d.Set("deleted_time", bs.DeletedTime)
|
|
||||||
d.Set("disk_total", bs.DiskTotal)
|
|
||||||
d.Set("gid", bs.GID)
|
|
||||||
d.Set("groups", bs.Groups)
|
|
||||||
d.Set("groups_name", bs.GroupsName)
|
|
||||||
d.Set("guid", bs.GUID)
|
|
||||||
d.Set("milestones", bs.Milestones)
|
|
||||||
d.Set("service_name", bs.Name)
|
|
||||||
d.Set("service_id", bs.ID)
|
|
||||||
d.Set("parent_srv_id", bs.ParentSrvId)
|
|
||||||
d.Set("parent_srv_type", bs.ParentSrvType)
|
|
||||||
d.Set("ram_total", bs.RamTotal)
|
|
||||||
d.Set("rg_id", bs.RGID)
|
|
||||||
d.Set("rg_name", bs.RGName)
|
|
||||||
d.Set("snapshots", flattenBasicServiceSnapshots(bs.Snapshots))
|
|
||||||
d.Set("ssh_key", bs.SSHKey)
|
|
||||||
d.Set("ssh_user", bs.SSHUser)
|
|
||||||
d.Set("status", bs.Status)
|
|
||||||
d.Set("tech_status", bs.TechStatus)
|
|
||||||
d.Set("updated_by", bs.UpdatedBy)
|
|
||||||
d.Set("updated_time", bs.UpdatedTime)
|
|
||||||
d.Set("user_managed", bs.UserManaged)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceDelete")
|
|
||||||
|
|
||||||
bs, err := utilityBasicServiceCheckPresence(d, m)
|
|
||||||
if bs == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool)))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", bserviceDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceBasicServiceExists")
|
|
||||||
|
|
||||||
bservice, err := utilityBasicServiceCheckPresence(d, m)
|
|
||||||
if bservice == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceEdit")
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
if d.HasChange("enable") {
|
|
||||||
api := bserviceDisableAPI
|
|
||||||
enable := d.Get("enable").(bool)
|
|
||||||
if enable {
|
|
||||||
api = bserviceEnableAPI
|
|
||||||
}
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("restore") {
|
|
||||||
restore := d.Get("restore").(bool)
|
|
||||||
if restore {
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceRestoreAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("start") {
|
|
||||||
api := bserviceStopAPI
|
|
||||||
start := d.Get("start").(bool)
|
|
||||||
if start {
|
|
||||||
api = bserviceStartAPI
|
|
||||||
}
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("snapshots") {
|
|
||||||
deletedSnapshots := make([]interface{}, 0)
|
|
||||||
addedSnapshots := make([]interface{}, 0)
|
|
||||||
updatedSnapshots := make([]interface{}, 0)
|
|
||||||
|
|
||||||
old, new := d.GetChange("snapshots")
|
|
||||||
oldConv := old.([]interface{})
|
|
||||||
newConv := new.([]interface{})
|
|
||||||
for _, el := range oldConv {
|
|
||||||
if !isContainsSnapshot(newConv, el) {
|
|
||||||
deletedSnapshots = append(deletedSnapshots, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, el := range newConv {
|
|
||||||
if !isContainsSnapshot(oldConv, el) {
|
|
||||||
addedSnapshots = append(addedSnapshots, el)
|
|
||||||
} else {
|
|
||||||
if isRollback(oldConv, el) {
|
|
||||||
updatedSnapshots = append(updatedSnapshots, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(deletedSnapshots) > 0 {
|
|
||||||
for _, snapshot := range deletedSnapshots {
|
|
||||||
snapshotConv := snapshot.(map[string]interface{})
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("label", snapshotConv["label"].(string))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceSnapshotDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(addedSnapshots) > 0 {
|
|
||||||
for _, snapshot := range addedSnapshots {
|
|
||||||
snapshotConv := snapshot.(map[string]interface{})
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("label", snapshotConv["label"].(string))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceSnapshotCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(updatedSnapshots) > 0 {
|
|
||||||
for _, snapshot := range updatedSnapshots {
|
|
||||||
snapshotConv := snapshot.(map[string]interface{})
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("label", snapshotConv["label"].(string))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceSnapshotRollbackAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isContainsSnapshot(els []interface{}, el interface{}) bool {
|
|
||||||
for _, elOld := range els {
|
|
||||||
elOldConv := elOld.(map[string]interface{})
|
|
||||||
elConv := el.(map[string]interface{})
|
|
||||||
if elOldConv["guid"].(string) == elConv["guid"].(string) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func isRollback(els []interface{}, el interface{}) bool {
|
|
||||||
for _, elOld := range els {
|
|
||||||
elOldConv := elOld.(map[string]interface{})
|
|
||||||
elConv := el.(map[string]interface{})
|
|
||||||
if elOldConv["guid"].(string) == elConv["guid"].(string) &&
|
|
||||||
elOldConv["rollback"].(bool) != elConv["rollback"].(bool) &&
|
|
||||||
elConv["rollback"].(bool) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"service_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of the service",
|
|
||||||
},
|
|
||||||
"rg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "ID of the Resource Group where this service will be placed",
|
|
||||||
},
|
|
||||||
"ssh_key": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "SSH key to deploy for the specified user. Same key will be deployed to all computes of the service.",
|
|
||||||
},
|
|
||||||
"ssh_user": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "name of the user to deploy SSH key for. Pass empty string if no SSH key deployment is required",
|
|
||||||
},
|
|
||||||
"permanently": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately",
|
|
||||||
},
|
|
||||||
"enable": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately",
|
|
||||||
},
|
|
||||||
"restore": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Restores BasicService instance",
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Start service. Starting a service technically means starting computes from all service groups according to group relations",
|
|
||||||
},
|
|
||||||
"service_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"base_domain": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"computes": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"compgroup_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"compgroup_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"compgroup_role": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
"cpu_total": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"disk_total": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"groups": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"groups_name": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"milestones": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"parent_srv_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"parent_srv_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ram_total": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"rg_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"snapshots": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Optional: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"label": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"rollback": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
},
|
|
||||||
"timestamp": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"valid": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"tech_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"user_managed": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicService() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceBasicServiceCreate,
|
|
||||||
Read: resourceBasicServiceRead,
|
|
||||||
Update: resourceBasicServiceEdit,
|
|
||||||
Delete: resourceBasicServiceDelete,
|
|
||||||
Exists: resourceBasicServiceExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceBasicServiceSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,661 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceGroupCreate")
|
|
||||||
|
|
||||||
if compgroupId, ok := d.GetOk("compgroup_id"); ok {
|
|
||||||
if _, ok := d.GetOk("service_id"); ok {
|
|
||||||
if exists, err := resourceBasicServiceGroupExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(strconv.Itoa(compgroupId.(int)))
|
|
||||||
d.Set("compgroup_id", strconv.Itoa(compgroupId.(int)))
|
|
||||||
err = resourceBasicServiceGroupRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId(id.String())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided compgroup id does not exist")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("name", d.Get("compgroup_name").(string))
|
|
||||||
|
|
||||||
urlValues.Add("count", strconv.Itoa(d.Get("comp_count").(int)))
|
|
||||||
urlValues.Add("cpu", strconv.Itoa(d.Get("cpu").(int)))
|
|
||||||
urlValues.Add("ram", strconv.Itoa(d.Get("ram").(int)))
|
|
||||||
urlValues.Add("disk", strconv.Itoa(d.Get("disk").(int)))
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
urlValues.Add("driver", strings.ToUpper(d.Get("driver").(string)))
|
|
||||||
|
|
||||||
if role, ok := d.GetOk("role"); ok {
|
|
||||||
urlValues.Add("role", role.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
if timeoutStart, ok := d.GetOk("timeout_start"); ok {
|
|
||||||
urlValues.Add("timeoutStart", strconv.Itoa(timeoutStart.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if vinses, ok := d.GetOk("vinses"); ok {
|
|
||||||
vs := vinses.([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(vs)
|
|
||||||
for i, v := range vs {
|
|
||||||
s := strconv.Itoa(v.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("vinses", temp)
|
|
||||||
}
|
|
||||||
if extnets, ok := d.GetOk("extnets"); ok {
|
|
||||||
es := extnets.([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(es)
|
|
||||||
for i, e := range es {
|
|
||||||
s := strconv.Itoa(e.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("extnets", temp)
|
|
||||||
}
|
|
||||||
|
|
||||||
compgroupId, err := controller.decortAPICall("POST", bserviceGroupAddAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(compgroupId)
|
|
||||||
d.Set("compgroup_id", compgroupId)
|
|
||||||
|
|
||||||
err = resourceBasicServiceGroupRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(id.String())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceGroupRead")
|
|
||||||
|
|
||||||
bsg, err := utilityBasicServiceGroupCheckPresence(d, m)
|
|
||||||
if bsg == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("account_id", bsg.AccountId)
|
|
||||||
d.Set("account_name", bsg.AccountName)
|
|
||||||
d.Set("computes", flattenBSGroupComputes(bsg.Computes))
|
|
||||||
d.Set("consistency", bsg.Consistency)
|
|
||||||
d.Set("cpu", bsg.CPU)
|
|
||||||
d.Set("created_by", bsg.CreatedBy)
|
|
||||||
d.Set("created_time", bsg.CreatedTime)
|
|
||||||
d.Set("deleted_by", bsg.DeletedBy)
|
|
||||||
d.Set("deleted_time", bsg.DeletedTime)
|
|
||||||
d.Set("disk", bsg.Disk)
|
|
||||||
d.Set("driver", bsg.Driver)
|
|
||||||
d.Set("extnets", bsg.Extnets)
|
|
||||||
d.Set("gid", bsg.GID)
|
|
||||||
d.Set("guid", bsg.GUID)
|
|
||||||
d.Set("image_id", bsg.ImageId)
|
|
||||||
d.Set("milestones", bsg.Milestones)
|
|
||||||
d.Set("compgroup_name", bsg.Name)
|
|
||||||
d.Set("compgroup_id", bsg.ID)
|
|
||||||
d.Set("parents", bsg.Parents)
|
|
||||||
d.Set("ram", bsg.RAM)
|
|
||||||
d.Set("rg_id", bsg.RGID)
|
|
||||||
d.Set("rg_name", bsg.RGName)
|
|
||||||
d.Set("role", bsg.Role)
|
|
||||||
d.Set("sep_id", bsg.SepId)
|
|
||||||
d.Set("seq_no", bsg.SeqNo)
|
|
||||||
d.Set("status", bsg.Status)
|
|
||||||
d.Set("tech_status", bsg.TechStatus)
|
|
||||||
d.Set("timeout_start", bsg.TimeoutStart)
|
|
||||||
d.Set("updated_by", bsg.UpdatedBy)
|
|
||||||
d.Set("updated_time", bsg.UpdatedTime)
|
|
||||||
d.Set("vinses", bsg.Vinses)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceGroupDelete")
|
|
||||||
|
|
||||||
bsg, err := utilityBasicServiceGroupCheckPresence(d, m)
|
|
||||||
if bsg == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", bserviceGroupRemoveAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceBasicServiceGroupExists")
|
|
||||||
|
|
||||||
bserviceGroup, err := utilityBasicServiceGroupCheckPresence(d, m)
|
|
||||||
if bserviceGroup == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceBasicServiceGroupEdit")
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if d.HasChange("comp_count") {
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("count", strconv.Itoa(d.Get("comp_count").(int)))
|
|
||||||
urlValues.Add("mode", strings.ToUpper(d.Get("mode").(string)))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupResizeAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("start") {
|
|
||||||
api := bserviceGroupStopAPI
|
|
||||||
start := d.Get("start").(bool)
|
|
||||||
if start {
|
|
||||||
api = bserviceGroupStartAPI
|
|
||||||
} else {
|
|
||||||
urlValues.Add("force", strconv.FormatBool(d.Get("force_stop").(bool)))
|
|
||||||
}
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChanges("compgroup_name", "ram", "cpu", "disk", "role") {
|
|
||||||
urlValues.Add("name", d.Get("compgroup_name").(string))
|
|
||||||
urlValues.Add("cpu", strconv.Itoa(d.Get("cpu").(int)))
|
|
||||||
urlValues.Add("ram", strconv.Itoa(d.Get("ram").(int)))
|
|
||||||
urlValues.Add("disk", strconv.Itoa(d.Get("disk").(int)))
|
|
||||||
urlValues.Add("role", d.Get("role").(string))
|
|
||||||
urlValues.Add("force", strconv.FormatBool(d.Get("force_update").(bool)))
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupUpdateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("extnets") {
|
|
||||||
extnets := d.Get("extnets").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(extnets)
|
|
||||||
for i, e := range extnets {
|
|
||||||
s := strconv.Itoa(e.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ",\n"
|
|
||||||
} else {
|
|
||||||
s += "\n"
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("extnets", temp)
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupUpdateExtnetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("vinses") {
|
|
||||||
vinses := d.Get("vinses").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(vinses)
|
|
||||||
for i, v := range vinses {
|
|
||||||
s := strconv.Itoa(v.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ",\n"
|
|
||||||
} else {
|
|
||||||
s += "\n"
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("vinses", temp)
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupUpdateVinsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("parents") {
|
|
||||||
deletedParents := make([]interface{}, 0)
|
|
||||||
addedParents := make([]interface{}, 0)
|
|
||||||
|
|
||||||
old, new := d.GetChange("parents")
|
|
||||||
oldConv := old.([]interface{})
|
|
||||||
newConv := new.([]interface{})
|
|
||||||
for _, el := range oldConv {
|
|
||||||
if !isContainsParent(newConv, el) {
|
|
||||||
deletedParents = append(deletedParents, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, el := range newConv {
|
|
||||||
if !isContainsParent(oldConv, el) {
|
|
||||||
addedParents = append(addedParents, el)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(deletedParents) > 0 {
|
|
||||||
for _, parent := range deletedParents {
|
|
||||||
parentConv := parent.(int)
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("parentId", strconv.Itoa(parentConv))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupParentRemoveAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(addedParents) > 0 {
|
|
||||||
for _, parent := range addedParents {
|
|
||||||
parentConv := parent.(int)
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("parentId", strconv.Itoa(parentConv))
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupParentAddAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("remove_computes") {
|
|
||||||
rcs := d.Get("remove_computes").([]interface{})
|
|
||||||
if len(rcs) > 0 {
|
|
||||||
for _, rc := range rcs {
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(rc.(int)))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", bserviceGroupComputeRemoveAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isContainsParent(els []interface{}, el interface{}) bool {
|
|
||||||
for _, elOld := range els {
|
|
||||||
elOldConv := elOld.(int)
|
|
||||||
elConv := el.(int)
|
|
||||||
if elOldConv == elConv {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroupSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"service_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "ID of the Basic Service to add a group to",
|
|
||||||
},
|
|
||||||
"compgroup_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "name of the Compute Group to add",
|
|
||||||
},
|
|
||||||
"comp_count": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "computes number. Defines how many computes must be there in the group",
|
|
||||||
},
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "compute CPU number. All computes in the group have the same CPU count",
|
|
||||||
},
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "compute RAM volume in MB. All computes in the group have the same RAM volume",
|
|
||||||
},
|
|
||||||
"disk": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "compute boot disk size in GB",
|
|
||||||
},
|
|
||||||
"image_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "OS image ID to create computes from",
|
|
||||||
},
|
|
||||||
"driver": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "compute driver like a KVM_X86, KVM_PPC, etc.",
|
|
||||||
},
|
|
||||||
"role": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "group role tag. Can be empty string, does not have to be unique",
|
|
||||||
},
|
|
||||||
"timeout_start": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "time of Compute Group readiness",
|
|
||||||
},
|
|
||||||
"extnets": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "list of external networks to connect computes to",
|
|
||||||
},
|
|
||||||
"vinses": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "list of ViNSes to connect computes to",
|
|
||||||
},
|
|
||||||
"mode": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Default: "RELATIVE",
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{"RELATIVE", "ABSOLUTE"}, false),
|
|
||||||
Description: "(RELATIVE;ABSOLUTE) either delta or absolute value of computes",
|
|
||||||
},
|
|
||||||
"start": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Start the specified Compute Group within BasicService",
|
|
||||||
},
|
|
||||||
"force_stop": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "force stop Compute Group",
|
|
||||||
},
|
|
||||||
"force_update": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "force resize Compute Group",
|
|
||||||
},
|
|
||||||
"parents": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"remove_computes": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"compgroup_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"computes": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"ip_addresses": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"os_users": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"login": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"password": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"consistency": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"created_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"deleted_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"gid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"milestones": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"rg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"rg_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"seq_no": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"tech_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_by": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"updated_time": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceBasicServiceGroup() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceBasicServiceGroupCreate,
|
|
||||||
Read: resourceBasicServiceGroupRead,
|
|
||||||
Update: resourceBasicServiceGroupEdit,
|
|
||||||
Delete: resourceBasicServiceGroupDelete,
|
|
||||||
Exists: resourceBasicServiceGroupExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceBasicServiceGroupSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,547 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
func cloudInitDiffSupperss(key, oldVal, newVal string, d *schema.ResourceData) bool {
|
|
||||||
if oldVal == "" && newVal != "applied" {
|
|
||||||
// if old value for "cloud_init" resource is empty string, it means that we are creating new compute
|
|
||||||
// and there is a chance that the user will want custom cloud init parameters - so we check if
|
|
||||||
// cloud_init is explicitly set in TF file by making sure that its new value is different from "applied",
|
|
||||||
// which is a reserved key word.
|
|
||||||
log.Debugf("cloudInitDiffSupperss: key=%s, oldVal=%q, newVal=%q -> suppress=FALSE", key, oldVal, newVal)
|
|
||||||
return false // there is a difference between stored and new value
|
|
||||||
}
|
|
||||||
log.Debugf("cloudInitDiffSupperss: key=%s, oldVal=%q, newVal=%q -> suppress=TRUE", key, oldVal, newVal)
|
|
||||||
return true // suppress difference
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceComputeCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
// we assume all mandatory parameters it takes to create a comptue instance are properly
|
|
||||||
// specified - we rely on schema "Required" attributes to let Terraform validate them for us
|
|
||||||
|
|
||||||
log.Debugf("resourceComputeCreate: called for Compute name %q, RG ID %d", d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
// create basic Compute (i.e. without extra disks and network connections - those will be attached
|
|
||||||
// by subsequent individual API calls).
|
|
||||||
// creating Compute is a multi-step workflow, which may fail at some step, so we use "partial" feature of Terraform
|
|
||||||
d.Partial(true)
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("rgId", fmt.Sprintf("%d", d.Get("rg_id").(int)))
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("cpu", fmt.Sprintf("%d", d.Get("cpu").(int)))
|
|
||||||
urlValues.Add("ram", fmt.Sprintf("%d", d.Get("ram").(int)))
|
|
||||||
urlValues.Add("imageId", fmt.Sprintf("%d", d.Get("image_id").(int)))
|
|
||||||
urlValues.Add("bootDisk", fmt.Sprintf("%d", d.Get("boot_disk_size").(int)))
|
|
||||||
urlValues.Add("netType", "NONE") // at the 1st step create isolated compute
|
|
||||||
urlValues.Add("start", "0") // at the 1st step create compute in a stopped state
|
|
||||||
|
|
||||||
argVal, argSet := d.GetOk("description")
|
|
||||||
if argSet {
|
|
||||||
urlValues.Add("desc", argVal.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
sshKeysVal, sshKeysSet := d.GetOk("ssh_keys")
|
|
||||||
if sshKeysSet {
|
|
||||||
// process SSH Key settings and set API values accordingly
|
|
||||||
log.Debugf("resourceComputeCreate: calling makeSshKeysArgString to setup SSH keys for guest login(s)")
|
|
||||||
urlValues.Add("userdata", makeSshKeysArgString(sshKeysVal.([]interface{})))
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
computeCreateAPI := KvmX86CreateAPI
|
|
||||||
driver := d.Get("driver").(string)
|
|
||||||
if driver == "KVM_PPC" {
|
|
||||||
computeCreateAPI = KvmPPCCreateAPI
|
|
||||||
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM PowerPC")
|
|
||||||
} else { // note that we do not validate arch value for explicit "KVM_X86" here
|
|
||||||
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86")
|
|
||||||
}
|
|
||||||
|
|
||||||
argVal, argSet = d.GetOk("cloud_init")
|
|
||||||
if argSet {
|
|
||||||
// userdata must not be empty string and must not be a reserved keyword "applied"
|
|
||||||
userdata := argVal.(string)
|
|
||||||
if userdata != "" && userdata != "applied" {
|
|
||||||
urlValues.Add("userdata", userdata)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apiResp, err := controller.decortAPICall("POST", computeCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Compute create API returns ID of the new Compute instance on success
|
|
||||||
|
|
||||||
d.SetId(apiResp) // update ID of the resource to tell Terraform that the resource exists, albeit partially
|
|
||||||
compId, _ := strconv.Atoi(apiResp)
|
|
||||||
d.SetPartial("name")
|
|
||||||
d.SetPartial("description")
|
|
||||||
d.SetPartial("cpu")
|
|
||||||
d.SetPartial("ram")
|
|
||||||
d.SetPartial("image_id")
|
|
||||||
d.SetPartial("boot_disk_size")
|
|
||||||
/*
|
|
||||||
if sshKeysSet {
|
|
||||||
d.SetPartial("ssh_keys")
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
log.Debugf("resourceComputeCreate: new simple Compute ID %d, name %s created", compId, d.Get("name").(string))
|
|
||||||
|
|
||||||
// Configure data disks if any
|
|
||||||
extraDisksOk := true
|
|
||||||
argVal, argSet = d.GetOk("extra_disks")
|
|
||||||
if argSet && argVal.(*schema.Set).Len() > 0 {
|
|
||||||
// urlValues.Add("desc", argVal.(string))
|
|
||||||
log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", argVal.(*schema.Set).Len())
|
|
||||||
err = controller.utilityComputeExtraDisksConfigure(d, false) // do_delta=false, as we are working on a new compute
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("resourceComputeCreate: error when attaching extra disk(s) to a new Compute ID %d: %v", compId, err)
|
|
||||||
extraDisksOk = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if extraDisksOk {
|
|
||||||
d.SetPartial("extra_disks")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure external networks if any
|
|
||||||
netsOk := true
|
|
||||||
argVal, argSet = d.GetOk("network")
|
|
||||||
if argSet && argVal.(*schema.Set).Len() > 0 {
|
|
||||||
log.Debugf("resourceComputeCreate: calling utilityComputeNetworksConfigure to attach %d network(s)", argVal.(*schema.Set).Len())
|
|
||||||
err = controller.utilityComputeNetworksConfigure(d, false) // do_delta=false, as we are working on a new compute
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("resourceComputeCreate: error when attaching networks to a new Compute ID %d: %s", compId, err)
|
|
||||||
netsOk = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if netsOk {
|
|
||||||
// there were no errors reported when configuring networks
|
|
||||||
d.SetPartial("network")
|
|
||||||
}
|
|
||||||
|
|
||||||
if extraDisksOk && netsOk {
|
|
||||||
// if there were no errors in setting any of the subresources, we may leave Partial mode
|
|
||||||
d.Partial(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note bene: we created compute in a STOPPED state (this is required to properly attach 1st network interface),
|
|
||||||
// now we need to start it before we report the sequence complete
|
|
||||||
if d.Get("started").(bool) {
|
|
||||||
reqValues := &url.Values{}
|
|
||||||
reqValues.Add("computeId", fmt.Sprintf("%d", compId))
|
|
||||||
log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", compId)
|
|
||||||
if _, err := controller.decortAPICall("POST", ComputeStartAPI, reqValues); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", compId, d.Get("name").(string))
|
|
||||||
|
|
||||||
// We may reuse dataSourceComputeRead here as we maintain similarity
|
|
||||||
// between Compute resource and Compute data source schemas
|
|
||||||
// Compute read function will also update resource ID on success, so that Terraform
|
|
||||||
// will know the resource exists
|
|
||||||
return dataSourceComputeRead(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceComputeRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceComputeRead: called for Compute name %s, RG ID %d",
|
|
||||||
d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
compFacts, err := utilityComputeCheckPresence(d, m)
|
|
||||||
if compFacts == "" {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Compute with such name and RG ID was not found
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = flattenCompute(d, compFacts); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("resourceComputeRead: after flattenCompute: Compute ID %s, name %q, RG ID %d",
|
|
||||||
d.Id(), d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceComputeUpdate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceComputeUpdate: called for Compute ID %s / name %s, RGID %d",
|
|
||||||
d.Id(), d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
/*
|
|
||||||
1. Resize CPU/RAM
|
|
||||||
2. Resize (grow) boot disk
|
|
||||||
3. Update extra disks
|
|
||||||
4. Update networks
|
|
||||||
5. Start/stop
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 1. Resize CPU/RAM
|
|
||||||
params := &url.Values{}
|
|
||||||
doUpdate := false
|
|
||||||
params.Add("computeId", d.Id())
|
|
||||||
|
|
||||||
d.Partial(true)
|
|
||||||
|
|
||||||
oldCpu, newCpu := d.GetChange("cpu")
|
|
||||||
if oldCpu.(int) != newCpu.(int) {
|
|
||||||
params.Add("cpu", fmt.Sprintf("%d", newCpu.(int)))
|
|
||||||
doUpdate = true
|
|
||||||
} else {
|
|
||||||
params.Add("cpu", "0") // no change to CPU allocation
|
|
||||||
}
|
|
||||||
|
|
||||||
oldRam, newRam := d.GetChange("ram")
|
|
||||||
if oldRam.(int) != newRam.(int) {
|
|
||||||
params.Add("ram", fmt.Sprintf("%d", newRam.(int)))
|
|
||||||
doUpdate = true
|
|
||||||
} else {
|
|
||||||
params.Add("ram", "0")
|
|
||||||
}
|
|
||||||
|
|
||||||
if doUpdate {
|
|
||||||
log.Debugf("resourceComputeUpdate: changing CPU %d -> %d and/or RAM %d -> %d",
|
|
||||||
oldCpu.(int), newCpu.(int),
|
|
||||||
oldRam.(int), newRam.(int))
|
|
||||||
params.Add("force", "true")
|
|
||||||
_, err := controller.decortAPICall("POST", ComputeResizeAPI, params)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetPartial("cpu")
|
|
||||||
d.SetPartial("ram")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Resize (grow) Boot disk
|
|
||||||
oldSize, newSize := d.GetChange("boot_disk_size")
|
|
||||||
if oldSize.(int) < newSize.(int) {
|
|
||||||
bdsParams := &url.Values{}
|
|
||||||
bdsParams.Add("diskId", fmt.Sprintf("%d", d.Get("boot_disk_id").(int)))
|
|
||||||
bdsParams.Add("size", fmt.Sprintf("%d", newSize.(int)))
|
|
||||||
log.Debugf("resourceComputeUpdate: compute ID %s, boot disk ID %d resize %d -> %d",
|
|
||||||
d.Id(), d.Get("boot_disk_id").(int), oldSize.(int), newSize.(int))
|
|
||||||
_, err := controller.decortAPICall("POST", DisksResizeAPI, bdsParams)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetPartial("boot_disk_size")
|
|
||||||
} else if oldSize.(int) > newSize.(int) {
|
|
||||||
log.Warnf("resourceComputeUpdate: compute ID %s - shrinking boot disk is not allowed", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Calculate and apply changes to data disks
|
|
||||||
err := controller.utilityComputeExtraDisksConfigure(d, true) // pass do_delta = true to apply changes, if any
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
d.SetPartial("extra_disks")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Calculate and apply changes to network connections
|
|
||||||
err = controller.utilityComputeNetworksConfigure(d, true) // pass do_delta = true to apply changes, if any
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
d.SetPartial("network")
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("started") {
|
|
||||||
params := &url.Values{}
|
|
||||||
params.Add("computeId", d.Id())
|
|
||||||
if d.Get("started").(bool) {
|
|
||||||
if _, err := controller.decortAPICall("POST", ComputeStartAPI, params); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if _, err := controller.decortAPICall("POST", ComputeStopAPI, params); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.SetPartial("started")
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Partial(false)
|
|
||||||
|
|
||||||
// we may reuse dataSourceComputeRead here as we maintain similarity
|
|
||||||
// between Compute resource and Compute data source schemas
|
|
||||||
return dataSourceComputeRead(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceComputeDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
// NOTE: this function destroys target Compute instance "permanently", so
|
|
||||||
// there is no way to restore it.
|
|
||||||
// If compute being destroyed has some extra disks attached, they are
|
|
||||||
// detached from the compute
|
|
||||||
log.Debugf("resourceComputeDelete: called for Compute name %s, RG ID %d",
|
|
||||||
d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
compFacts, err := utilityComputeCheckPresence(d, m)
|
|
||||||
if compFacts == "" {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// the target Compute does not exist - in this case according to Terraform best practice
|
|
||||||
// we exit from Destroy method without error
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
model := ComputeGetResp{}
|
|
||||||
log.Debugf("resourceComputeDelete: ready to unmarshal string %s", compFacts)
|
|
||||||
err = json.Unmarshal([]byte(compFacts), &model)
|
|
||||||
if err == nil && len(model.Disks) > 0 {
|
|
||||||
// prepare to detach data disks from compute - do it only if compFacts unmarshalled
|
|
||||||
// properly and the resulting model contains non-empty Disks list
|
|
||||||
for _, diskFacts := range model.Disks {
|
|
||||||
if diskFacts.Type == "B" {
|
|
||||||
// boot disk is never detached on compute delete
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("resourceComputeDelete: ready to detach data disk ID %d from compute ID %s", diskFacts.ID, d.Id())
|
|
||||||
|
|
||||||
detachParams := &url.Values{}
|
|
||||||
detachParams.Add("computeId", d.Id())
|
|
||||||
detachParams.Add("diskId", fmt.Sprintf("%d", diskFacts.ID))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", ComputeDiskDetachAPI, detachParams)
|
|
||||||
if err != nil {
|
|
||||||
// We do not fail compute deletion on data disk detach errors
|
|
||||||
log.Errorf("resourceComputeDelete: error when detaching Disk ID %d: %s", diskFacts.ID, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
params := &url.Values{}
|
|
||||||
params.Add("computeId", d.Id())
|
|
||||||
params.Add("permanently", "1")
|
|
||||||
// TODO: this is for the upcoming API update - params.Add("detachdisks", "1")
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", ComputeDeleteAPI, params)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceComputeExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
// Reminder: according to Terraform rules, this function should not modify its ResourceData argument
|
|
||||||
log.Debugf("resourceComputeExist: called for Compute name %s, RG ID %d",
|
|
||||||
d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
compFacts, err := utilityComputeCheckPresence(d, m)
|
|
||||||
if compFacts == "" {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceCompute() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceComputeCreate,
|
|
||||||
Read: resourceComputeRead,
|
|
||||||
Update: resourceComputeUpdate,
|
|
||||||
Delete: resourceComputeDelete,
|
|
||||||
Exists: resourceComputeExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout180s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout180s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of this compute. Compute names are case sensitive and must be unique in the resource group.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"rg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ValidateFunc: validation.IntAtLeast(1),
|
|
||||||
Description: "ID of the resource group where this compute should be deployed.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"driver": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
StateFunc: stateFuncToUpper,
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{"KVM_X86", "KVM_PPC"}, false), // observe case while validating
|
|
||||||
Description: "Hardware architecture of this compute instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ValidateFunc: validation.IntBetween(1, MaxCpusPerCompute),
|
|
||||||
Description: "Number of CPUs to allocate to this compute instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ValidateFunc: validation.IntAtLeast(MinRamPerCompute),
|
|
||||||
Description: "Amount of RAM in MB to allocate to this compute instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"image_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
ValidateFunc: validation.IntAtLeast(1),
|
|
||||||
Description: "ID of the OS image to base this compute instance on.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"boot_disk_size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"extra_disks": {
|
|
||||||
Type: schema.TypeSet,
|
|
||||||
Optional: true,
|
|
||||||
MaxItems: MaxExtraDisksPerCompute,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "Optional list of IDs of extra disks to attach to this compute. You may specify several extra disks.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"network": {
|
|
||||||
Type: schema.TypeSet,
|
|
||||||
Optional: true,
|
|
||||||
MaxItems: MaxNetworksPerCompute,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: networkSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.",
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
"ssh_keys": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
MaxItems: MaxSshKeysPerCompute,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: sshSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "SSH keys to authorize on this compute instance.",
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
|
|
||||||
"description": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Description: "Optional text description of this compute instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"cloud_init": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Default: "applied",
|
|
||||||
DiffSuppressFunc: cloudInitDiffSupperss,
|
|
||||||
Description: "Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases.",
|
|
||||||
},
|
|
||||||
|
|
||||||
// The rest are Compute properties, which are "computed" once it is created
|
|
||||||
"rg_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Name of the resource group where this compute instance is located.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "ID of the account this compute instance belongs to.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Name of the account this compute instance belongs to.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"boot_disk_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "This compute instance boot disk ID.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"os_users": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: osUsersSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "Guest OS users provisioned on this compute instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"started": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: true,
|
|
||||||
Description: "Is compute started.",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceCreateListImages(d *schema.ResourceData, m interface{}) error {
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDeleteListImages(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceDeleteListImages: start deleting...")
|
|
||||||
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
imageIds := d.Get("image_ids").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(imageIds)
|
|
||||||
for i, imageId := range imageIds {
|
|
||||||
s := strconv.Itoa(imageId.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ",\n"
|
|
||||||
} else {
|
|
||||||
s += "\n"
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
|
|
||||||
urlValues.Add("reason", d.Get("reason").(string))
|
|
||||||
urlValues.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool)))
|
|
||||||
urlValues.Add("imageIds", temp)
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", imageDeleteImagesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceReadListImages(d *schema.ResourceData, m interface{}) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDeleteImagesSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"image_ids": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
MinItems: 1,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "images ids for deleting",
|
|
||||||
},
|
|
||||||
"reason": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "reason for deleting the images",
|
|
||||||
},
|
|
||||||
"permanently": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "whether to completely delete the images",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDeleteImages() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceCreateListImages,
|
|
||||||
Read: resourceReadListImages,
|
|
||||||
Delete: resourceDeleteListImages,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceDeleteImagesSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,332 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
// "encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceDiskCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceDiskCreate: called for Disk name %q, Account ID %d", d.Get("name").(string), d.Get("account_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
// accountId, gid, name, description, size, type, sep_id, pool
|
|
||||||
urlValues.Add("accountId", fmt.Sprintf("%d", d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("gid", fmt.Sprintf("%d", DefaultGridID)) // we use default Grid ID, which was obtained along with DECORT Controller init
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("size", fmt.Sprintf("%d", d.Get("size").(int)))
|
|
||||||
urlValues.Add("type", "D") // NOTE: only disks of Data type are managed via plugin
|
|
||||||
|
|
||||||
if sepId, ok := d.GetOk("sep_id"); ok {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(sepId.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if poolName, ok := d.GetOk("pool"); ok {
|
|
||||||
urlValues.Add("pool", poolName.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
argVal, argSet := d.GetOk("description")
|
|
||||||
if argSet {
|
|
||||||
urlValues.Add("description", argVal.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
apiResp, err := controller.decortAPICall("POST", DisksCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(apiResp) // update ID of the resource to tell Terraform that the disk resource exists
|
|
||||||
diskId, _ := strconv.Atoi(apiResp)
|
|
||||||
|
|
||||||
log.Debugf("resourceDiskCreate: new Disk ID / name %d / %s creation sequence complete", diskId, d.Get("name").(string))
|
|
||||||
|
|
||||||
// We may reuse dataSourceDiskRead here as we maintain similarity
|
|
||||||
// between Disk resource and Disk data source schemas
|
|
||||||
// Disk resource read function will also update resource ID on success, so that Terraform
|
|
||||||
// will know the resource exists (however, we already did it a few lines before)
|
|
||||||
return dataSourceDiskRead(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDiskRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
diskFacts, err := utilityDiskCheckPresence(d, m)
|
|
||||||
if diskFacts == "" {
|
|
||||||
// if empty string is returned from utilityDiskCheckPresence then there is no
|
|
||||||
// such Disk and err tells so - just return it to the calling party
|
|
||||||
d.SetId("") // ensure ID is empty
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return flattenDisk(d, diskFacts)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
// Update will only change the following attributes of the disk:
|
|
||||||
// - Size; to keep data safe, shrinking disk is not allowed.
|
|
||||||
// - Name
|
|
||||||
//
|
|
||||||
// Attempt to change disk type will throw an error and mark disk
|
|
||||||
// resource as partially updated
|
|
||||||
log.Debugf("resourceDiskUpdate: called for Disk ID / name %s / %s, Account ID %d",
|
|
||||||
d.Id(), d.Get("name").(string), d.Get("account_id").(int))
|
|
||||||
|
|
||||||
d.Partial(true)
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
oldSize, newSize := d.GetChange("size")
|
|
||||||
if oldSize.(int) < newSize.(int) {
|
|
||||||
log.Debugf("resourceDiskUpdate: resizing disk ID %s - %d GB -> %d GB",
|
|
||||||
d.Id(), oldSize.(int), newSize.(int))
|
|
||||||
sizeParams := &url.Values{}
|
|
||||||
sizeParams.Add("diskId", d.Id())
|
|
||||||
sizeParams.Add("size", fmt.Sprintf("%d", newSize.(int)))
|
|
||||||
_, err := controller.decortAPICall("POST", DisksResizeAPI, sizeParams)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetPartial("size")
|
|
||||||
} else if oldSize.(int) > newSize.(int) {
|
|
||||||
return fmt.Errorf("resourceDiskUpdate: Disk ID %s - reducing disk size is not allowed", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
oldName, newName := d.GetChange("name")
|
|
||||||
if oldName.(string) != newName.(string) {
|
|
||||||
log.Debugf("resourceDiskUpdate: renaming disk ID %d - %s -> %s",
|
|
||||||
d.Get("disk_id").(int), oldName.(string), newName.(string))
|
|
||||||
renameParams := &url.Values{}
|
|
||||||
renameParams.Add("diskId", d.Id())
|
|
||||||
renameParams.Add("name", newName.(string))
|
|
||||||
_, err := controller.decortAPICall("POST", DisksRenameAPI, renameParams)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetPartial("name")
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE: plugin will manage disks of type "Data" only, and type cannot be changed once disk is created
|
|
||||||
|
|
||||||
oldType, newType := d.GetChange("type")
|
|
||||||
if oldType.(string) != newType.(string) {
|
|
||||||
return fmt.Errorf("resourceDiskUpdate: Disk ID %s - changing type of existing disk not allowed", d.Id())
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
d.Partial(false)
|
|
||||||
|
|
||||||
// we may reuse dataSourceDiskRead here as we maintain similarity
|
|
||||||
// between Compute resource and Compute data source schemas
|
|
||||||
return dataSourceDiskRead(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDiskDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
// NOTE: this function tries to detach and destroy target Disk "permanently", so
|
|
||||||
// there is no way to restore it.
|
|
||||||
// If, however, the disk is attached to a compute, the method will
|
|
||||||
// fail (by failing the underpinning DECORt API call, which is issued with detach=false)
|
|
||||||
log.Debugf("resourceDiskDelete: called for Disk ID / name %d / %s, Account ID %d",
|
|
||||||
d.Get("disk_id").(int), d.Get("name").(string), d.Get("account_id").(int))
|
|
||||||
|
|
||||||
diskFacts, err := utilityDiskCheckPresence(d, m)
|
|
||||||
if diskFacts == "" {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// the specified Disk does not exist - in this case according to Terraform best practice
|
|
||||||
// we exit from Destroy method without error
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
params := &url.Values{}
|
|
||||||
params.Add("diskId", d.Id())
|
|
||||||
// NOTE: we are not force-detaching disk from a compute (if attached) thus protecting
|
|
||||||
// data that may be on that disk from destruction.
|
|
||||||
// However, this may change in the future, as TF state management logic may want
|
|
||||||
// to delete disk resource BEFORE it is detached from compute instance, and, while
|
|
||||||
// perfectly OK from data preservation viewpoint, this is breaking expected TF workflow
|
|
||||||
// in the eyes of an experienced TF user
|
|
||||||
params.Add("detach", "0")
|
|
||||||
params.Add("permanently", "1")
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
_, err = controller.decortAPICall("POST", DisksDeleteAPI, params)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDiskExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
// Reminder: according to Terraform rules, this function should not modify its ResourceData argument
|
|
||||||
log.Debugf("resourceDiskExists: called for Disk ID / name %d / %s, Account ID %d",
|
|
||||||
d.Get("disk_id").(int), d.Get("name").(string), d.Get("account_id").(int))
|
|
||||||
|
|
||||||
diskFacts, err := utilityDiskCheckPresence(d, m)
|
|
||||||
if diskFacts == "" {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDiskSchemaMake() map[string]*schema.Schema {
|
|
||||||
rets := map[string]*schema.Schema{
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of this disk. NOTE: disk names are NOT unique within an account. If disk ID is specified, disk name is ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"disk_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Description: "ID of the disk to get. If disk ID is specified, then disk name and account ID are ignored.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "ID of the account this disk belongs to.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Storage end-point provider serving this disk. Cannot be changed for existing disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"pool": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Pool where this disk is located. Cannot be changed for existing disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ValidateFunc: validation.IntAtLeast(1),
|
|
||||||
Description: "Size of the disk in GB. Note, that existing disks can only be grown in size.",
|
|
||||||
},
|
|
||||||
|
|
||||||
/* We moved "type" attribute to computed attributes section, as plugin manages disks of only
|
|
||||||
one type - "D", e.g. data disks.
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Default: "D",
|
|
||||||
StateFunc: stateFuncToUpper,
|
|
||||||
ValidateFunc: validation.StringInSlice([]string{"B", "D"}, false),
|
|
||||||
Description: "Optional type of this disk. Defaults to D, i.e. data disk. Cannot be changed for existing disks.",
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
|
|
||||||
"description": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Default: "Disk resource managed by Terraform",
|
|
||||||
Description: "Optional user-defined text description of this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
// The rest of the attributes are all computed
|
|
||||||
"account_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Name of the account this disk belongs to.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"image_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "ID of the image, which this disk was cloned from (if ever cloned).",
|
|
||||||
},
|
|
||||||
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Type of this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"sep_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Type of the storage end-point provider serving this disk.",
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
"snapshots": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource {
|
|
||||||
Schema: snapshotSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "List of user-created snapshots for this disk."
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
return rets
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceDisk() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceDiskCreate,
|
|
||||||
Read: resourceDiskRead,
|
|
||||||
Update: resourceDiskUpdate,
|
|
||||||
Delete: resourceDiskDelete,
|
|
||||||
Exists: resourceDiskExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout180s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout180s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceDiskSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,722 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/customdiff"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceImageCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageCreate: called for image %s", d.Get("name").(string))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("url", d.Get("url").(string))
|
|
||||||
urlValues.Add("gid", strconv.Itoa(d.Get("gid").(int)))
|
|
||||||
urlValues.Add("boottype", d.Get("boot_type").(string))
|
|
||||||
urlValues.Add("imagetype", d.Get("image_type").(string))
|
|
||||||
|
|
||||||
tstr := d.Get("drivers").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(tstr)
|
|
||||||
for i, str := range tstr {
|
|
||||||
s := "\"" + str.(string) + "\""
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("drivers", temp)
|
|
||||||
|
|
||||||
if hotresize, ok := d.GetOk("hot_resize"); ok {
|
|
||||||
urlValues.Add("hotresize", strconv.FormatBool(hotresize.(bool)))
|
|
||||||
}
|
|
||||||
if username, ok := d.GetOk("username"); ok {
|
|
||||||
urlValues.Add("username", username.(string))
|
|
||||||
}
|
|
||||||
if password, ok := d.GetOk("password"); ok {
|
|
||||||
urlValues.Add("password", password.(string))
|
|
||||||
}
|
|
||||||
if accountId, ok := d.GetOk("account_id"); ok {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(accountId.(int)))
|
|
||||||
}
|
|
||||||
if usernameDL, ok := d.GetOk("username_dl"); ok {
|
|
||||||
urlValues.Add("usernameDL", usernameDL.(string))
|
|
||||||
}
|
|
||||||
if passwordDL, ok := d.GetOk("password_dl"); ok {
|
|
||||||
urlValues.Add("passwordDL", passwordDL.(string))
|
|
||||||
}
|
|
||||||
if sepId, ok := d.GetOk("sep_id"); ok {
|
|
||||||
urlValues.Add("sepId", strconv.Itoa(sepId.(int)))
|
|
||||||
}
|
|
||||||
if poolName, ok := d.GetOk("pool_name"); ok {
|
|
||||||
urlValues.Add("poolName", poolName.(string))
|
|
||||||
}
|
|
||||||
if architecture, ok := d.GetOk("architecture"); ok {
|
|
||||||
urlValues.Add("architecture", architecture.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
api := ""
|
|
||||||
if isSync := d.Get("sync").(bool); !isSync {
|
|
||||||
api = imageCreateAPI
|
|
||||||
} else {
|
|
||||||
api = imageSyncCreateAPI
|
|
||||||
}
|
|
||||||
imageId, err := controller.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(imageId)
|
|
||||||
d.Set("image_id", imageId)
|
|
||||||
|
|
||||||
image, err := utilityImageCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(strconv.Itoa(image.ImageId))
|
|
||||||
d.Set("bootable", image.Bootable)
|
|
||||||
//d.Set("image_id", image.ImageId)
|
|
||||||
|
|
||||||
err = resourceImageRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageRead: called for %s id: %s", d.Get("name").(string), d.Id())
|
|
||||||
|
|
||||||
image, err := utilityImageCheckPresence(d, m)
|
|
||||||
if image == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("name", image.Name)
|
|
||||||
d.Set("drivers", image.Drivers)
|
|
||||||
d.Set("url", image.Url)
|
|
||||||
d.Set("gid", image.Gid)
|
|
||||||
d.Set("image_id", image.ImageId)
|
|
||||||
d.Set("boot_type", image.Boottype)
|
|
||||||
d.Set("image_type", image.Imagetype)
|
|
||||||
d.Set("bootable", image.Bootable)
|
|
||||||
d.Set("sep_id", image.SepId)
|
|
||||||
d.Set("unc_path", image.UNCPath)
|
|
||||||
d.Set("link_to", image.LinkTo)
|
|
||||||
d.Set("status", image.Status)
|
|
||||||
d.Set("tech_status", image.TechStatus)
|
|
||||||
d.Set("version", image.Version)
|
|
||||||
d.Set("size", image.Size)
|
|
||||||
d.Set("enabled", image.Enabled)
|
|
||||||
d.Set("computeci_id", image.ComputeciId)
|
|
||||||
d.Set("pool_name", image.PoolName)
|
|
||||||
d.Set("username", image.Username)
|
|
||||||
d.Set("username_dl", image.UsernameDL)
|
|
||||||
d.Set("password", image.Password)
|
|
||||||
d.Set("password_dl", image.PasswordDL)
|
|
||||||
d.Set("account_id", image.AccountId)
|
|
||||||
d.Set("guid", image.Guid)
|
|
||||||
d.Set("milestones", image.Milestones)
|
|
||||||
d.Set("provider_name", image.ProviderName)
|
|
||||||
d.Set("purge_attempts", image.PurgeAttempts)
|
|
||||||
d.Set("reference_id", image.ReferenceId)
|
|
||||||
d.Set("res_id", image.ResId)
|
|
||||||
d.Set("res_name", image.ResName)
|
|
||||||
d.Set("rescuecd", image.Rescuecd)
|
|
||||||
d.Set("architecture", image.Architecture)
|
|
||||||
d.Set("meta", flattenMeta(image.Meta))
|
|
||||||
d.Set("hot_resize", image.Hotresize)
|
|
||||||
d.Set("history", flattenHistory(image.History))
|
|
||||||
d.Set("last_modified", image.LastModified)
|
|
||||||
d.Set("desc", image.Desc)
|
|
||||||
d.Set("shared_with", image.SharedWith)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageDelete: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
|
|
||||||
image, err := utilityImageCheckPresence(d, m)
|
|
||||||
if image == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
if reason, ok := d.GetOk("reason"); ok {
|
|
||||||
urlValues.Add("reason", reason.(string))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("reason", "")
|
|
||||||
}
|
|
||||||
if permanently, ok := d.GetOk("permanently"); ok {
|
|
||||||
urlValues.Add("permanently", strconv.FormatBool(permanently.(bool)))
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", imageDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceImageExists: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
|
|
||||||
image, err := utilityImageCheckPresence(d, m)
|
|
||||||
if image == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageEditName(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageEditName: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
_, err := c.decortAPICall("POST", imageEditNameAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageEdit: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
|
|
||||||
urlValues.Add("username", d.Get("username").(string))
|
|
||||||
urlValues.Add("password", d.Get("password").(string))
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("bootable", strconv.FormatBool(d.Get("bootable").(bool)))
|
|
||||||
urlValues.Add("hotresize", strconv.FormatBool(d.Get("hot_resize").(bool)))
|
|
||||||
|
|
||||||
//_, err := c.decortAPICall("POST", imageEditAPI, urlValues)
|
|
||||||
_, err := c.decortAPICall("POST", imageEditAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
err = resourceImageRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err = resourceImageRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageChangeEnabled(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
var api string
|
|
||||||
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
if d.Get("enabled").(bool) {
|
|
||||||
api = imageEnableAPI
|
|
||||||
} else {
|
|
||||||
api = imageDisableAPI
|
|
||||||
}
|
|
||||||
resp, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
res, err := strconv.ParseBool(resp)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !res {
|
|
||||||
return errors.New("Cannot enable/disable")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageLink(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceVirtualImageLink: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
urlValues.Add("targetId", strconv.Itoa(d.Get("link_to").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", imageLinkAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageShare(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageShare: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
accIds := d.Get("shared_with").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(accIds)
|
|
||||||
for i, accId := range accIds {
|
|
||||||
s := strconv.Itoa(accId.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ",\n"
|
|
||||||
} else {
|
|
||||||
s += "\n"
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("accounts", temp)
|
|
||||||
_, err := c.decortAPICall("POST", imageShareAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageChangeComputeci(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
computeci := d.Get("computeci_id").(int)
|
|
||||||
|
|
||||||
api := ""
|
|
||||||
|
|
||||||
if computeci == 0 {
|
|
||||||
api = imageComputeciUnsetAPI
|
|
||||||
} else {
|
|
||||||
urlValues.Add("computeciId", strconv.Itoa(computeci))
|
|
||||||
api = imageComputeciSetAPI
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageUpdateNodes(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceImageUpdateNodes: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
enabledStacks := d.Get("enabled_stacks").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(enabledStacks)
|
|
||||||
for i, stackId := range enabledStacks {
|
|
||||||
s := stackId.(string)
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("enabledStacks", temp)
|
|
||||||
_, err := c.decortAPICall("POST", imageUpdateNodesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImageSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of the rescue disk",
|
|
||||||
},
|
|
||||||
"url": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "URL where to download media from",
|
|
||||||
},
|
|
||||||
"gid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "grid (platform) ID where this template should be create in",
|
|
||||||
},
|
|
||||||
"boot_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Boot type of image bios or uefi",
|
|
||||||
},
|
|
||||||
"image_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Image type linux, windows or other",
|
|
||||||
},
|
|
||||||
"drivers": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Required: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]",
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
Description: "meta",
|
|
||||||
},
|
|
||||||
"hot_resize": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Does this machine supports hot resize",
|
|
||||||
},
|
|
||||||
"username": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Optional username for the image",
|
|
||||||
},
|
|
||||||
"password": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Optional password for the image",
|
|
||||||
},
|
|
||||||
"account_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "AccountId to make the image exclusive",
|
|
||||||
},
|
|
||||||
"username_dl": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "username for upload binary media",
|
|
||||||
},
|
|
||||||
"password_dl": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "password for upload binary media",
|
|
||||||
},
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "storage endpoint provider ID",
|
|
||||||
},
|
|
||||||
"pool_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "pool for image create",
|
|
||||||
},
|
|
||||||
"architecture": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "binary architecture of this image, one of X86_64 of PPC64_LE",
|
|
||||||
},
|
|
||||||
"image_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "image id",
|
|
||||||
},
|
|
||||||
"permanently": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Whether to completely delete the image",
|
|
||||||
},
|
|
||||||
"bootable": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Does this image boot OS",
|
|
||||||
},
|
|
||||||
"unc_path": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "unc path",
|
|
||||||
},
|
|
||||||
"link_to": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "",
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "status",
|
|
||||||
},
|
|
||||||
"tech_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "tech atatus",
|
|
||||||
},
|
|
||||||
"version": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "version",
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "image size",
|
|
||||||
},
|
|
||||||
"enabled": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"computeci_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"milestones": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"provider_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"purge_attempts": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"reference_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"res_id": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"res_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"rescuecd": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"reason": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
},
|
|
||||||
"last_modified": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"desc": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"shared_with": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sync": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Create image from a media identified by URL (in synchronous mode)",
|
|
||||||
},
|
|
||||||
"enabled_stacks": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"history": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"timestamp": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceImage() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceImageCreate,
|
|
||||||
Read: resourceImageRead,
|
|
||||||
Update: resourceImageEdit,
|
|
||||||
Delete: resourceImageDelete,
|
|
||||||
Exists: resourceImageExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
CustomizeDiff: customdiff.All(
|
|
||||||
customdiff.IfValueChange("enabled", func(old, new, meta interface{}) bool {
|
|
||||||
return old.(bool) != new.(bool)
|
|
||||||
}, resourceImageChangeEnabled),
|
|
||||||
customdiff.IfValueChange("name", func(old, new, meta interface{}) bool {
|
|
||||||
return old.(string) != new.(string) && old.(string) != ""
|
|
||||||
}, resourceImageEditName),
|
|
||||||
customdiff.IfValueChange("shared_with", func(old, new, meta interface{}) bool {
|
|
||||||
o := old.([]interface{})
|
|
||||||
n := new.([]interface{})
|
|
||||||
|
|
||||||
if len(o) != len(n) {
|
|
||||||
return true
|
|
||||||
} else if len(o) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
count := 0
|
|
||||||
for i, v := range n {
|
|
||||||
if v.(int) == o[i].(int) {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count == 0
|
|
||||||
}, resourceImageShare),
|
|
||||||
customdiff.IfValueChange("computeci_id", func(old, new, meta interface{}) bool {
|
|
||||||
return old.(int) != new.(int)
|
|
||||||
}, resourceImageChangeComputeci),
|
|
||||||
customdiff.IfValueChange("enabled_stacks", func(old, new, meta interface{}) bool {
|
|
||||||
o := old.([]interface{})
|
|
||||||
n := new.([]interface{})
|
|
||||||
|
|
||||||
if len(o) != len(n) {
|
|
||||||
return true
|
|
||||||
} else if len(o) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for i, v := range n {
|
|
||||||
if v.(string) == o[i].(string) {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count == 0
|
|
||||||
}, resourceImageUpdateNodes),
|
|
||||||
),
|
|
||||||
|
|
||||||
Schema: resourceImageSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func flattenMeta(m []interface{}) []string {
|
|
||||||
output := []string{}
|
|
||||||
for _, item := range m {
|
|
||||||
switch d := item.(type) {
|
|
||||||
case string:
|
|
||||||
output = append(output, d)
|
|
||||||
case int:
|
|
||||||
output = append(output, strconv.Itoa(d))
|
|
||||||
case int64:
|
|
||||||
output = append(output, strconv.FormatInt(d, 10))
|
|
||||||
case float64:
|
|
||||||
output = append(output, strconv.FormatInt(int64(d), 10))
|
|
||||||
default:
|
|
||||||
output = append(output, "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
|
|
||||||
func flattenHistory(history []History) []map[string]interface{} {
|
|
||||||
temp := make([]map[string]interface{}, 0)
|
|
||||||
for _, item := range history {
|
|
||||||
t := map[string]interface{}{
|
|
||||||
"id": item.Id,
|
|
||||||
"guid": item.Guid,
|
|
||||||
"timestamp": item.Timestamp,
|
|
||||||
}
|
|
||||||
|
|
||||||
temp = append(temp, t)
|
|
||||||
}
|
|
||||||
return temp
|
|
||||||
}
|
|
||||||
@@ -1,393 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceK8sCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sCreate: called with name %s, rg %d", d.Get("name").(string), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
|
|
||||||
urlValues.Add("k8ciId", strconv.Itoa(d.Get("k8sci_id").(int)))
|
|
||||||
urlValues.Add("workerGroupName", d.Get("wg_name").(string))
|
|
||||||
|
|
||||||
var masterNode K8sNodeRecord
|
|
||||||
if masters, ok := d.GetOk("masters"); ok {
|
|
||||||
masterNode = parseNode(masters.([]interface{}))
|
|
||||||
} else {
|
|
||||||
masterNode = nodeMasterDefault()
|
|
||||||
}
|
|
||||||
urlValues.Add("masterNum", strconv.Itoa(masterNode.Num))
|
|
||||||
urlValues.Add("masterCpu", strconv.Itoa(masterNode.Cpu))
|
|
||||||
urlValues.Add("masterRam", strconv.Itoa(masterNode.Ram))
|
|
||||||
urlValues.Add("masterDisk", strconv.Itoa(masterNode.Disk))
|
|
||||||
|
|
||||||
var workerNode K8sNodeRecord
|
|
||||||
if workers, ok := d.GetOk("workers"); ok {
|
|
||||||
workerNode = parseNode(workers.([]interface{}))
|
|
||||||
} else {
|
|
||||||
workerNode = nodeWorkerDefault()
|
|
||||||
}
|
|
||||||
urlValues.Add("workerNum", strconv.Itoa(workerNode.Num))
|
|
||||||
urlValues.Add("workerCpu", strconv.Itoa(workerNode.Cpu))
|
|
||||||
urlValues.Add("workerRam", strconv.Itoa(workerNode.Ram))
|
|
||||||
urlValues.Add("workerDisk", strconv.Itoa(workerNode.Disk))
|
|
||||||
|
|
||||||
//if withLB, ok := d.GetOk("with_lb"); ok {
|
|
||||||
//urlValues.Add("withLB", strconv.FormatBool(withLB.(bool)))
|
|
||||||
//}
|
|
||||||
urlValues.Add("withLB", strconv.FormatBool(true))
|
|
||||||
|
|
||||||
if extNet, ok := d.GetOk("extnet_id"); ok {
|
|
||||||
urlValues.Add("extnetId", strconv.Itoa(extNet.(int)))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("extnetId", "0")
|
|
||||||
}
|
|
||||||
|
|
||||||
//if desc, ok := d.GetOk("desc"); ok {
|
|
||||||
//urlValues.Add("desc", desc.(string))
|
|
||||||
//}
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", K8sCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
urlValues.Add("auditId", strings.Trim(resp, `"`))
|
|
||||||
|
|
||||||
for {
|
|
||||||
resp, err := controller.decortAPICall("POST", AsyncTaskGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
task := AsyncTask{}
|
|
||||||
if err := json.Unmarshal([]byte(resp), &task); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Debugf("resourceK8sCreate: instance creating - %s", task.Stage)
|
|
||||||
|
|
||||||
if task.Completed {
|
|
||||||
if task.Error != "" {
|
|
||||||
return fmt.Errorf("cannot create k8s instance: %v", task.Error)
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(strconv.Itoa(int(task.Result)))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
time.Sleep(time.Second * 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
k8s, err := utilityK8sCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("default_wg_id", k8s.Groups.Workers[0].ID)
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
urlValues.Add("lbId", strconv.Itoa(k8s.LbID))
|
|
||||||
|
|
||||||
resp, err = controller.decortAPICall("POST", LbGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var lb LbRecord
|
|
||||||
if err := json.Unmarshal([]byte(resp), &lb); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.Set("extnet_id", lb.ExtNetID)
|
|
||||||
d.Set("lb_ip", lb.PrimaryNode.FrontendIP)
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
kubeconfig, err := controller.decortAPICall("POST", K8sGetConfigAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("could not get kubeconfig: %v", err)
|
|
||||||
}
|
|
||||||
d.Set("kubeconfig", kubeconfig)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sRead: called with id %s, rg %d", d.Id(), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
k8s, err := utilityK8sCheckPresence(d, m)
|
|
||||||
if k8s == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("name", k8s.Name)
|
|
||||||
d.Set("rg_id", k8s.RgID)
|
|
||||||
d.Set("k8sci_id", k8s.CI)
|
|
||||||
d.Set("wg_name", k8s.Groups.Workers[0].Name)
|
|
||||||
d.Set("masters", nodeToResource(k8s.Groups.Masters))
|
|
||||||
d.Set("workers", nodeToResource(k8s.Groups.Workers[0]))
|
|
||||||
d.Set("default_wg_id", k8s.Groups.Workers[0].ID)
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("lbId", strconv.Itoa(k8s.LbID))
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", LbGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var lb LbRecord
|
|
||||||
if err := json.Unmarshal([]byte(resp), &lb); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.Set("extnet_id", lb.ExtNetID)
|
|
||||||
d.Set("lb_ip", lb.PrimaryNode.FrontendIP)
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
kubeconfig, err := controller.decortAPICall("POST", K8sGetConfigAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("could not get kubeconfig: %v", err)
|
|
||||||
}
|
|
||||||
d.Set("kubeconfig", kubeconfig)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sUpdate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sUpdate: called with id %s, rg %d", d.Id(), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
if d.HasChange("name") {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
|
|
||||||
_, err := controller.decortAPICall("POST", K8sUpdateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.HasChange("workers") {
|
|
||||||
k8s, err := utilityK8sCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
wg := k8s.Groups.Workers[0]
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
urlValues.Add("workersGroupId", strconv.Itoa(wg.ID))
|
|
||||||
|
|
||||||
newWorkers := parseNode(d.Get("workers").([]interface{}))
|
|
||||||
|
|
||||||
if newWorkers.Num > wg.Num {
|
|
||||||
urlValues.Add("num", strconv.Itoa(newWorkers.Num-wg.Num))
|
|
||||||
if _, err := controller.decortAPICall("POST", K8sWorkerAddAPI, urlValues); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for i := wg.Num - 1; i >= newWorkers.Num; i-- {
|
|
||||||
urlValues.Set("workerId", strconv.Itoa(wg.DetailedInfo[i].ID))
|
|
||||||
if _, err := controller.decortAPICall("POST", K8sWorkerDeleteAPI, urlValues); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sDelete: called with id %s, rg %d", d.Id(), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
k8s, err := utilityK8sCheckPresence(d, m)
|
|
||||||
if k8s == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
urlValues.Add("permanently", "true")
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", K8sDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceK8sExists: called with id %s, rg %d", d.Id(), d.Get("rg_id").(int))
|
|
||||||
|
|
||||||
k8s, err := utilityK8sCheckPresence(d, m)
|
|
||||||
if k8s == nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of the cluster.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"rg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Resource group ID that this instance belongs to.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"k8sci_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "ID of the k8s catalog item to base this instance on.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"wg_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Name for first worker group created with cluster.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"masters": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
ForceNew: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: nodeK8sSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "Master node(s) configuration.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"workers": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
MaxItems: 1,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: nodeK8sSubresourceSchemaMake(),
|
|
||||||
},
|
|
||||||
Description: "Worker node(s) configuration.",
|
|
||||||
},
|
|
||||||
|
|
||||||
//"with_lb": {
|
|
||||||
//Type: schema.TypeBool,
|
|
||||||
//Optional: true,
|
|
||||||
//ForceNew: true,
|
|
||||||
//Default: true,
|
|
||||||
//Description: "Create k8s with load balancer if true.",
|
|
||||||
//},
|
|
||||||
|
|
||||||
"extnet_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "ID of the external network to connect workers to. If omitted network will be chosen by the platfom.",
|
|
||||||
},
|
|
||||||
|
|
||||||
//"desc": {
|
|
||||||
//Type: schema.TypeString,
|
|
||||||
//Optional: true,
|
|
||||||
//Description: "Text description of this instance.",
|
|
||||||
//},
|
|
||||||
|
|
||||||
"lb_ip": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "IP address of default load balancer.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"default_wg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "ID of default workers group for this instace.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"kubeconfig": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "Kubeconfig for cluster access.",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8s() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceK8sCreate,
|
|
||||||
Read: resourceK8sRead,
|
|
||||||
Update: resourceK8sUpdate,
|
|
||||||
Delete: resourceK8sDelete,
|
|
||||||
Exists: resourceK8sExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout20m,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout20m,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceK8sSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceK8sWgCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sWgCreate: called with k8s id %d", d.Get("k8s_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", strconv.Itoa(d.Get("k8s_id").(int)))
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("workerNum", strconv.Itoa(d.Get("num").(int)))
|
|
||||||
urlValues.Add("workerCpu", strconv.Itoa(d.Get("cpu").(int)))
|
|
||||||
urlValues.Add("workerRam", strconv.Itoa(d.Get("ram").(int)))
|
|
||||||
urlValues.Add("workerDisk", strconv.Itoa(d.Get("disk").(int)))
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", K8sWgCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(resp)
|
|
||||||
|
|
||||||
// This code is the supposed flow, but at the time of writing it's not yet implemented by the platfom
|
|
||||||
|
|
||||||
//urlValues = &url.Values{}
|
|
||||||
//urlValues.Add("auditId", strings.Trim(resp, `"`))
|
|
||||||
|
|
||||||
//for {
|
|
||||||
//resp, err := controller.decortAPICall("POST", AsyncTaskGetAPI, urlValues)
|
|
||||||
//if err != nil {
|
|
||||||
//return err
|
|
||||||
//}
|
|
||||||
|
|
||||||
//task := AsyncTask{}
|
|
||||||
//if err := json.Unmarshal([]byte(resp), &task); err != nil {
|
|
||||||
//return err
|
|
||||||
//}
|
|
||||||
//log.Debugf("resourceK8sCreate: workers group creating - %s", task.Stage)
|
|
||||||
|
|
||||||
//if task.Completed {
|
|
||||||
//if task.Error != "" {
|
|
||||||
//return fmt.Errorf("cannot create workers group: %v", task.Error)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//d.SetId(strconv.Itoa(int(task.Result)))
|
|
||||||
//break
|
|
||||||
//}
|
|
||||||
|
|
||||||
//time.Sleep(time.Second * 5)
|
|
||||||
//}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWgRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sWgRead: called with k8s id %d", d.Get("k8s_id").(int))
|
|
||||||
|
|
||||||
wg, err := utilityK8sWgCheckPresence(d, m)
|
|
||||||
if wg == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("name", wg.Name)
|
|
||||||
d.Set("num", wg.Num)
|
|
||||||
d.Set("cpu", wg.Cpu)
|
|
||||||
d.Set("ram", wg.Ram)
|
|
||||||
d.Set("disk", wg.Disk)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWgUpdate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sWgUpdate: called with k8s id %d", d.Get("k8s_id").(int))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
wg, err := utilityK8sWgCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", strconv.Itoa(d.Get("k8s_id").(int)))
|
|
||||||
urlValues.Add("workersGroupId", d.Id())
|
|
||||||
|
|
||||||
if newNum := d.Get("num").(int); newNum > wg.Num {
|
|
||||||
urlValues.Add("num", strconv.Itoa(newNum-wg.Num))
|
|
||||||
_, err := controller.decortAPICall("POST", K8sWorkerAddAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for i := wg.Num - 1; i >= newNum; i-- {
|
|
||||||
urlValues.Set("workerId", strconv.Itoa(wg.DetailedInfo[i].ID))
|
|
||||||
_, err := controller.decortAPICall("POST", K8sWorkerDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWgDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceK8sWgDelete: called with k8s id %d", d.Get("k8s_id").(int))
|
|
||||||
|
|
||||||
wg, err := utilityK8sWgCheckPresence(d, m)
|
|
||||||
if wg == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", strconv.Itoa(d.Get("k8s_id").(int)))
|
|
||||||
urlValues.Add("workersGroupId", strconv.Itoa(wg.ID))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", K8sWgDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWgExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceK8sWgExists: called with k8s id %d", d.Get("k8s_id").(int))
|
|
||||||
|
|
||||||
wg, err := utilityK8sWgCheckPresence(d, m)
|
|
||||||
if wg == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWgSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"k8s_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "ID of k8s instance.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "Name of the worker group.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"num": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Default: 1,
|
|
||||||
Description: "Number of worker nodes to create.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"cpu": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Default: 1,
|
|
||||||
Description: "Worker node CPU count.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"ram": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Default: 1024,
|
|
||||||
Description: "Worker node RAM in MB.",
|
|
||||||
},
|
|
||||||
|
|
||||||
"disk": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Default: 0,
|
|
||||||
Description: "Worker node boot disk size. If unspecified or 0, size is defined by OS image size.",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceK8sWg() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceK8sWgCreate,
|
|
||||||
Read: resourceK8sWgRead,
|
|
||||||
Update: resourceK8sWgUpdate,
|
|
||||||
Delete: resourceK8sWgDelete,
|
|
||||||
Exists: resourceK8sWgExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout20m,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout20m,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceK8sWgSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,263 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourcePcideviceCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourcePcideviceCreate: called for pcidevice %s", d.Get("name").(string))
|
|
||||||
|
|
||||||
if deviceId, ok := d.GetOk("device_id"); ok {
|
|
||||||
if exists, err := resourcePcideviceExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId(strconv.Itoa(deviceId.(int)))
|
|
||||||
err = resourcePcideviceRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided device id does not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("hwPath", d.Get("hw_path").(string))
|
|
||||||
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
|
|
||||||
urlValues.Add("stackId", strconv.Itoa(d.Get("stack_id").(int)))
|
|
||||||
|
|
||||||
if description, ok := d.GetOk("description"); ok {
|
|
||||||
urlValues.Add("description", description.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
pcideviceId, err := controller.decortAPICall("POST", pcideviceCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(pcideviceId)
|
|
||||||
d.Set("device_id", pcideviceId)
|
|
||||||
|
|
||||||
err = resourcePcideviceRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcideviceRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
pcidevice, err := utilityPcideviceCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(strconv.Itoa(pcidevice.ID))
|
|
||||||
d.Set("ckey", pcidevice.CKey)
|
|
||||||
d.Set("meta", flattenMeta(pcidevice.Meta))
|
|
||||||
d.Set("compute_id", pcidevice.Computeid)
|
|
||||||
d.Set("description", pcidevice.Description)
|
|
||||||
d.Set("guid", pcidevice.Guid)
|
|
||||||
d.Set("hw_path", pcidevice.HwPath)
|
|
||||||
d.Set("device_id", pcidevice.ID)
|
|
||||||
d.Set("rg_id", pcidevice.RgID)
|
|
||||||
d.Set("name", pcidevice.Name)
|
|
||||||
d.Set("stack_id", pcidevice.StackID)
|
|
||||||
d.Set("status", pcidevice.Status)
|
|
||||||
d.Set("system_name", pcidevice.SystemName)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcideviceDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourcePcideviceDelete: called for %s, id: %s", d.Get("name").(string), d.Id())
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("deviceId", d.Id())
|
|
||||||
urlValues.Add("force", strconv.FormatBool(d.Get("force").(bool)))
|
|
||||||
|
|
||||||
_, err := controller.decortAPICall("POST", pcideviceDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcideviceExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
pcidevice, err := utilityPcideviceCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if pcidevice == nil {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcideviceEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
if d.HasChange("enable") {
|
|
||||||
state := d.Get("enable").(bool)
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
api := ""
|
|
||||||
|
|
||||||
urlValues.Add("deviceId", strconv.Itoa(d.Get("device_id").(int)))
|
|
||||||
|
|
||||||
if state {
|
|
||||||
api = pcideviceEnableAPI
|
|
||||||
} else {
|
|
||||||
api = pcideviceDisableAPI
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err := resourcePcideviceRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcideviceSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"ckey": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"compute_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "description, just for information",
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"hw_path": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "PCI address of the device",
|
|
||||||
},
|
|
||||||
"device_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "Name of Device",
|
|
||||||
},
|
|
||||||
"rg_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "Resource GROUP",
|
|
||||||
},
|
|
||||||
"stack_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "stackId",
|
|
||||||
},
|
|
||||||
"status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"system_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"force": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Force delete",
|
|
||||||
},
|
|
||||||
"enable": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Enable pci device",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourcePcidevice() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourcePcideviceCreate,
|
|
||||||
Read: resourcePcideviceRead,
|
|
||||||
Update: resourcePcideviceEdit,
|
|
||||||
Delete: resourcePcideviceDelete,
|
|
||||||
Exists: resourcePcideviceExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourcePcideviceSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,548 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/customdiff"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceSepCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepCreate: called for sep %s", d.Get("name").(string))
|
|
||||||
|
|
||||||
if sepId, ok := d.GetOk("sep_id"); ok {
|
|
||||||
if exists, err := resourceSepExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId(strconv.Itoa(sepId.(int)))
|
|
||||||
err = resourceSepRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided sep id does not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("name", d.Get("name").(string))
|
|
||||||
urlValues.Add("gid", strconv.Itoa(d.Get("gid").(int)))
|
|
||||||
urlValues.Add("sep_type", d.Get("type").(string))
|
|
||||||
|
|
||||||
if desc, ok := d.GetOk("desc"); ok {
|
|
||||||
urlValues.Add("description", desc.(string))
|
|
||||||
}
|
|
||||||
if configString, ok := d.GetOk("config"); ok {
|
|
||||||
urlValues.Add("config", configString.(string))
|
|
||||||
}
|
|
||||||
if enable, ok := d.GetOk("enable"); ok {
|
|
||||||
urlValues.Add("enable", strconv.FormatBool(enable.(bool)))
|
|
||||||
}
|
|
||||||
|
|
||||||
tstr := d.Get("consumed_by").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(tstr)
|
|
||||||
for i, str := range tstr {
|
|
||||||
s := "\"" + str.(string) + "\""
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("consumer_nids", temp)
|
|
||||||
|
|
||||||
tstr = d.Get("provided_by").([]interface{})
|
|
||||||
temp = ""
|
|
||||||
l = len(tstr)
|
|
||||||
for i, str := range tstr {
|
|
||||||
s := "\"" + str.(string) + "\""
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("provider_nids", temp)
|
|
||||||
|
|
||||||
sepId, err := controller.decortAPICall("POST", sepCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(sepId)
|
|
||||||
d.Set("sep_id", sepId)
|
|
||||||
|
|
||||||
err = resourceSepRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.SetId(id.String())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepRead: called for %s id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
sep, err := utilitySepCheckPresence(d, m)
|
|
||||||
if sep == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("ckey", sep.Ckey)
|
|
||||||
d.Set("meta", flattenMeta(sep.Meta))
|
|
||||||
d.Set("consumed_by", sep.ConsumedBy)
|
|
||||||
d.Set("desc", sep.Desc)
|
|
||||||
d.Set("gid", sep.Gid)
|
|
||||||
d.Set("guid", sep.Guid)
|
|
||||||
d.Set("sep_id", sep.Id)
|
|
||||||
d.Set("milestones", sep.Milestones)
|
|
||||||
d.Set("name", sep.Name)
|
|
||||||
d.Set("obj_status", sep.ObjStatus)
|
|
||||||
d.Set("provided_by", sep.ProvidedBy)
|
|
||||||
d.Set("tech_status", sep.TechStatus)
|
|
||||||
d.Set("type", sep.Type)
|
|
||||||
data, _ := json.Marshal(sep.Config)
|
|
||||||
d.Set("config", string(data))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepDelete: called for %s, id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
sepDes, err := utilitySepCheckPresence(d, m)
|
|
||||||
if sepDes == nil {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
|
|
||||||
_, err = controller.decortAPICall("POST", sepDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceSepExists: called for %s, id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
sepDes, err := utilitySepCheckPresence(d, m)
|
|
||||||
if sepDes == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepEdit: called for %s, id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
if d.HasChange("decommission") {
|
|
||||||
decommission := d.Get("decommission").(bool)
|
|
||||||
if decommission {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("clear_physically", strconv.FormatBool(d.Get("clear_physically").(bool)))
|
|
||||||
_, err := c.decortAPICall("POST", sepDecommissionAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
if d.HasChange("upd_capacity_limit") {
|
|
||||||
updCapacityLimit := d.Get("upd_capacity_limit").(bool)
|
|
||||||
if updCapacityLimit {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
_, err := c.decortAPICall("POST", sepUpdateCapacityLimitAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
if d.HasChange("config") {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("config", d.Get("config").(string))
|
|
||||||
_, err := c.decortAPICall("POST", sepConfigValidateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = c.decortAPICall("POST", sepConfigInsertAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
if d.HasChange("field_edit") {
|
|
||||||
fieldConfig := d.Get("field_edit").([]interface{})
|
|
||||||
field := fieldConfig[0].(map[string]interface{})
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("field_name", field["field_name"].(string))
|
|
||||||
urlValues.Add("field_value", field["field_value"].(string))
|
|
||||||
urlValues.Add("field_type", field["field_type"].(string))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", sepConfigFieldEditAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
if err := resourceSepRead(d, m); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepChangeEnabled(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
var api string
|
|
||||||
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
if d.Get("enable").(bool) {
|
|
||||||
api = sepEnableAPI
|
|
||||||
} else {
|
|
||||||
api = sepDisableAPI
|
|
||||||
}
|
|
||||||
resp, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
res, err := strconv.ParseBool(resp)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !res {
|
|
||||||
return errors.New("Cannot enable/disable")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepUpdateNodes(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepUpdateNodes: called for %s, id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
t1, t2 := d.GetChange("consumed_by")
|
|
||||||
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
|
|
||||||
consumedIds := make([]interface{}, 0)
|
|
||||||
temp := ""
|
|
||||||
api := ""
|
|
||||||
|
|
||||||
if d1, d2 := t1.([]interface{}), t2.([]interface{}); len(d1) > len(d2) {
|
|
||||||
for _, n := range d2 {
|
|
||||||
if !findElInt(d1, n) {
|
|
||||||
consumedIds = append(consumedIds, n)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
api = sepDelConsumerNodesAPI
|
|
||||||
} else {
|
|
||||||
consumedIds = d.Get("consumed_by").([]interface{})
|
|
||||||
api = sepAddConsumerNodesAPI
|
|
||||||
}
|
|
||||||
|
|
||||||
l := len(consumedIds)
|
|
||||||
for i, consumedId := range consumedIds {
|
|
||||||
s := strconv.Itoa(consumedId.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("consumer_nids", temp)
|
|
||||||
_, err := c.decortAPICall("POST", api, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func findElInt(sl []interface{}, el interface{}) bool {
|
|
||||||
for _, e := range sl {
|
|
||||||
if e.(int) == el.(int) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepUpdateProviders(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepUpdateProviders: called for %s, id: %d", d.Get("name").(string), d.Get("sep_id").(int))
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
providerIds := d.Get("provided_by").([]interface{})
|
|
||||||
temp := ""
|
|
||||||
l := len(providerIds)
|
|
||||||
for i, providerId := range providerIds {
|
|
||||||
s := strconv.Itoa(providerId.(int))
|
|
||||||
if i != (l - 1) {
|
|
||||||
s += ","
|
|
||||||
}
|
|
||||||
temp = temp + s
|
|
||||||
}
|
|
||||||
temp = "[" + temp + "]"
|
|
||||||
urlValues.Add("provider_nids", temp)
|
|
||||||
_, err := c.decortAPICall("POST", sepAddProviderNodesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "sep type des id",
|
|
||||||
},
|
|
||||||
"upd_capacity_limit": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "Update SEP capacity limit",
|
|
||||||
},
|
|
||||||
"decommission": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "unlink everything that exists from SEP",
|
|
||||||
},
|
|
||||||
"clear_physically": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: true,
|
|
||||||
Description: "clear disks and images physically",
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Description: "sep config string",
|
|
||||||
},
|
|
||||||
"ckey": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeString,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"consumed_by": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "list of consumer nodes IDs",
|
|
||||||
},
|
|
||||||
"desc": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Optional: true,
|
|
||||||
Description: "sep description",
|
|
||||||
},
|
|
||||||
"gid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
Description: "grid (platform) ID",
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"milestones": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "SEP name",
|
|
||||||
},
|
|
||||||
"obj_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"provided_by": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
Description: "list of provider nodes IDs",
|
|
||||||
},
|
|
||||||
"tech_status": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
Description: "type of storage",
|
|
||||||
},
|
|
||||||
"enable": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "enable SEP after creation",
|
|
||||||
},
|
|
||||||
"field_edit": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
MaxItems: 1,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"field_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"field_value": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"field_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSep() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceSepCreate,
|
|
||||||
Read: resourceSepRead,
|
|
||||||
Update: resourceSepEdit,
|
|
||||||
Delete: resourceSepDelete,
|
|
||||||
Exists: resourceSepExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceSepSchemaMake(),
|
|
||||||
|
|
||||||
CustomizeDiff: customdiff.All(
|
|
||||||
customdiff.IfValueChange("enable", func(old, new, meta interface{}) bool {
|
|
||||||
return old.(bool) != new.(bool)
|
|
||||||
}, resourceSepChangeEnabled),
|
|
||||||
customdiff.IfValueChange("consumed_by", func(old, new, meta interface{}) bool {
|
|
||||||
o := old.([]interface{})
|
|
||||||
n := new.([]interface{})
|
|
||||||
|
|
||||||
if len(o) != len(n) {
|
|
||||||
return true
|
|
||||||
} else if len(o) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for i, v := range n {
|
|
||||||
if v.(int) == o[i].(int) {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count == 0
|
|
||||||
}, resourceSepUpdateNodes),
|
|
||||||
customdiff.IfValueChange("provided_by", func(old, new, meta interface{}) bool {
|
|
||||||
o := old.([]interface{})
|
|
||||||
n := new.([]interface{})
|
|
||||||
|
|
||||||
if len(o) != len(n) {
|
|
||||||
return true
|
|
||||||
} else if len(o) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for i, v := range n {
|
|
||||||
if v.(int) == o[i].(int) {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count == 0
|
|
||||||
}, resourceSepUpdateProviders),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceSepConfigCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepConfigCreate: called for sep id %d", d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
if _, ok := d.GetOk("sep_id"); ok {
|
|
||||||
if exists, err := resourceSepConfigExists(d, m); exists {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
id := uuid.New()
|
|
||||||
d.SetId(id.String())
|
|
||||||
err = resourceSepConfigRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("provided sep id config does not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
return resourceSepConfigRead(d, m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfigRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepConfigRead: called for sep id: %d", d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
sepConfig, err := utilitySepConfigCheckPresence(d, m)
|
|
||||||
if sepConfig == nil {
|
|
||||||
d.SetId("")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data, _ := json.Marshal(sepConfig)
|
|
||||||
d.Set("config", string(data))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfigDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
d.SetId("")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfigExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
log.Debugf("resourceSepConfigExists: called for sep id: %d", d.Get("sep_id").(int))
|
|
||||||
|
|
||||||
sepDesConfig, err := utilitySepConfigCheckPresence(d, m)
|
|
||||||
if sepDesConfig == nil {
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfigEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSepConfigEdit: called for sep id: %d", d.Get("sep_id").(int))
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
if d.HasChange("config") {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("config", d.Get("config").(string))
|
|
||||||
_, err := c.decortAPICall("POST", sepConfigValidateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = c.decortAPICall("POST", sepConfigInsertAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues = &url.Values{}
|
|
||||||
if d.HasChange("field_edit") {
|
|
||||||
fieldConfig := d.Get("field_edit").([]interface{})
|
|
||||||
field := fieldConfig[0].(map[string]interface{})
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("field_name", field["field_name"].(string))
|
|
||||||
urlValues.Add("field_value", field["field_value"].(string))
|
|
||||||
urlValues.Add("field_type", field["field_type"].(string))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", sepConfigFieldEditAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err := resourceSepConfigRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfigSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"sep_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"field_edit": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
MaxItems: 1,
|
|
||||||
Optional: true,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Resource{
|
|
||||||
Schema: map[string]*schema.Schema{
|
|
||||||
"field_name": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"field_value": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
"field_type": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSepConfig() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceSepConfigCreate,
|
|
||||||
Read: resourceSepConfigRead,
|
|
||||||
Update: resourceSepConfigEdit,
|
|
||||||
Delete: resourceSepConfigDelete,
|
|
||||||
Exists: resourceSepConfigExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
Schema: resourceSepConfigSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/customdiff"
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func resourceSnapshotCreate(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSnapshotCreate: called for snapshot %s", d.Get("label").(string))
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("label", d.Get("label").(string))
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int)))
|
|
||||||
|
|
||||||
snapshotId, err := controller.decortAPICall("POST", snapshotCreateAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
snapshotId = strings.ReplaceAll(snapshotId, "\"", "")
|
|
||||||
|
|
||||||
d.SetId(snapshotId)
|
|
||||||
d.Set("guid", snapshotId)
|
|
||||||
|
|
||||||
err = resourceSnapshotRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotRead(d *schema.ResourceData, m interface{}) error {
|
|
||||||
snapshot, err := utilitySnapshotCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
d.Set("timestamp", snapshot.Timestamp)
|
|
||||||
d.Set("guid", snapshot.Guid)
|
|
||||||
d.Set("disks", snapshot.Disks)
|
|
||||||
d.Set("label", snapshot.Label)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotDelete(d *schema.ResourceData, m interface{}) error {
|
|
||||||
log.Debugf("resourceSnapshotDelete: called for %s, id: %s", d.Get("label").(string), d.Id())
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int)))
|
|
||||||
urlValues.Add("label", d.Get("label").(string))
|
|
||||||
|
|
||||||
_, err := controller.decortAPICall("POST", snapshotDeleteAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.SetId("")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
|
||||||
snapshot, err := utilitySnapshotCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if snapshot == nil {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotEdit(d *schema.ResourceData, m interface{}) error {
|
|
||||||
err := resourceSnapshotRead(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotRollback(d *schema.ResourceDiff, m interface{}) error {
|
|
||||||
c := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int)))
|
|
||||||
urlValues.Add("label", d.Get("label").(string))
|
|
||||||
|
|
||||||
_, err := c.decortAPICall("POST", snapshotRollbackAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshotSchemaMake() map[string]*schema.Schema {
|
|
||||||
return map[string]*schema.Schema{
|
|
||||||
"compute_id": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "ID of the compute instance to create snapshot for.",
|
|
||||||
},
|
|
||||||
"label": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Required: true,
|
|
||||||
ForceNew: true,
|
|
||||||
Description: "text label for snapshot. Must be unique among this compute snapshots.",
|
|
||||||
},
|
|
||||||
"rollback": {
|
|
||||||
Type: schema.TypeBool,
|
|
||||||
Optional: true,
|
|
||||||
Default: false,
|
|
||||||
Description: "is rollback the snapshot",
|
|
||||||
},
|
|
||||||
"disks": {
|
|
||||||
Type: schema.TypeList,
|
|
||||||
Computed: true,
|
|
||||||
Elem: &schema.Schema{
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"guid": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
Description: "guid of the snapshot",
|
|
||||||
},
|
|
||||||
"timestamp": {
|
|
||||||
Type: schema.TypeInt,
|
|
||||||
Computed: true,
|
|
||||||
Description: "timestamp",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceSnapshot() *schema.Resource {
|
|
||||||
return &schema.Resource{
|
|
||||||
SchemaVersion: 1,
|
|
||||||
|
|
||||||
Create: resourceSnapshotCreate,
|
|
||||||
Read: resourceSnapshotRead,
|
|
||||||
Update: resourceSnapshotEdit,
|
|
||||||
Delete: resourceSnapshotDelete,
|
|
||||||
Exists: resourceSnapshotExists,
|
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
|
||||||
State: schema.ImportStatePassthrough,
|
|
||||||
},
|
|
||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
|
||||||
Create: &Timeout60s,
|
|
||||||
Read: &Timeout30s,
|
|
||||||
Update: &Timeout60s,
|
|
||||||
Delete: &Timeout60s,
|
|
||||||
Default: &Timeout60s,
|
|
||||||
},
|
|
||||||
|
|
||||||
CustomizeDiff: customdiff.All(
|
|
||||||
customdiff.IfValueChange("rollback", func(old, new, meta interface{}) bool {
|
|
||||||
o := old.(bool)
|
|
||||||
if o != new.(bool) && !o {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}, resourceSnapshotRollback),
|
|
||||||
),
|
|
||||||
|
|
||||||
Schema: resourceSnapshotSchemaMake(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountCheckPresence(d *schema.ResourceData, m interface{}) (*AccountWithResources, error) {
|
|
||||||
account := &AccountWithResources{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if (strconv.Itoa(d.Get("account_id").(int))) != "0" {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("accountId", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountCheckPresence: load account")
|
|
||||||
accountRaw, err := controller.decortAPICall("POST", accountGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountRaw), &account)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return account, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountAuditsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountAuditsList, error) {
|
|
||||||
accountAuditsList := AccountAuditsList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountAuditsListCheckPresence: load account list")
|
|
||||||
accountAuditsListRaw, err := controller.decortAPICall("POST", accountAuditsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountAuditsListRaw), &accountAuditsList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountAuditsList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountComputesListCheckPresence(d *schema.ResourceData, m interface{}) (AccountComputesList, error) {
|
|
||||||
accountComputesList := AccountComputesList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountComputesListCheckPresence: load account list")
|
|
||||||
accountComputesListRaw, err := controller.decortAPICall("POST", accountListComputesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountComputesListRaw), &accountComputesList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountComputesList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountConsumedUnitsCheckPresence(d *schema.ResourceData, m interface{}) (*ResourceLimits, error) {
|
|
||||||
accountConsumedUnits := &ResourceLimits{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountConsumedUnitsCheckPresence: load account list")
|
|
||||||
accountConsumedUnitsRaw, err := controller.decortAPICall("POST", accountGetConsumedUnitsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountConsumedUnitsRaw), accountConsumedUnits)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountConsumedUnits, nil
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountConsumedUnitsByTypeCheckPresence(d *schema.ResourceData, m interface{}) (float64, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
urlValues.Add("cutype", strings.ToUpper(d.Get("cu_type").(string)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountConsumedUnitsByTypeCheckPresence")
|
|
||||||
resultRaw, err := controller.decortAPICall("POST", accountGetConsumedUnitsByTypeAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
result, err := strconv.ParseFloat(resultRaw, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountDeletedListCheckPresence(d *schema.ResourceData, m interface{}) (AccountCloudApiList, error) {
|
|
||||||
accountDeletedList := AccountCloudApiList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountDeletedListCheckPresence: load")
|
|
||||||
accountDeletedListRaw, err := controller.decortAPICall("POST", accountListDeletedAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountDeletedListRaw), &accountDeletedList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountDeletedList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountDisksListCheckPresence(d *schema.ResourceData, m interface{}) (AccountDisksList, error) {
|
|
||||||
accountDisksList := AccountDisksList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountDisksListCheckPresence: load account list")
|
|
||||||
accountDisksListRaw, err := controller.decortAPICall("POST", accountListDisksAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountDisksListRaw), &accountDisksList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountDisksList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountFlipGroupsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountFlipGroupsList, error) {
|
|
||||||
accountFlipGroupsList := AccountFlipGroupsList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountFlipGroupsListCheckPresence")
|
|
||||||
accountFlipGroupsListRaw, err := controller.decortAPICall("POST", accountListFlipGroupsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountFlipGroupsListRaw), &accountFlipGroupsList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountFlipGroupsList, nil
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountListCheckPresence(d *schema.ResourceData, m interface{}) (AccountCloudApiList, error) {
|
|
||||||
accountList := AccountCloudApiList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountListCheckPresence: load account list")
|
|
||||||
accountListRaw, err := controller.decortAPICall("POST", accountListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountListRaw), &accountList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountList, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*uncomment for cloudbroker
|
|
||||||
func utilityAccountListCheckPresence(d *schema.ResourceData, m interface{}) (AccountList, error) {
|
|
||||||
accountList := AccountList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountListCheckPresence: load account list")
|
|
||||||
accountListRaw, err := controller.decortAPICall("POST", accountListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountListRaw), &accountList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountList, nil
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountReservedUnitsCheckPresence(d *schema.ResourceData, m interface{}) (*ResourceLimits, error) {
|
|
||||||
accountReservedUnits := &ResourceLimits{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountReservedUnitsCheckPresence: load units")
|
|
||||||
accountReservedUnitsRaw, err := controller.decortAPICall("POST", accountGetReservedUnitsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountReservedUnitsRaw), accountReservedUnits)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountReservedUnits, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountRGListCheckPresence(d *schema.ResourceData, m interface{}) (AccountRGList, error) {
|
|
||||||
accountRGList := AccountRGList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountRGListCheckPresence: load account list")
|
|
||||||
accountRGListRaw, err := controller.decortAPICall("POST", accountListRGAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountRGListRaw), &accountRGList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountRGList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountTemplatesListCheckPresence(d *schema.ResourceData, m interface{}) (AccountTemplatesList, error) {
|
|
||||||
accountTemplatesList := AccountTemplatesList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountTemplatesListCheckPresence: load")
|
|
||||||
accountTemplatesListRaw, err := controller.decortAPICall("POST", accountListTemplatesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountTemplatesListRaw), &accountTemplatesList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountTemplatesList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityAccountVinsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountVinsList, error) {
|
|
||||||
accountVinsList := AccountVinsList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityAccountVinsListCheckPresence: load account list")
|
|
||||||
accountVinsListRaw, err := controller.decortAPICall("POST", accountListVinsAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(accountVinsListRaw), &accountVinsList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountVinsList, nil
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityBasicServiceDeletedListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceList, error) {
|
|
||||||
basicServiceDeletedList := BasicServiceList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if accountId, ok := d.GetOk("account_id"); ok {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(accountId.(int)))
|
|
||||||
}
|
|
||||||
if rgId, ok := d.GetOk("rg_id"); ok {
|
|
||||||
urlValues.Add("rgId", strconv.Itoa(rgId.(int)))
|
|
||||||
}
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityBasicServiceDeletedListCheckPresence")
|
|
||||||
basicServiceDeletedListRaw, err := controller.decortAPICall("POST", bserviceListDeletedAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(basicServiceDeletedListRaw), &basicServiceDeletedList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return basicServiceDeletedList, nil
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityBasicServiceCheckPresence(d *schema.ResourceData, m interface{}) (*BasicServiceExtend, error) {
|
|
||||||
bservice := &BasicServiceExtend{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if (strconv.Itoa(d.Get("service_id").(int))) != "0" {
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("serviceId", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityBasicServiceCheckPresence")
|
|
||||||
bserviceRaw, err := controller.decortAPICall("POST", bserviceGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(bserviceRaw), &bservice)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return bservice, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityBasicServiceGroupCheckPresence(d *schema.ResourceData, m interface{}) (*BasicServiceGroup, error) {
|
|
||||||
bserviceGroup := &BasicServiceGroup{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int)))
|
|
||||||
if (strconv.Itoa(d.Get("compgroup_id").(int))) != "0" {
|
|
||||||
urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int)))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("compgroupId", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityBasicServiceGroupCheckPresence")
|
|
||||||
bserviceGroupRaw, err := controller.decortAPICall("POST", bserviceGroupGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(bserviceGroupRaw), &bserviceGroup)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return bserviceGroup, nil
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityBasicServiceListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceList, error) {
|
|
||||||
basicServiceList := BasicServiceList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if accountId, ok := d.GetOk("account_id"); ok {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(accountId.(int)))
|
|
||||||
}
|
|
||||||
if rgId, ok := d.GetOk("rg_id"); ok {
|
|
||||||
urlValues.Add("rgId", strconv.Itoa(rgId.(int)))
|
|
||||||
}
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityBasicServiceListCheckPresence")
|
|
||||||
basicServiceListRaw, err := controller.decortAPICall("POST", bserviceListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(basicServiceListRaw), &basicServiceList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return basicServiceList, nil
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityBasicServiceSnapshotListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceSnapshots, error) {
|
|
||||||
basicServiceSnapshotList := BasicServiceSnapshots{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if serviceId, ok := d.GetOk("service_id"); ok {
|
|
||||||
urlValues.Add("serviceId", strconv.Itoa(serviceId.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityBasicServiceSnapshotListCheckPresence")
|
|
||||||
basicServiceSnapshotListRaw, err := controller.decortAPICall("POST", bserviceSnapshotListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(basicServiceSnapshotListRaw), &basicServiceSnapshotList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return basicServiceSnapshotList, nil
|
|
||||||
}
|
|
||||||
@@ -1,298 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ctrl *ControllerCfg) utilityComputeExtraDisksConfigure(d *schema.ResourceData, do_delta bool) error {
|
|
||||||
// d is filled with data according to computeResource schema, so extra disks config is retrieved via "extra_disks" key
|
|
||||||
// If do_delta is true, this function will identify changes between new and existing specs for extra disks and try to
|
|
||||||
// update compute configuration accordingly
|
|
||||||
// Otherwise it will apply whatever is found in the new set of "extra_disks" right away.
|
|
||||||
// Primary use of do_delta=false is when calling this function from compute Create handler.
|
|
||||||
|
|
||||||
// Note that this function will not abort on API errors, but will continue to configure (attach / detach) other individual
|
|
||||||
// disks via atomic API calls. However, it will not retry failed manipulation on the same disk.
|
|
||||||
log.Debugf("utilityComputeExtraDisksConfigure: called for Compute ID %s with do_delta = %t", d.Id(), do_delta)
|
|
||||||
|
|
||||||
// NB: as of rc-1.25 "extra_disks" are TypeSet with the elem of TypeInt
|
|
||||||
old_set, new_set := d.GetChange("extra_disks")
|
|
||||||
|
|
||||||
apiErrCount := 0
|
|
||||||
var lastSavedError error
|
|
||||||
|
|
||||||
if !do_delta {
|
|
||||||
if new_set.(*schema.Set).Len() < 1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, disk := range new_set.(*schema.Set).List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("diskId", fmt.Sprintf("%d", disk.(int)))
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeDiskAttachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to attach extra disk - partial resource update
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apiErrCount > 0 {
|
|
||||||
log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when attaching disks to Compute ID %s. Last error was: %s",
|
|
||||||
apiErrCount, d.Id(), lastSavedError)
|
|
||||||
return lastSavedError
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
detach_set := old_set.(*schema.Set).Difference(new_set.(*schema.Set))
|
|
||||||
log.Debugf("utilityComputeExtraDisksConfigure: detach set has %d items for Compute ID %s", detach_set.Len(), d.Id())
|
|
||||||
for _, diskId := range detach_set.List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("diskId", fmt.Sprintf("%d", diskId.(int)))
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeDiskDetachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to detach disk - there will be partial resource update
|
|
||||||
log.Errorf("utilityComputeExtraDisksConfigure: failed to detach disk ID %d from Compute ID %s: %s", diskId.(int), d.Id(), err)
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set))
|
|
||||||
log.Debugf("utilityComputeExtraDisksConfigure: attach set has %d items for Compute ID %s", attach_set.Len(), d.Id())
|
|
||||||
for _, diskId := range attach_set.List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("diskId", fmt.Sprintf("%d", diskId.(int)))
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeDiskAttachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to attach disk - there will be partial resource update
|
|
||||||
log.Errorf("utilityComputeExtraDisksConfigure: failed to attach disk ID %d to Compute ID %s: %s", diskId.(int), d.Id(), err)
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apiErrCount > 0 {
|
|
||||||
log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when managing disks of Compute ID %s. Last error was: %s",
|
|
||||||
apiErrCount, d.Id(), lastSavedError)
|
|
||||||
return lastSavedError
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceData, do_delta bool) error {
|
|
||||||
// "d" is filled with data according to computeResource schema, so extra networks config is retrieved via "network" key
|
|
||||||
// If do_delta is true, this function will identify changes between new and existing specs for network and try to
|
|
||||||
// update compute configuration accordingly
|
|
||||||
// Otherwise it will apply whatever is found in the new set of "network" right away.
|
|
||||||
// Primary use of do_delta=false is when calling this function from compute Create handler.
|
|
||||||
|
|
||||||
old_set, new_set := d.GetChange("network")
|
|
||||||
|
|
||||||
apiErrCount := 0
|
|
||||||
var lastSavedError error
|
|
||||||
|
|
||||||
if !do_delta {
|
|
||||||
if new_set.(*schema.Set).Len() < 1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, runner := range new_set.(*schema.Set).List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
net_data := runner.(map[string]interface{})
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("netType", net_data["net_type"].(string))
|
|
||||||
urlValues.Add("netId", fmt.Sprintf("%d", net_data["net_id"].(int)))
|
|
||||||
ipaddr, ipSet := net_data["ip_address"] // "ip_address" key is optional
|
|
||||||
if ipSet {
|
|
||||||
urlValues.Add("ipAddr", ipaddr.(string))
|
|
||||||
}
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeNetAttachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to attach network - partial resource update
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apiErrCount > 0 {
|
|
||||||
log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s",
|
|
||||||
apiErrCount, d.Id(), lastSavedError)
|
|
||||||
return lastSavedError
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
detach_set := old_set.(*schema.Set).Difference(new_set.(*schema.Set))
|
|
||||||
log.Debugf("utilityComputeNetworksConfigure: detach set has %d items for Compute ID %s", detach_set.Len(), d.Id())
|
|
||||||
for _, runner := range detach_set.List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
net_data := runner.(map[string]interface{})
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("ipAddr", net_data["ip_address"].(string))
|
|
||||||
urlValues.Add("mac", net_data["mac"].(string))
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeNetDetachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to detach this network - there will be partial resource update
|
|
||||||
log.Errorf("utilityComputeNetworksConfigure: failed to detach net ID %d of type %s from Compute ID %s: %s",
|
|
||||||
net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err)
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set))
|
|
||||||
log.Debugf("utilityComputeNetworksConfigure: attach set has %d items for Compute ID %s", attach_set.Len(), d.Id())
|
|
||||||
for _, runner := range attach_set.List() {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
net_data := runner.(map[string]interface{})
|
|
||||||
urlValues.Add("computeId", d.Id())
|
|
||||||
urlValues.Add("netId", fmt.Sprintf("%d", net_data["net_id"].(int)))
|
|
||||||
urlValues.Add("netType", net_data["net_type"].(string))
|
|
||||||
if net_data["ip_address"].(string) != "" {
|
|
||||||
urlValues.Add("ipAddr", net_data["ip_address"].(string))
|
|
||||||
}
|
|
||||||
_, err := ctrl.decortAPICall("POST", ComputeNetAttachAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
// failed to attach this network - there will be partial resource update
|
|
||||||
log.Errorf("utilityComputeNetworksConfigure: failed to attach net ID %d of type %s to Compute ID %s: %s",
|
|
||||||
net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err)
|
|
||||||
apiErrCount++
|
|
||||||
lastSavedError = err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apiErrCount > 0 {
|
|
||||||
log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s",
|
|
||||||
apiErrCount, d.Id(), lastSavedError)
|
|
||||||
return lastSavedError
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func utilityComputeCheckPresence(d *schema.ResourceData, m interface{}) (string, error) {
|
|
||||||
// This function tries to locate Compute by one of the following approaches:
|
|
||||||
// - if compute_id is specified - locate by compute ID
|
|
||||||
// - if compute_name is specified - locate by a combination of compute name and resource
|
|
||||||
// group ID
|
|
||||||
//
|
|
||||||
// If succeeded, it returns non-empty string that contains JSON formatted facts about the
|
|
||||||
// Compute as returned by compute/get API call.
|
|
||||||
// Otherwise it returns empty string and meaningful error.
|
|
||||||
//
|
|
||||||
// This function does not modify its ResourceData argument, so it is safe to use it as core
|
|
||||||
// method for resource's Exists method.
|
|
||||||
//
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
// make it possible to use "read" & "check presence" functions with compute ID set so
|
|
||||||
// that Import of Compute resource is possible
|
|
||||||
idSet := false
|
|
||||||
theId, err := strconv.Atoi(d.Id())
|
|
||||||
if err != nil || theId <= 0 {
|
|
||||||
computeId, argSet := d.GetOk("compute_id") // NB: compute_id is NOT present in computeResource schema!
|
|
||||||
if argSet {
|
|
||||||
theId = computeId.(int)
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if idSet {
|
|
||||||
// compute ID is specified, try to get compute instance straight by this ID
|
|
||||||
log.Debugf("utilityComputeCheckPresence: locating compute by its ID %d", theId)
|
|
||||||
urlValues.Add("computeId", fmt.Sprintf("%d", theId))
|
|
||||||
computeFacts, err := controller.decortAPICall("POST", ComputeGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return computeFacts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID was not set in the schema upon entering this function - work through Compute name
|
|
||||||
// and RG ID
|
|
||||||
computeName, argSet := d.GetOk("name")
|
|
||||||
if !argSet {
|
|
||||||
return "", fmt.Errorf("Cannot locate compute instance if name is empty and no compute ID specified")
|
|
||||||
}
|
|
||||||
|
|
||||||
rgId, argSet := d.GetOk("rg_id")
|
|
||||||
if !argSet {
|
|
||||||
return "", fmt.Errorf("Cannot locate compute by name %s if no resource group ID is set", computeName.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
urlValues.Add("rgId", fmt.Sprintf("%d", rgId))
|
|
||||||
apiResp, err := controller.decortAPICall("POST", RgListComputesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityComputeCheckPresence: ready to unmarshal string %s", apiResp)
|
|
||||||
|
|
||||||
computeList := RgListComputesResp{}
|
|
||||||
err = json.Unmarshal([]byte(apiResp), &computeList)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// log.Printf("%#v", computeList)
|
|
||||||
log.Debugf("utilityComputeCheckPresence: traversing decoded JSON of length %d", len(computeList))
|
|
||||||
for index, item := range computeList {
|
|
||||||
// need to match Compute by name, skip Computes with the same name in DESTROYED satus
|
|
||||||
if item.Name == computeName.(string) && item.Status != "DESTROYED" {
|
|
||||||
log.Debugf("utilityComputeCheckPresence: index %d, matched name %s", index, item.Name)
|
|
||||||
// we found the Compute we need - now get detailed information via compute/get API
|
|
||||||
cgetValues := &url.Values{}
|
|
||||||
cgetValues.Add("computeId", fmt.Sprintf("%d", item.ID))
|
|
||||||
apiResp, err = controller.decortAPICall("POST", ComputeGetAPI, cgetValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return apiResp, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", nil // there should be no error if Compute does not exist
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityDiskCheckPresence(d *schema.ResourceData, m interface{}) (string, error) {
|
|
||||||
// This function tries to locate Disk by one of the following algorithms depending on
|
|
||||||
// the parameters passed:
|
|
||||||
// - if disk ID is specified -> by disk ID
|
|
||||||
// - if disk name is specifeid -> by disk name and either account ID or account name
|
|
||||||
//
|
|
||||||
// NOTE: disk names are not unique, so the first occurence of this name in the account will
|
|
||||||
// be returned. There is no such ambiguity when locating disk by its ID.
|
|
||||||
//
|
|
||||||
// If succeeded, it returns non empty string that contains JSON formatted facts about the disk
|
|
||||||
// as returned by disks/get API call.
|
|
||||||
// Otherwise it returns empty string and meaningful error.
|
|
||||||
//
|
|
||||||
// This function does not modify its ResourceData argument, so it is safe to use it as core
|
|
||||||
// method for resource's Exists method.
|
|
||||||
//
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
// make it possible to use "read" & "check presence" functions with disk ID set so
|
|
||||||
// that Import of preexisting Disk resource is possible
|
|
||||||
idSet := false
|
|
||||||
theId, err := strconv.Atoi(d.Id())
|
|
||||||
if err != nil || theId <= 0 {
|
|
||||||
diskId, argSet := d.GetOk("disk_id")
|
|
||||||
if argSet {
|
|
||||||
theId = diskId.(int)
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if idSet {
|
|
||||||
// disk ID is specified, try to get disk instance straight by this ID
|
|
||||||
log.Debugf("utilityDiskCheckPresence: locating disk by its ID %d", theId)
|
|
||||||
urlValues.Add("diskId", fmt.Sprintf("%d", theId))
|
|
||||||
diskFacts, err := controller.decortAPICall("POST", DisksGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return diskFacts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID or disk_di was not set in the schema upon entering this function - rely on Disk name
|
|
||||||
// and Account ID to find the disk
|
|
||||||
diskName, argSet := d.GetOk("name")
|
|
||||||
if !argSet {
|
|
||||||
// no disk ID and no disk name - we cannot locate disk in this case
|
|
||||||
return "", fmt.Errorf("Cannot locate disk if name is empty and no disk ID specified")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid account ID is required to locate disks
|
|
||||||
// obtain Account ID by account name - it should not be zero on success
|
|
||||||
|
|
||||||
urlValues.Add("accountId", fmt.Sprintf("%d", d.Get("account_id").(int)))
|
|
||||||
diskFacts, err := controller.decortAPICall("POST", DisksListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityDiskCheckPresence: ready to unmarshal string %s", diskFacts)
|
|
||||||
|
|
||||||
disksList := DisksListResp{}
|
|
||||||
err = json.Unmarshal([]byte(diskFacts), &disksList)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// log.Printf("%#v", vm_list)
|
|
||||||
log.Debugf("utilityDiskCheckPresence: traversing decoded JSON of length %d", len(disksList))
|
|
||||||
for index, item := range disksList {
|
|
||||||
// need to match disk by name, return the first match
|
|
||||||
if item.Name == diskName.(string) && item.Status != "DESTROYED" {
|
|
||||||
log.Debugf("utilityDiskCheckPresence: index %d, matched disk name %q", index, item.Name)
|
|
||||||
// we found the disk we need - not get detailed information via API call to disks/get
|
|
||||||
/*
|
|
||||||
// TODO: this may not be optimal as it initiates one extra call to the DECORT controller
|
|
||||||
// in spite of the fact that we already have all required information about the disk in
|
|
||||||
// item variable
|
|
||||||
//
|
|
||||||
get_urlValues := &url.Values{}
|
|
||||||
get_urlValues.Add("diskId", fmt.Sprintf("%d", item.ID))
|
|
||||||
diskFacts, err = controller.decortAPICall("POST", DisksGetAPI, get_urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return diskFacts, nil
|
|
||||||
*/
|
|
||||||
reencodedItem, err := json.Marshal(item)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(reencodedItem[:]), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", nil // there should be no error if disk does not exist
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityDiskListCheckPresence(d *schema.ResourceData, m interface{}) (DisksListResp, error) {
|
|
||||||
diskList := DisksListResp{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
if diskType, ok := d.GetOk("type"); ok {
|
|
||||||
urlValues.Add("type", strings.ToUpper(diskType.(string)))
|
|
||||||
}
|
|
||||||
if accountId, ok := d.GetOk("accountId"); ok {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(accountId.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityDiskListCheckPresence: load grid list")
|
|
||||||
diskListRaw, err := controller.decortAPICall("POST", DisksListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(diskListRaw), &diskList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return diskList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityExtnetCheckPresence(d *schema.ResourceData, m interface{}) (*ExtnetDetailed, error) {
|
|
||||||
extnet := &ExtnetDetailed{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("net_id", strconv.Itoa(d.Get("net_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityExtnetCheckPresence")
|
|
||||||
extnetRaw, err := controller.decortAPICall("POST", extnetGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(extnetRaw), &extnet)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return extnet, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityExtnetComputesListCheckPresence(d *schema.ResourceData, m interface{}) (ExtnetComputesList, error) {
|
|
||||||
extnetComputesList := ExtnetComputesList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityExtnetComputesListCheckPresence")
|
|
||||||
extnetComputesListRaw, err := controller.decortAPICall("POST", extnetListComputesAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(extnetComputesListRaw), &extnetComputesList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return extnetComputesList, nil
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityExtnetDefaultCheckPresence(_ *schema.ResourceData, m interface{}) (string, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
log.Debugf("utilityExtnetDefaultCheckPresence")
|
|
||||||
res, err := controller.decortAPICall("POST", extnetGetDefaultAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityExtnetListCheckPresence(d *schema.ResourceData, m interface{}) (ExtnetList, error) {
|
|
||||||
extnetList := ExtnetList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if accountId, ok := d.GetOk("account_id"); ok {
|
|
||||||
urlValues.Add("accountId", strconv.Itoa(accountId.(int)))
|
|
||||||
}
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityExtnetListCheckPresence")
|
|
||||||
extnetListRaw, err := controller.decortAPICall("POST", extnetListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(extnetListRaw), &extnetList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return extnetList, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityGridCheckPresence(d *schema.ResourceData, m interface{}) (*Grid, error) {
|
|
||||||
grid := &Grid{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if gridId, ok := d.GetOk("grid_id"); ok {
|
|
||||||
urlValues.Add("gridId", strconv.Itoa(gridId.(int)))
|
|
||||||
} else {
|
|
||||||
return nil, errors.New("grid_id is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityGridCheckPresence: load grid")
|
|
||||||
gridRaw, err := controller.decortAPICall("POST", GridGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(gridRaw), grid)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return grid, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityGridListCheckPresence(d *schema.ResourceData, m interface{}) (GridList, error) {
|
|
||||||
gridList := GridList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityGridListCheckPresence: load grid list")
|
|
||||||
gridListRaw, err := controller.decortAPICall("POST", GridListGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(gridListRaw), &gridList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gridList, nil
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityImageCheckPresence(d *schema.ResourceData, m interface{}) (*Image, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if (strconv.Itoa(d.Get("image_id").(int))) != "0" {
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
} else {
|
|
||||||
urlValues.Add("imageId", d.Id())
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", imageGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
image := &Image{}
|
|
||||||
if err := json.Unmarshal([]byte(resp), image); err != nil {
|
|
||||||
return nil, errors.New(fmt.Sprint("Can not unmarshall data to image: ", resp, " ", image))
|
|
||||||
}
|
|
||||||
|
|
||||||
return image, nil
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityImageListCheckPresence(d *schema.ResourceData, m interface{}) (ImageList, error) {
|
|
||||||
imageList := ImageList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if sepId, ok := d.GetOk("sep_id"); ok {
|
|
||||||
urlValues.Add("sepId", strconv.Itoa(sepId.(int)))
|
|
||||||
}
|
|
||||||
if sharedWith, ok := d.GetOk("shared_with"); ok {
|
|
||||||
urlValues.Add("sharedWith", strconv.Itoa(sharedWith.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityImageListCheckPresence: load image list")
|
|
||||||
imageListRaw, err := controller.decortAPICall("POST", imageListGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(imageListRaw), &imageList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return imageList, nil
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityImageListStacksCheckPresence(d *schema.ResourceData, m interface{}) (ImageListStacks, error) {
|
|
||||||
imageListStacks := ImageListStacks{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilityImageListStacksCheckPresence: load image list")
|
|
||||||
imageListRaw, err := controller.decortAPICall("POST", imageListStacksApi, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(imageListRaw), &imageListStacks)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return imageListStacks, nil
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityK8sCheckPresence(d *schema.ResourceData, m interface{}) (*K8sRecord, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", d.Id())
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", K8sGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var k8s K8sRecord
|
|
||||||
if err := json.Unmarshal([]byte(resp), &k8s); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &k8s, nil
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityK8sWgCheckPresence(d *schema.ResourceData, m interface{}) (*K8sNodeRecord, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("k8sId", strconv.Itoa(d.Get("k8s_id").(int)))
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", K8sGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var k8s K8sRecord
|
|
||||||
if err := json.Unmarshal([]byte(resp), &k8s); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
id, err := strconv.Atoi(d.Id())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, wg := range k8s.Groups.Workers {
|
|
||||||
if wg.ID == id {
|
|
||||||
return &wg, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
var DefaultGridID int
|
|
||||||
|
|
||||||
func (controller *ControllerCfg) utilityLocationGetDefaultGridID() (int, error) {
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
log.Debug("utilityLocationGetDefaultGridID: retrieving locations list")
|
|
||||||
apiResp, err := controller.decortAPICall("POST", LocationsListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
locList := LocationsListResp{}
|
|
||||||
err = json.Unmarshal([]byte(apiResp), &locList)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(locList) == 0 {
|
|
||||||
DefaultGridID = 0
|
|
||||||
return 0, fmt.Errorf("utilityLocationGetDefaultGridID: retrieved 0 length locations list")
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultGridID = locList[0].GridID
|
|
||||||
log.Debugf("utilityLocationGetDefaultGridID: default location GridID %d, name %s", DefaultGridID, locList[0].Name)
|
|
||||||
|
|
||||||
return DefaultGridID, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityPcideviceCheckPresence(d *schema.ResourceData, m interface{}) (*Pcidevice, error) {
|
|
||||||
pcideviceList, err := utilityPcideviceListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pcideviceId := 0
|
|
||||||
if (d.Get("device_id").(int)) != 0 {
|
|
||||||
pcideviceId = d.Get("device_id").(int)
|
|
||||||
} else {
|
|
||||||
id, _ := strconv.Atoi(d.Id())
|
|
||||||
pcideviceId = id
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pd := range pcideviceList {
|
|
||||||
if pd.ID == pcideviceId {
|
|
||||||
return &pd, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityPcideviceListCheckPresence(_ *schema.ResourceData, m interface{}) (PcideviceList, error) {
|
|
||||||
pcideviceList := PcideviceList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
pcideviceListRaw, err := controller.decortAPICall("POST", pcideviceListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(pcideviceListRaw), &pcideviceList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return pcideviceList, nil
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityPfwCheckPresence(d *schema.ResourceData, m interface{}) (*PfwRecord, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int)))
|
|
||||||
resp, err := controller.decortAPICall("POST", ComputePfwListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
idS := strings.Split(d.Id(), "-")[1]
|
|
||||||
id, err := strconv.Atoi(idS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var pfws []PfwRecord
|
|
||||||
if err := json.Unmarshal([]byte(resp), &pfws); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pfw := range pfws {
|
|
||||||
if pfw.ID == id {
|
|
||||||
return &pfw, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
// "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
|
|
||||||
)
|
|
||||||
|
|
||||||
// On success this function returns a string, as returned by API rg/get, which could be unmarshalled
|
|
||||||
// into ResgroupGetResp structure
|
|
||||||
func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string, error) {
|
|
||||||
// This function tries to locate resource group by one of the following algorithms depending
|
|
||||||
// on the parameters passed:
|
|
||||||
// - if resource group ID is specified -> by RG ID
|
|
||||||
// - if resource group name is specifeid -> by RG name and either account ID or account name
|
|
||||||
//
|
|
||||||
// If succeeded, it returns non empty string that contains JSON formatted facts about the
|
|
||||||
// resource group as returned by rg/get API call.
|
|
||||||
// Otherwise it returns empty string and a meaningful error.
|
|
||||||
//
|
|
||||||
// NOTE: As our provider always deletes RGs permanently, there is no "restore" method and
|
|
||||||
// consequently we are not interested in matching RGs in DELETED state. Hence, we call
|
|
||||||
// .../rg/list API with includedeleted=false
|
|
||||||
//
|
|
||||||
// This function does not modify its ResourceData argument, so it is safe to use it as core
|
|
||||||
// method for the Terraform resource Exists method.
|
|
||||||
//
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
// make it possible to use "read" & "check presence" functions with RG ID set so
|
|
||||||
// that Import of RG resource is possible
|
|
||||||
idSet := false
|
|
||||||
theId, err := strconv.Atoi(d.Id())
|
|
||||||
if err != nil || theId <= 0 {
|
|
||||||
rgId, argSet := d.GetOk("rg_id")
|
|
||||||
if argSet {
|
|
||||||
theId = rgId.(int)
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if idSet {
|
|
||||||
// go straight for the RG by its ID
|
|
||||||
log.Debugf("utilityResgroupCheckPresence: locating RG by its ID %d", theId)
|
|
||||||
urlValues.Add("rgId", fmt.Sprintf("%d", theId))
|
|
||||||
rgFacts, err := controller.decortAPICall("POST", ResgroupGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return rgFacts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
rgName, argSet := d.GetOk("name")
|
|
||||||
if !argSet {
|
|
||||||
// no RG ID and no RG name - we cannot locate resource group in this case
|
|
||||||
return "", fmt.Errorf("Cannot check resource group presence if name is empty and no resource group ID specified")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valid account ID is required to locate a resource group
|
|
||||||
// obtain Account ID by account name - it should not be zero on success
|
|
||||||
|
|
||||||
urlValues.Add("includedeleted", "false")
|
|
||||||
apiResp, err := controller.decortAPICall("POST", ResgroupListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
// log.Debugf("%s", apiResp)
|
|
||||||
log.Debugf("utilityResgroupCheckPresence: ready to decode response body from %s", ResgroupListAPI)
|
|
||||||
model := ResgroupListResp{}
|
|
||||||
err = json.Unmarshal([]byte(apiResp), &model)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityResgroupCheckPresence: traversing decoded Json of length %d", len(model))
|
|
||||||
for index, item := range model {
|
|
||||||
// match by RG name & account ID
|
|
||||||
if item.Name == rgName.(string) && item.AccountID == d.Get("account_id").(int) {
|
|
||||||
log.Debugf("utilityResgroupCheckPresence: match RG name %s / ID %d, account ID %d at index %d",
|
|
||||||
item.Name, item.ID, item.AccountID, index)
|
|
||||||
|
|
||||||
// not all required information is returned by rg/list API, so we need to initiate one more
|
|
||||||
// call to rg/get to obtain extra data to complete Resource population.
|
|
||||||
// Namely, we need resource quota settings
|
|
||||||
reqValues := &url.Values{}
|
|
||||||
reqValues.Add("rgId", fmt.Sprintf("%d", item.ID))
|
|
||||||
apiResp, err := controller.decortAPICall("POST", ResgroupGetAPI, reqValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return apiResp, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", fmt.Errorf("Cannot find RG name %s owned by account ID %d", rgName, d.Get("account_id").(int))
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityRgListCheckPresence(d *schema.ResourceData, m interface{}) (ResgroupListResp, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
rgList := ResgroupListResp{}
|
|
||||||
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if includedeleted, ok := d.GetOk("includedeleted"); ok {
|
|
||||||
urlValues.Add("includedeleted", strconv.FormatBool(includedeleted.(bool)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityRgListCheckPresence: load rg list")
|
|
||||||
rgListRaw, err := controller.decortAPICall("POST", ResgroupListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(rgListRaw), &rgList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return rgList, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepCheckPresence(d *schema.ResourceData, m interface{}) (*Sep, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
sep := &Sep{}
|
|
||||||
|
|
||||||
if d.Get("sep_id").(int) == 0 {
|
|
||||||
urlValues.Add("sep_id", d.Id())
|
|
||||||
} else {
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilitySepCheckPresence: load sep")
|
|
||||||
sepRaw, err := controller.decortAPICall("POST", sepGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepRaw), sep)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sep, nil
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepConfigCheckPresence(d *schema.ResourceData, m interface{}) (SepConfig, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
sepConfig := SepConfig{}
|
|
||||||
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
|
|
||||||
log.Debugf("utilitySepConfigCheckPresence: load sep config")
|
|
||||||
sepConfigRaw, err := controller.decortAPICall("POST", sepGetConfigAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepConfigRaw), &sepConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sepConfig, nil
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepConsumptionCheckPresence(d *schema.ResourceData, m interface{}) (*SepConsumption, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
sepCons := &SepConsumption{}
|
|
||||||
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
|
|
||||||
sepConsRaw, err := controller.decortAPICall("POST", sepConsumptionAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepConsRaw), sepCons)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sepCons, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepDiskListCheckPresence(d *schema.ResourceData, m interface{}) ([]int, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
sepDiskList := SepDiskList{}
|
|
||||||
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
|
|
||||||
if poolName, ok := d.GetOk("pool_name"); ok {
|
|
||||||
urlValues.Add("pool_name", poolName.(string))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilitySepDiskListCheckPresence: load sep")
|
|
||||||
sepDiskListRaw, err := controller.decortAPICall("POST", sepDiskListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepDiskListRaw), &sepDiskList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sepDiskList, nil
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepListCheckPresence(d *schema.ResourceData, m interface{}) (SepList, error) {
|
|
||||||
sepList := SepList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilitySepListCheckPresence: load image list")
|
|
||||||
sepListRaw, err := controller.decortAPICall("POST", sepListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepListRaw), &sepList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sepList, nil
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySepPoolCheckPresence(d *schema.ResourceData, m interface{}) (SepPool, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
sepPool := SepPool{}
|
|
||||||
|
|
||||||
urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int)))
|
|
||||||
urlValues.Add("pool_name", d.Get("pool_name").(string))
|
|
||||||
|
|
||||||
log.Debugf("utilitySepDesPoolCheckPresence: load sep")
|
|
||||||
sepPoolRaw, err := controller.decortAPICall("POST", sepGetPoolAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(sepPoolRaw), &sepPool)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sepPool, nil
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySnapshotCheckPresence(d *schema.ResourceData, m interface{}) (*Snapshot, error) {
|
|
||||||
snapShotList, err := utilitySnapshotListCheckPresence(d, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
findId := ""
|
|
||||||
|
|
||||||
if (d.Get("guid").(string)) != "" {
|
|
||||||
findId = d.Get("guid").(string)
|
|
||||||
} else {
|
|
||||||
findId = d.Id()
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, s := range snapShotList {
|
|
||||||
if s.Guid == findId {
|
|
||||||
return &s, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New("snapshot not found")
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilitySnapshotListCheckPresence(d *schema.ResourceData, m interface{}) (SnapshotList, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int)))
|
|
||||||
|
|
||||||
resp, err := controller.decortAPICall("POST", snapshotListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
snapshotList := SnapshotList{}
|
|
||||||
if err := json.Unmarshal([]byte(resp), &snapshotList); err != nil {
|
|
||||||
//return nil, errors.New(fmt.Sprint("Can not unmarshall data to snapshotList: ", resp, " ", snapshotList))
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return snapshotList, nil
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Petr Krutov, <petr.krutov@digitalenergy.online>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityVGPUCheckPresence(d *schema.ResourceData, m interface{}) (*VGPU, error) {
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
urlValues.Add("size", "50")
|
|
||||||
|
|
||||||
var vgpuId int
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if vId, ok := d.GetOk("vgpu_id"); ok {
|
|
||||||
vgpuId = vId.(int)
|
|
||||||
} else {
|
|
||||||
vgpuId, err = strconv.Atoi(d.Id())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for page := 1; ; page++ {
|
|
||||||
urlValues.Set("page", strconv.Itoa(page))
|
|
||||||
resp, err := controller.decortAPICall("POST", vgpuListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp == "[]" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var vgpus []VGPU
|
|
||||||
if err := json.Unmarshal([]byte(resp), &vgpus); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, vgpu := range vgpus {
|
|
||||||
if vgpu.ID == vgpuId {
|
|
||||||
return &vgpu, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2020-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Sergey Shubin, <sergey.shubin@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
// On success this function returns a string, as returned by API vins/get, which could be unmarshalled
|
|
||||||
// into VinsGetResp structure
|
|
||||||
func utilityVinsCheckPresence(d *schema.ResourceData, m interface{}) (string, error) {
|
|
||||||
// This function tries to locate ViNS by one of the following algorithms depending
|
|
||||||
// on the parameters passed:
|
|
||||||
// - if resource group ID is specified -> it looks for a ViNS at the RG level
|
|
||||||
// - if account ID is specifeid -> it looks for a ViNS at the account level
|
|
||||||
//
|
|
||||||
// If succeeded, it returns non empty string that contains JSON formatted facts about the
|
|
||||||
// ViNS as returned by vins/get API call.
|
|
||||||
// Otherwise it returns empty string and a meaningful error.
|
|
||||||
//
|
|
||||||
// This function does not modify its ResourceData argument, so it is safe to use it as core
|
|
||||||
// method for the Terraform resource Exists method.
|
|
||||||
//
|
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
// make it possible to use "read" & "check presence" functions with ViNS ID set so
|
|
||||||
// that Import of ViNS resource is possible
|
|
||||||
idSet := false
|
|
||||||
theId, err := strconv.Atoi(d.Id())
|
|
||||||
if err != nil || theId <= 0 {
|
|
||||||
vinsId, argSet := d.GetOk("vins_id") // NB: vins_id is NOT present in vinsResource schema!
|
|
||||||
if argSet {
|
|
||||||
theId = vinsId.(int)
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idSet = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if idSet {
|
|
||||||
// ViNS ID is specified, try to get compute instance straight by this ID
|
|
||||||
log.Debugf("utilityVinsCheckPresence: locating ViNS by its ID %d", theId)
|
|
||||||
urlValues.Add("vinsId", fmt.Sprintf("%d", theId))
|
|
||||||
vinsFacts, err := controller.decortAPICall("POST", VinsGetAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return vinsFacts, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID was not set in the schema upon entering this function - work through ViNS name
|
|
||||||
// and Account / RG ID
|
|
||||||
|
|
||||||
vinsName, argSet := d.GetOk("name")
|
|
||||||
if !argSet {
|
|
||||||
// if ViNS name is not set. then we cannot locate ViNS
|
|
||||||
return "", fmt.Errorf("Cannot check ViNS presence if ViNS name is empty")
|
|
||||||
}
|
|
||||||
urlValues.Add("name", vinsName.(string))
|
|
||||||
urlValues.Add("show_all", "false")
|
|
||||||
log.Debugf("utilityVinsCheckPresence: preparing to locate ViNS name %s", vinsName.(string))
|
|
||||||
|
|
||||||
rgId, rgSet := d.GetOk("rg_id")
|
|
||||||
if rgSet {
|
|
||||||
log.Debugf("utilityVinsCheckPresence: limiting ViNS search to RG ID %d", rgId.(int))
|
|
||||||
urlValues.Add("rgId", fmt.Sprintf("%d", rgId.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
accountId, accountSet := d.GetOk("account_id")
|
|
||||||
if accountSet {
|
|
||||||
log.Debugf("utilityVinsCheckPresence: limiting ViNS search to Account ID %d", accountId.(int))
|
|
||||||
urlValues.Add("accountId", fmt.Sprintf("%d", accountId.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
apiResp, err := controller.decortAPICall("POST", VinsSearchAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// log.Debugf("%s", apiResp)
|
|
||||||
// log.Debugf("utilityResgroupCheckPresence: ready to decode response body from %s", VinsSearchAPI)
|
|
||||||
model := VinsSearchResp{}
|
|
||||||
err = json.Unmarshal([]byte(apiResp), &model)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityVinsCheckPresence: traversing decoded Json of length %d", len(model))
|
|
||||||
for index, item := range model {
|
|
||||||
if item.Name == vinsName.(string) {
|
|
||||||
if (accountSet && item.AccountID != accountId.(int)) ||
|
|
||||||
(rgSet && item.RgID != rgId.(int)) {
|
|
||||||
// double check that account ID and Rg ID match, if set in the schema
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityVinsCheckPresence: match ViNS name %s / ID %d, account ID %d, RG ID %d at index %d",
|
|
||||||
item.Name, item.ID, item.AccountID, item.RgID, index)
|
|
||||||
|
|
||||||
// element returned by API vins/search does not contain all information we may need to
|
|
||||||
// manage ViNS, so we have to get detailed info by calling API vins/get
|
|
||||||
rqValues := &url.Values{}
|
|
||||||
rqValues.Add("vinsId", fmt.Sprintf("%d", item.ID))
|
|
||||||
vinsGetResp, err := controller.decortAPICall("POST", VinsGetAPI, rqValues)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return vinsGetResp, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", fmt.Errorf("Cannot find ViNS name %s. Check name and/or RG ID & Account ID and your access rights", vinsName.(string))
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
|
|
||||||
Author: Stanislav Solovev, <spsolovev@digitalenergy.online>, <svs1370@gmail.com>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration
|
|
||||||
Technology platfom.
|
|
||||||
|
|
||||||
Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package decort
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
|
|
||||||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
|
|
||||||
)
|
|
||||||
|
|
||||||
func utilityVinsListCheckPresence(d *schema.ResourceData, m interface{}) (VinsList, error) {
|
|
||||||
vinsList := VinsList{}
|
|
||||||
controller := m.(*ControllerCfg)
|
|
||||||
urlValues := &url.Values{}
|
|
||||||
|
|
||||||
if includeDeleted, ok := d.GetOk("include_deleted"); ok {
|
|
||||||
urlValues.Add("includeDeleted", strconv.FormatBool(includeDeleted.(bool)))
|
|
||||||
}
|
|
||||||
if page, ok := d.GetOk("page"); ok {
|
|
||||||
urlValues.Add("page", strconv.Itoa(page.(int)))
|
|
||||||
}
|
|
||||||
if size, ok := d.GetOk("size"); ok {
|
|
||||||
urlValues.Add("size", strconv.Itoa(size.(int)))
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("utilityVinsListCheckPresence")
|
|
||||||
vinsListRaw, err := controller.decortAPICall("POST", vinsListAPI, urlValues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal([]byte(vinsListRaw), &vinsList)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return vinsList, nil
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account Data Source - terraform-provider-decort"
|
page_title: "decort_account Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,48 +17,48 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **acl** (List of Object) (see [below for nested schema](#nestedatt--acl))
|
- `acl` (List of Object) (see [below for nested schema](#nestedatt--acl))
|
||||||
- **ckey** (String)
|
- `ckey` (String)
|
||||||
- **company** (String)
|
- `company` (String)
|
||||||
- **companyurl** (String)
|
- `companyurl` (String)
|
||||||
- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes))
|
- `computes` (List of Object) (see [below for nested schema](#nestedatt--computes))
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **dc_location** (String)
|
- `dc_location` (String)
|
||||||
- **deactivation_time** (Number)
|
- `deactivation_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **displayname** (String)
|
- `displayname` (String)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **machines** (List of Object) (see [below for nested schema](#nestedatt--machines))
|
- `id` (String) The ID of this resource.
|
||||||
- **meta** (List of String)
|
- `machines` (List of Object) (see [below for nested schema](#nestedatt--machines))
|
||||||
- **resource_limits** (List of Object) (see [below for nested schema](#nestedatt--resource_limits))
|
- `meta` (List of String)
|
||||||
- **resources** (List of Object) (see [below for nested schema](#nestedatt--resources))
|
- `resource_limits` (List of Object) (see [below for nested schema](#nestedatt--resource_limits))
|
||||||
- **send_access_emails** (Boolean)
|
- `resources` (List of Object) (see [below for nested schema](#nestedatt--resources))
|
||||||
- **service_account** (Boolean)
|
- `send_access_emails` (Boolean)
|
||||||
- **status** (String)
|
- `service_account` (Boolean)
|
||||||
- **updated_time** (Number)
|
- `status` (String)
|
||||||
- **version** (Number)
|
- `updated_time` (Number)
|
||||||
- **vins** (List of Number)
|
- `version` (Number)
|
||||||
- **vinses** (Number)
|
- `vins` (List of Number)
|
||||||
|
- `vinses` (Number)
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--acl"></a>
|
<a id="nestedatt--acl"></a>
|
||||||
@@ -66,13 +66,13 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **can_be_deleted** (Boolean)
|
- `can_be_deleted` (Boolean)
|
||||||
- **explicit** (Boolean)
|
- `explicit` (Boolean)
|
||||||
- **guid** (String)
|
- `guid` (String)
|
||||||
- **right** (String)
|
- `right` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **type** (String)
|
- `type` (String)
|
||||||
- **user_group_id** (String)
|
- `user_group_id` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--computes"></a>
|
<a id="nestedatt--computes"></a>
|
||||||
@@ -80,8 +80,8 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **started** (Number)
|
- `started` (Number)
|
||||||
- **stopped** (Number)
|
- `stopped` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--machines"></a>
|
<a id="nestedatt--machines"></a>
|
||||||
@@ -89,8 +89,8 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **halted** (Number)
|
- `halted` (Number)
|
||||||
- **running** (Number)
|
- `running` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--resource_limits"></a>
|
<a id="nestedatt--resource_limits"></a>
|
||||||
@@ -98,12 +98,12 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cu_c** (Number)
|
- `cu_c` (Number)
|
||||||
- **cu_d** (Number)
|
- `cu_d` (Number)
|
||||||
- **cu_i** (Number)
|
- `cu_i` (Number)
|
||||||
- **cu_m** (Number)
|
- `cu_m` (Number)
|
||||||
- **cu_np** (Number)
|
- `cu_np` (Number)
|
||||||
- **gpu_units** (Number)
|
- `gpu_units` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--resources"></a>
|
<a id="nestedatt--resources"></a>
|
||||||
@@ -111,20 +111,20 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **current** (List of Object) (see [below for nested schema](#nestedobjatt--resources--current))
|
- `current` (List of Object) (see [below for nested schema](#nestedobjatt--resources--current))
|
||||||
- **reserved** (List of Object) (see [below for nested schema](#nestedobjatt--resources--reserved))
|
- `reserved` (List of Object) (see [below for nested schema](#nestedobjatt--resources--reserved))
|
||||||
|
|
||||||
<a id="nestedobjatt--resources--current"></a>
|
<a id="nestedobjatt--resources--current"></a>
|
||||||
### Nested Schema for `resources.current`
|
### Nested Schema for `resources.current`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **disksize** (Number)
|
- `disksize` (Number)
|
||||||
- **extips** (Number)
|
- `extips` (Number)
|
||||||
- **exttraffic** (Number)
|
- `exttraffic` (Number)
|
||||||
- **gpu** (Number)
|
- `gpu` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--resources--reserved"></a>
|
<a id="nestedobjatt--resources--reserved"></a>
|
||||||
@@ -132,11 +132,11 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **disksize** (Number)
|
- `disksize` (Number)
|
||||||
- **extips** (Number)
|
- `extips` (Number)
|
||||||
- **exttraffic** (Number)
|
- `exttraffic` (Number)
|
||||||
- **gpu** (Number)
|
- `gpu` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_audits_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_audits_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,10 +42,10 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **call** (String)
|
- `call` (String)
|
||||||
- **responsetime** (Number)
|
- `responsetime` (Number)
|
||||||
- **statuscode** (Number)
|
- `statuscode` (Number)
|
||||||
- **timestamp** (Number)
|
- `timestamp` (Number)
|
||||||
- **user** (String)
|
- `user` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_computes_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_computes_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,25 +42,25 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **compute_id** (Number)
|
- `compute_id` (Number)
|
||||||
- **compute_name** (String)
|
- `compute_name` (String)
|
||||||
- **cpus** (Number)
|
- `cpus` (Number)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
- **registered** (Boolean)
|
- `registered` (Boolean)
|
||||||
- **rg_id** (Number)
|
- `rg_id` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_name` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **tech_status** (String)
|
- `tech_status` (String)
|
||||||
- **total_disks_size** (Number)
|
- `total_disks_size` (Number)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
- **user_managed** (Boolean)
|
- `user_managed` (Boolean)
|
||||||
- **vins_connected** (Number)
|
- `vins_connected` (Number)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_consumed_units Data Source - terraform-provider-decort"
|
page_title: "decort_account_consumed_units Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,28 +17,28 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **cu_c** (Number)
|
- `cu_c` (Number)
|
||||||
- **cu_d** (Number)
|
- `cu_d` (Number)
|
||||||
- **cu_i** (Number)
|
- `cu_i` (Number)
|
||||||
- **cu_m** (Number)
|
- `cu_m` (Number)
|
||||||
- **cu_np** (Number)
|
- `cu_np` (Number)
|
||||||
- **gpu_units** (Number)
|
- `gpu_units` (Number)
|
||||||
|
- `id` (String) The ID of this resource.
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_consumed_units_by_type Data Source - terraform-provider-decort"
|
page_title: "decort_account_consumed_units_by_type Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
- **cu_type** (String) cloud unit resource type
|
- `cu_type` (String) cloud unit resource type
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **cu_result** (Number)
|
- `cu_result` (Number)
|
||||||
|
- `id` (String) The ID of this resource.
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_deleted_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_deleted_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,22 +17,22 @@ description: |-
|
|||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `page` (Number) Page number
|
||||||
- **page** (Number) Page number
|
- `size` (Number) Page size
|
||||||
- **size** (Number) Page size
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -40,24 +40,24 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **acl** (List of Object) (see [below for nested schema](#nestedobjatt--items--acl))
|
- `acl` (List of Object) (see [below for nested schema](#nestedobjatt--items--acl))
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
|
|
||||||
<a id="nestedobjatt--items--acl"></a>
|
<a id="nestedobjatt--items--acl"></a>
|
||||||
### Nested Schema for `items.acl`
|
### Nested Schema for `items.acl`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **explicit** (Boolean)
|
- `explicit` (Boolean)
|
||||||
- **guid** (String)
|
- `guid` (String)
|
||||||
- **right** (String)
|
- `right` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **type** (String)
|
- `type` (String)
|
||||||
- **user_group_id** (String)
|
- `user_group_id` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_disks_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_disks_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,11 +42,11 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **disk_id** (Number)
|
- `disk_id` (Number)
|
||||||
- **disk_name** (String)
|
- `disk_name` (String)
|
||||||
- **pool** (String)
|
- `pool` (String)
|
||||||
- **sep_id** (Number)
|
- `sep_id` (Number)
|
||||||
- **size_max** (Number)
|
- `size_max` (Number)
|
||||||
- **type** (String)
|
- `type` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_flipgroups_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_flipgroups_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,26 +42,26 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **client_type** (String)
|
- `client_type` (String)
|
||||||
- **conn_type** (String)
|
- `conn_type` (String)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **default_gw** (String)
|
- `default_gw` (String)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **desc** (String)
|
- `desc` (String)
|
||||||
- **fg_id** (Number)
|
- `fg_id` (Number)
|
||||||
- **fg_name** (String)
|
- `fg_name` (String)
|
||||||
- **gid** (Number)
|
- `gid` (Number)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **ip** (String)
|
- `ip` (String)
|
||||||
- **milestones** (Number)
|
- `milestones` (Number)
|
||||||
- **net_id** (Number)
|
- `net_id` (Number)
|
||||||
- **net_type** (String)
|
- `net_type` (String)
|
||||||
- **netmask** (Number)
|
- `netmask` (Number)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,22 +17,22 @@ description: |-
|
|||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `page` (Number) Page number
|
||||||
- **page** (Number) Page number
|
- `size` (Number) Page size
|
||||||
- **size** (Number) Page size
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -40,24 +40,24 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **acl** (List of Object) (see [below for nested schema](#nestedobjatt--items--acl))
|
- `acl` (List of Object) (see [below for nested schema](#nestedobjatt--items--acl))
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
|
|
||||||
<a id="nestedobjatt--items--acl"></a>
|
<a id="nestedobjatt--items--acl"></a>
|
||||||
### Nested Schema for `items.acl`
|
### Nested Schema for `items.acl`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **explicit** (Boolean)
|
- `explicit` (Boolean)
|
||||||
- **guid** (String)
|
- `guid` (String)
|
||||||
- **right** (String)
|
- `right` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **type** (String)
|
- `type` (String)
|
||||||
- **user_group_id** (String)
|
- `user_group_id` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_reserved_units Data Source - terraform-provider-decort"
|
page_title: "decort_account_reserved_units Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,28 +17,28 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **cu_c** (Number)
|
- `cu_c` (Number)
|
||||||
- **cu_d** (Number)
|
- `cu_d` (Number)
|
||||||
- **cu_i** (Number)
|
- `cu_i` (Number)
|
||||||
- **cu_m** (Number)
|
- `cu_m` (Number)
|
||||||
- **cu_np** (Number)
|
- `cu_np` (Number)
|
||||||
- **gpu_units** (Number)
|
- `gpu_units` (Number)
|
||||||
|
- `id` (String) The ID of this resource.
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_rg_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_rg_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,27 +42,27 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **computes** (List of Object) (see [below for nested schema](#nestedobjatt--items--computes))
|
- `computes` (List of Object) (see [below for nested schema](#nestedobjatt--items--computes))
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **milestones** (Number)
|
- `milestones` (Number)
|
||||||
- **resources** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
|
- `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
|
||||||
- **rg_id** (Number)
|
- `rg_id` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_name` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
- **vinses** (Number)
|
- `vinses` (Number)
|
||||||
|
|
||||||
<a id="nestedobjatt--items--computes"></a>
|
<a id="nestedobjatt--items--computes"></a>
|
||||||
### Nested Schema for `items.computes`
|
### Nested Schema for `items.computes`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **started** (Number)
|
- `started` (Number)
|
||||||
- **stopped** (Number)
|
- `stopped` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--resources"></a>
|
<a id="nestedobjatt--items--resources"></a>
|
||||||
@@ -70,21 +70,21 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **consumed** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--consumed))
|
- `consumed` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--consumed))
|
||||||
- **limits** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--limits))
|
- `limits` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--limits))
|
||||||
- **reserved** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--reserved))
|
- `reserved` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--reserved))
|
||||||
|
|
||||||
<a id="nestedobjatt--items--resources--consumed"></a>
|
<a id="nestedobjatt--items--resources--consumed"></a>
|
||||||
### Nested Schema for `items.resources.consumed`
|
### Nested Schema for `items.resources.consumed`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **disksize** (Number)
|
- `disksize` (Number)
|
||||||
- **extips** (Number)
|
- `extips` (Number)
|
||||||
- **exttraffic** (Number)
|
- `exttraffic` (Number)
|
||||||
- **gpu** (Number)
|
- `gpu` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--resources--limits"></a>
|
<a id="nestedobjatt--items--resources--limits"></a>
|
||||||
@@ -92,12 +92,12 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **disksize** (Number)
|
- `disksize` (Number)
|
||||||
- **extips** (Number)
|
- `extips` (Number)
|
||||||
- **exttraffic** (Number)
|
- `exttraffic` (Number)
|
||||||
- **gpu** (Number)
|
- `gpu` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--resources--reserved"></a>
|
<a id="nestedobjatt--items--resources--reserved"></a>
|
||||||
@@ -105,11 +105,11 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **disksize** (Number)
|
- `disksize` (Number)
|
||||||
- **extips** (Number)
|
- `extips` (Number)
|
||||||
- **exttraffic** (Number)
|
- `exttraffic` (Number)
|
||||||
- **gpu** (Number)
|
- `gpu` (Number)
|
||||||
- **ram** (Number)
|
- `ram` (Number)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_templates_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_templates_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,15 +42,15 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **desc** (String)
|
- `desc` (String)
|
||||||
- **public** (Boolean)
|
- `public` (Boolean)
|
||||||
- **size** (Number)
|
- `size` (Number)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **template_id** (Number)
|
- `template_id` (Number)
|
||||||
- **template_name** (String)
|
- `template_name` (String)
|
||||||
- **type** (String)
|
- `type` (String)
|
||||||
- **unc_path** (String)
|
- `unc_path` (String)
|
||||||
- **username** (String)
|
- `username` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_account_vins_list Data Source - terraform-provider-decort"
|
page_title: "decort_account_vins_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account
|
- `account_id` (Number) ID of the account
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) Search Result (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,22 +42,22 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **computes** (Number)
|
- `computes` (Number)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **external_ip** (String)
|
- `external_ip` (String)
|
||||||
- **network** (String)
|
- `network` (String)
|
||||||
- **pri_vnf_dev_id** (Number)
|
- `pri_vnf_dev_id` (Number)
|
||||||
- **rg_id** (Number)
|
- `rg_id` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_name` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
- **vin_id** (Number)
|
- `vin_id` (Number)
|
||||||
- **vin_name** (String)
|
- `vin_name` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_bservice Data Source - terraform-provider-decort"
|
page_title: "decort_bservice Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,52 +17,52 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **service_id** (Number)
|
- `service_id` (Number)
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **base_domain** (String)
|
- `base_domain` (String)
|
||||||
- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes))
|
- `computes` (List of Object) (see [below for nested schema](#nestedatt--computes))
|
||||||
- **cpu_total** (Number)
|
- `cpu_total` (Number)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **disk_total** (String)
|
- `disk_total` (String)
|
||||||
- **gid** (Number)
|
- `gid` (Number)
|
||||||
- **groups** (List of Number)
|
- `groups` (List of Number)
|
||||||
- **groups_name** (List of String)
|
- `groups_name` (List of String)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **milestones** (Number)
|
- `id` (String) The ID of this resource.
|
||||||
- **parent_srv_id** (Number)
|
- `milestones` (Number)
|
||||||
- **parent_srv_type** (String)
|
- `parent_srv_id` (Number)
|
||||||
- **ram_total** (Number)
|
- `parent_srv_type` (String)
|
||||||
- **rg_id** (Number)
|
- `ram_total` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_id` (Number)
|
||||||
- **service_name** (String)
|
- `rg_name` (String)
|
||||||
- **snapshots** (List of Object) (see [below for nested schema](#nestedatt--snapshots))
|
- `service_name` (String)
|
||||||
- **ssh_key** (String)
|
- `snapshots` (List of Object) (see [below for nested schema](#nestedatt--snapshots))
|
||||||
- **ssh_user** (String)
|
- `ssh_key` (String)
|
||||||
- **status** (String)
|
- `ssh_user` (String)
|
||||||
- **tech_status** (String)
|
- `status` (String)
|
||||||
- **updated_by** (String)
|
- `tech_status` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_by` (String)
|
||||||
- **user_managed** (Boolean)
|
- `updated_time` (Number)
|
||||||
|
- `user_managed` (Boolean)
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--computes"></a>
|
<a id="nestedatt--computes"></a>
|
||||||
@@ -70,11 +70,11 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **compgroup_id** (Number)
|
- `compgroup_id` (Number)
|
||||||
- **compgroup_name** (String)
|
- `compgroup_name` (String)
|
||||||
- **compgroup_role** (String)
|
- `compgroup_role` (String)
|
||||||
- **id** (Number)
|
- `id` (Number)
|
||||||
- **name** (String)
|
- `name` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--snapshots"></a>
|
<a id="nestedatt--snapshots"></a>
|
||||||
@@ -82,9 +82,9 @@ Read-Only:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **guid** (String)
|
- `guid` (String)
|
||||||
- **label** (String)
|
- `label` (String)
|
||||||
- **timestamp** (Number)
|
- `timestamp` (Number)
|
||||||
- **valid** (Boolean)
|
- `valid` (Boolean)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_bservice_deleted_list Data Source - terraform-provider-decort"
|
page_title: "decort_bservice_deleted_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account to query for BasicService instances
|
- `account_id` (Number) ID of the account to query for BasicService instances
|
||||||
- **id** (String) The ID of this resource.
|
- `page` (Number) Page number
|
||||||
- **page** (Number) Page number
|
- `rg_id` (Number) ID of the resource group to query for BasicService instances
|
||||||
- **rg_id** (Number) ID of the resource group to query for BasicService instances
|
- `size` (Number) Page size
|
||||||
- **size** (Number) Page size
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,27 +42,27 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **base_domain** (String)
|
- `base_domain` (String)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **gid** (Number)
|
- `gid` (Number)
|
||||||
- **groups** (List of Number)
|
- `groups` (List of Number)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **parent_srv_id** (Number)
|
- `parent_srv_id` (Number)
|
||||||
- **parent_srv_type** (String)
|
- `parent_srv_type` (String)
|
||||||
- **rg_id** (Number)
|
- `rg_id` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_name` (String)
|
||||||
- **service_id** (Number)
|
- `service_id` (Number)
|
||||||
- **service_name** (String)
|
- `service_name` (String)
|
||||||
- **ssh_user** (String)
|
- `ssh_user` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **tech_status** (String)
|
- `tech_status` (String)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
- **user_managed** (Boolean)
|
- `user_managed` (Boolean)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_bservice_group Data Source - terraform-provider-decort"
|
page_title: "decort_bservice_group Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,54 +17,54 @@ description: |-
|
|||||||
|
|
||||||
### Required
|
### Required
|
||||||
|
|
||||||
- **compgroup_id** (Number)
|
- `compgroup_id` (Number)
|
||||||
- **service_id** (Number)
|
- `service_id` (Number)
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **id** (String) The ID of this resource.
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **compgroup_name** (String)
|
- `compgroup_name` (String)
|
||||||
- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes))
|
- `computes` (List of Object) (see [below for nested schema](#nestedatt--computes))
|
||||||
- **consistency** (Boolean)
|
- `consistency` (Boolean)
|
||||||
- **cpu** (Number)
|
- `cpu` (Number)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **disk** (Number)
|
- `disk` (Number)
|
||||||
- **driver** (String)
|
- `driver` (String)
|
||||||
- **extnets** (List of Number)
|
- `extnets` (List of Number)
|
||||||
- **gid** (Number)
|
- `gid` (Number)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **image_id** (Number)
|
- `id` (String) The ID of this resource.
|
||||||
- **milestones** (Number)
|
- `image_id` (Number)
|
||||||
- **parents** (List of Number)
|
- `milestones` (Number)
|
||||||
- **ram** (Number)
|
- `parents` (List of Number)
|
||||||
- **rg_id** (Number)
|
- `ram` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_id` (Number)
|
||||||
- **role** (String)
|
- `rg_name` (String)
|
||||||
- **sep_id** (Number)
|
- `role` (String)
|
||||||
- **seq_no** (Number)
|
- `sep_id` (Number)
|
||||||
- **status** (String)
|
- `seq_no` (Number)
|
||||||
- **tech_status** (String)
|
- `status` (String)
|
||||||
- **timeout_start** (Number)
|
- `tech_status` (String)
|
||||||
- **updated_by** (String)
|
- `timeout_start` (Number)
|
||||||
- **updated_time** (Number)
|
- `updated_by` (String)
|
||||||
- **vinses** (List of Number)
|
- `updated_time` (Number)
|
||||||
|
- `vinses` (List of Number)
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--computes"></a>
|
<a id="nestedatt--computes"></a>
|
||||||
@@ -72,17 +72,17 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **id** (Number)
|
- `id` (Number)
|
||||||
- **ip_addresses** (List of String)
|
- `ip_addresses` (List of String)
|
||||||
- **name** (String)
|
- `name` (String)
|
||||||
- **os_users** (List of Object) (see [below for nested schema](#nestedobjatt--computes--os_users))
|
- `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--computes--os_users))
|
||||||
|
|
||||||
<a id="nestedobjatt--computes--os_users"></a>
|
<a id="nestedobjatt--computes--os_users"></a>
|
||||||
### Nested Schema for `computes.os_users`
|
### Nested Schema for `computes.os_users`
|
||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **login** (String)
|
- `login` (String)
|
||||||
- **password** (String)
|
- `password` (String)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
page_title: "decort_bservice_list Data Source - terraform-provider-decort"
|
page_title: "decort_bservice_list Data Source - decort"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
|
|
||||||
@@ -17,24 +17,24 @@ description: |-
|
|||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- **account_id** (Number) ID of the account to query for BasicService instances
|
- `account_id` (Number) ID of the account to query for BasicService instances
|
||||||
- **id** (String) The ID of this resource.
|
- `page` (Number) Page number
|
||||||
- **page** (Number) Page number
|
- `rg_id` (Number) ID of the resource group to query for BasicService instances
|
||||||
- **rg_id** (Number) ID of the resource group to query for BasicService instances
|
- `size` (Number) Page size
|
||||||
- **size** (Number) Page size
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
- **items** (List of Object) (see [below for nested schema](#nestedatt--items))
|
- `id` (String) The ID of this resource.
|
||||||
|
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
### Nested Schema for `timeouts`
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
|
|
||||||
- **default** (String)
|
- `default` (String)
|
||||||
- **read** (String)
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
<a id="nestedatt--items"></a>
|
||||||
@@ -42,27 +42,27 @@ Optional:
|
|||||||
|
|
||||||
Read-Only:
|
Read-Only:
|
||||||
|
|
||||||
- **account_id** (Number)
|
- `account_id` (Number)
|
||||||
- **account_name** (String)
|
- `account_name` (String)
|
||||||
- **base_domain** (String)
|
- `base_domain` (String)
|
||||||
- **created_by** (String)
|
- `created_by` (String)
|
||||||
- **created_time** (Number)
|
- `created_time` (Number)
|
||||||
- **deleted_by** (String)
|
- `deleted_by` (String)
|
||||||
- **deleted_time** (Number)
|
- `deleted_time` (Number)
|
||||||
- **gid** (Number)
|
- `gid` (Number)
|
||||||
- **groups** (List of Number)
|
- `groups` (List of Number)
|
||||||
- **guid** (Number)
|
- `guid` (Number)
|
||||||
- **parent_srv_id** (Number)
|
- `parent_srv_id` (Number)
|
||||||
- **parent_srv_type** (String)
|
- `parent_srv_type` (String)
|
||||||
- **rg_id** (Number)
|
- `rg_id` (Number)
|
||||||
- **rg_name** (String)
|
- `rg_name` (String)
|
||||||
- **service_id** (Number)
|
- `service_id` (Number)
|
||||||
- **service_name** (String)
|
- `service_name` (String)
|
||||||
- **ssh_user** (String)
|
- `ssh_user` (String)
|
||||||
- **status** (String)
|
- `status` (String)
|
||||||
- **tech_status** (String)
|
- `tech_status` (String)
|
||||||
- **updated_by** (String)
|
- `updated_by` (String)
|
||||||
- **updated_time** (Number)
|
- `updated_time` (Number)
|
||||||
- **user_managed** (Boolean)
|
- `user_managed` (Boolean)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user