diff --git a/CHANGELOG.md b/CHANGELOG.md index 589e4d7..2be4082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,21 @@ ### Bug fixes -- fatal error when trying to retrieve compute boot disk if former does not have one -- ignored timeouts -- wrong handling of errors when attaching network interfaces and disks to kvmvm +- error when importing kvmvm without image_id +- state reading for kvmvm created from virtual image +- type field usage in image +- wrong API handle for image creation +- updating description in kvmvm ### New features -- parameter iotune in disk -- migrated to terraform SDKv2 -- admin mode (activated by environment variable DECORT\_ADMIN\_MODE) for resources: account, k8s, image, disk, resgroup, kvmvm, vins -- parameters sep\_id and pool in kvmvm +- ipaType and IS parameters in kvmvm + +### New datasources +- lb +- lb\_list +- lb\_list\_deleted + +### New resources +- lb +- lb\_backend +- lb\_backend\_server +- lb\_frontend +- lb\_frontend\_bind diff --git a/Makefile b/Makefile index c95462c..f445734 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ NAMESPACE=decort NAME=terraform-provider-decort #BINARY=terraform-provider-${NAME} BINARY=${NAME}.exe +WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH} MAINPATH = ./cmd/decort/ VERSION=1.1 #OS_ARCH=darwin_amd64 @@ -14,8 +15,14 @@ default: install lint: golangci-lint run --timeout 600s +st: + go build -o ${BINARY} ${MAINPATH} + cp ${BINARY} ${WORKPATH} + rm ${BINARY} + build: go build -o ${BINARY} ${MAINPATH} + release: GOOS=darwin GOARCH=amd64 go build -o ./bin/${BINARY}_${VERSION}_darwin_amd64 GOOS=freebsd GOARCH=386 go build -o ./bin/${BINARY}_${VERSION}_freebsd_386 diff --git a/README.md b/README.md index cbfa5b6..9fb7a61 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,27 @@ # terraform-provider-decort + Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT) Внимание: провайдер версии 3.x разработан для DECORT API 3.8.x. Для более старых версий можно использовать: + - DECORT API 3.7.x - версия провайдера rc-1.25 - DECORT API 3.6.x - версия провайдера rc-1.10 - DECORT API до 3.6.0 - terraform DECS provider (https://github.com/rudecs/terraform-provider-decs) ## Режимы работы + Провайдер позволяет работать в двух режимах: + - Режим пользователя, - Режим администратора. -Для переключения между режимами используйте флаг DECORT_ADMIN_MODE. -Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki + Для переключения между режимами используйте флаг DECORT_ADMIN_MODE. + Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki ## Возможности провайдера -- Работа с Compute instances, -- Работа с disks, + +- Работа с Compute instances, +- Работа с disks, - Работа с k8s, - Работа с image, - Работа с reource groups, @@ -29,18 +34,23 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с vgpu, - Работа с bservice, - Работа с extnets, -- Работа с locations. +- Работа с locations, +- Работа с load balancer. Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki ## Начало -Старт возможен по двум путям: + +Старт возможен по двум путям: + 1. Установка через собранные пакеты. 2. Ручная установка. ### Установка через собранные пакеты. + 1. Скачайте и установите terraform по ссылке: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started 2. Создайте файл `main.tf` и добавьте в него следующий блок. + ```terraform provider "decort" { authenticator = "oauth2" @@ -51,45 +61,62 @@ provider "decort" { allow_unverified_ssl = true } ``` + 3. Выполните команду + ``` terraform init ``` + Провайдер автоматически будет установлен на ваш компьютер из terraform registry. ### Ручная установка + 1. Скачайте и установите Go по ссылке: https://go.dev/dl/ 2. Скачайте и установите terraform по ссылке: https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started 3. Склонируйте репозиторий с провайдером, выполнив команду: + ```bash git clone https://github.com/rudecs/terraform-provider-decort.git ``` + 4. Перейдите в скачанную папку с провайдером и выполните команду + ```bash go build -o terraform-provider-decort ``` + Если вы знаете как устроен _makefile_, то можно изменить в файле `Makefile` параметры под вашу ОС и выполнить команду + ```bash make build ``` + 5. Полученный файл необходимо поместить: -Linux: + Linux: + ```bash ~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target} ``` + Windows: + ```powershell %APPDATA%\terraform.d\plugins\${host_name}\${namespace}\${type}\${version}\${target} ``` + ВНИМАНИЕ: для ОС Windows `%APP_DATA%` является каталогом, в котором будут помещены будущие файлы terraform. Где: + - host_name - имя хоста, держателя провайдера, например, digitalenergy.online -- namespace - пространство имен хоста, например decort +- namespace - пространство имен хоста, например decort - type - тип провайдера, может совпадать с пространством имен, например, decort - version - версия провайдера, например 1.2 - target - версия ОС, например windows_amd64 + 6. После этого, создайте файл `main.tf`. 7. Добавьте в него следующий блок + ```terraform terraform { required_providers { @@ -100,32 +127,39 @@ terraform { } } ``` + В поле `version` указывается версия провайдера. Обязательный параметр Тип поля - строка ВНИМАНИЕ: Версии в блоке и в репозитории, в который был помещен провайдер должны совпадать! В поле `source` помещается путь до репозитория с версией вида: + ```bash ${host_name}/${namespace}/${type} ``` -ВНИМАНИЕ: все параметры должны совпадать с путем репозитория, в котором помещен провайдер. -8. В консоле выполнить команду +ВНИМАНИЕ: все параметры должны совпадать с путем репозитория, в котором помещен провайдер. + +8. В консоле выполнить команду + ```bash terraform init ``` -9. Если все прошло хорошо - ошибок не будет. +9. Если все прошло хорошо - ошибок не будет. Более подробно о сборке провайдера можно найти по ссылке: https://learn.hashicorp.com/tutorials/terraform/provider-use?in=terraform/providers ## Примеры работы + Примеры работы можно найти: + - На вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki -- В папке `samples` +- В папке `samples` Схемы к terraform'у доступны: -- В папке `docs` + +- В папке `docs` Хорошей работы! diff --git a/README_EN.md b/README_EN.md index 4a23869..bcd25a9 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,22 +1,26 @@ # terraform-provider-decort + Terraform provider for Digital Energy Cloud Orchestration Technology (DECORT) platform NOTE: provider 3.x is designed for DECORT API 3.8.x. For older API versions please use: + - DECORT API 3.7.x versions - provider verion rc-1.25 - 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) ## 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://github.com/rudecs/terraform-provider-decort/wiki - + Use flag DECORT_ADMIN_MODE for swithcing beetwen modes. + See user guide at https://github.com/rudecs/terraform-provider-decort/wiki ## Features -- Work with Compute instances, -- Work with disks, + +- Work with Compute instances, +- Work with disks, - Work with k8s, - Work with image, - Work with reource groups, @@ -29,21 +33,25 @@ See user guide at https://github.com/rudecs/terraform-provider-decort/wiki - Work with vgpu, - Work with bservice, - Work with extnets, -- Work with locations. +- Work with locations, +- Work with load balancers. This provider supports Import operations on pre-existing resources. See user guide at https://github.com/rudecs/terraform-provider-decort/wiki - ## Get Started -Two ways for starting: + +Two ways for starting: + 1. Installing via binary packages 2. Manual installing ### Installing via binary packages + 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. + ```terraform provider "decort" { authenticator = "oauth2" @@ -54,45 +62,62 @@ provider "decort" { allow_unverified_ssl = true } ``` + 3. Execute next command + ``` terraform init ``` + The Provider will automatically install on your computer from the terrafrom registry. ### Manual installing + 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 3. Clone provider's repo: + ```bash git clone https://github.com/rudecs/terraform-provider-decort.git ``` + 4. Change directory to clone provider's and execute next command + ```bash go build -o terraform-provider-decort ``` + If you have experience with _makefile_, you can change `Makefile`'s paramters and execute next command + ```bash make build ``` + 5. Now move compilled file to: -Linux: + Linux: + ```bash ~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target} ``` + Windows: + ```powershell %APPDATA%\terraform.d\plugins\${host_name}/${namespace}/${type}/${version}/${target} ``` + NOTE: for Windows OS `%APP_DATA%` is a cataloge, where will place terraform files. Example: + - host_name - digitalenergy.online -- namespace - decort +- namespace - decort - type - decort - version - 1.2 - target - windows_amd64 + 6. After all, create a file `main.tf`. 7. Add to the file next code section + ```terraform terraform { required_providers { @@ -103,18 +128,22 @@ terraform { } } ``` + `version`- field for provider's version Required String Note: Versions in code section and in a repository must be equal! `source` - path to repository with provider's version + ```bash ${host_name}/${namespace}/${type} ``` + NOTE: all paramters must be equal to the repository path! -8. Execute command in your terminal +8. Execute command in your terminal + ```bash terraform init ``` @@ -124,10 +153,12 @@ terraform init More details about the provider's building process: https://learn.hashicorp.com/tutorials/terraform/provider-use?in=terraform/providers ## Examples and Samples + - Examples: https://github.com/rudecs/terraform-provider-decort/wiki -- Samples: see in repository `samples` +- Samples: see in repository `samples` Terraform schemas in: -- See in repository `docs` + +- See in repository `docs` Good work! diff --git a/docs/data-sources/lb.md b/docs/data-sources/lb.md new file mode 100644 index 0000000..37d5257 --- /dev/null +++ b/docs/data-sources/lb.md @@ -0,0 +1,167 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb Data Source - decort" +subcategory: "" +description: |- + +--- + +# decort_lb (Data Source) + + + + + + +## Schema + +### Required + +- `lb_id` (Number) + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `backends` (List of Object) (see [below for nested schema](#nestedatt--backends)) +- `created_by` (String) +- `created_time` (Number) +- `deleted_by` (String) +- `deleted_time` (Number) +- `desc` (String) +- `dp_api_user` (String) +- `extnet_id` (Number) +- `frontends` (List of Object) (see [below for nested schema](#nestedatt--frontends)) +- `gid` (Number) +- `guid` (Number) +- `ha_mode` (Boolean) +- `id` (String) The ID of this resource. +- `image_id` (Number) +- `milestones` (Number) +- `name` (String) +- `primary_node` (List of Object) (see [below for nested schema](#nestedatt--primary_node)) +- `rg_id` (Number) +- `rg_name` (String) +- `secondary_node` (List of Object) (see [below for nested schema](#nestedatt--secondary_node)) +- `status` (String) +- `tech_status` (String) +- `updated_by` (String) +- `updated_time` (Number) +- `vins_id` (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `backends` + +Read-Only: + +- `algorithm` (String) +- `guid` (String) +- `name` (String) +- `server_default_settings` (List of Object) (see [below for nested schema](#nestedobjatt--backends--server_default_settings)) +- `servers` (List of Object) (see [below for nested schema](#nestedobjatt--backends--servers)) + + +### Nested Schema for `backends.server_default_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + +### Nested Schema for `backends.servers` + +Read-Only: + +- `address` (String) +- `check` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) +- `server_settings` (List of Object) (see [below for nested schema](#nestedobjatt--backends--servers--server_settings)) + + +### Nested Schema for `backends.servers.server_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + + + +### Nested Schema for `frontends` + +Read-Only: + +- `backend` (String) +- `bindings` (List of Object) (see [below for nested schema](#nestedobjatt--frontends--bindings)) +- `guid` (String) +- `name` (String) + + +### Nested Schema for `frontends.bindings` + +Read-Only: + +- `address` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) + + + + +### Nested Schema for `primary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + + +### Nested Schema for `secondary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + diff --git a/docs/data-sources/lb_list.md b/docs/data-sources/lb_list.md new file mode 100644 index 0000000..10f9235 --- /dev/null +++ b/docs/data-sources/lb_list.md @@ -0,0 +1,175 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_list Data Source - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_list (Data Source) + + + + + + +## Schema + +### Optional + +- `includedeleted` (Boolean) +- `page` (Number) +- `size` (Number) +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `id` (String) The ID of this resource. +- `items` (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `items` + +Read-Only: + +- `backends` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends)) +- `created_by` (String) +- `created_time` (Number) +- `deleted_by` (String) +- `deleted_time` (Number) +- `desc` (String) +- `dp_api_password` (String) +- `dp_api_user` (String) +- `extnet_id` (Number) +- `frontends` (List of Object) (see [below for nested schema](#nestedobjatt--items--frontends)) +- `gid` (Number) +- `guid` (Number) +- `ha_mode` (Boolean) +- `image_id` (Number) +- `lb_id` (Number) +- `milestones` (Number) +- `name` (String) +- `primary_node` (List of Object) (see [below for nested schema](#nestedobjatt--items--primary_node)) +- `rg_id` (Number) +- `rg_name` (String) +- `secondary_node` (List of Object) (see [below for nested schema](#nestedobjatt--items--secondary_node)) +- `status` (String) +- `tech_status` (String) +- `updated_by` (String) +- `updated_time` (Number) +- `vins_id` (Number) + + +### Nested Schema for `items.backends` + +Read-Only: + +- `algorithm` (String) +- `guid` (String) +- `name` (String) +- `server_default_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--server_default_settings)) +- `servers` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--servers)) + + +### Nested Schema for `items.backends.server_default_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + +### Nested Schema for `items.backends.servers` + +Read-Only: + +- `address` (String) +- `check` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) +- `server_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--servers--server_settings)) + + +### Nested Schema for `items.backends.servers.server_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + + + +### Nested Schema for `items.frontends` + +Read-Only: + +- `backend` (String) +- `bindings` (List of Object) (see [below for nested schema](#nestedobjatt--items--frontends--bindings)) +- `guid` (String) +- `name` (String) + + +### Nested Schema for `items.frontends.bindings` + +Read-Only: + +- `address` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) + + + + +### Nested Schema for `items.primary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + + +### Nested Schema for `items.secondary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + diff --git a/docs/data-sources/lb_list_deleted.md b/docs/data-sources/lb_list_deleted.md new file mode 100644 index 0000000..cc3d4a7 --- /dev/null +++ b/docs/data-sources/lb_list_deleted.md @@ -0,0 +1,174 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_list_deleted Data Source - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_list_deleted (Data Source) + + + + + + +## Schema + +### Optional + +- `page` (Number) +- `size` (Number) +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `id` (String) The ID of this resource. +- `items` (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `items` + +Read-Only: + +- `backends` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends)) +- `created_by` (String) +- `created_time` (Number) +- `deleted_by` (String) +- `deleted_time` (Number) +- `desc` (String) +- `dp_api_password` (String) +- `dp_api_user` (String) +- `extnet_id` (Number) +- `frontends` (List of Object) (see [below for nested schema](#nestedobjatt--items--frontends)) +- `gid` (Number) +- `guid` (Number) +- `ha_mode` (Boolean) +- `image_id` (Number) +- `lb_id` (Number) +- `milestones` (Number) +- `name` (String) +- `primary_node` (List of Object) (see [below for nested schema](#nestedobjatt--items--primary_node)) +- `rg_id` (Number) +- `rg_name` (String) +- `secondary_node` (List of Object) (see [below for nested schema](#nestedobjatt--items--secondary_node)) +- `status` (String) +- `tech_status` (String) +- `updated_by` (String) +- `updated_time` (Number) +- `vins_id` (Number) + + +### Nested Schema for `items.backends` + +Read-Only: + +- `algorithm` (String) +- `guid` (String) +- `name` (String) +- `server_default_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--server_default_settings)) +- `servers` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--servers)) + + +### Nested Schema for `items.backends.server_default_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + +### Nested Schema for `items.backends.servers` + +Read-Only: + +- `address` (String) +- `check` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) +- `server_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--servers--server_settings)) + + +### Nested Schema for `items.backends.servers.server_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + + + +### Nested Schema for `items.frontends` + +Read-Only: + +- `backend` (String) +- `bindings` (List of Object) (see [below for nested schema](#nestedobjatt--items--frontends--bindings)) +- `guid` (String) +- `name` (String) + + +### Nested Schema for `items.frontends.bindings` + +Read-Only: + +- `address` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) + + + + +### Nested Schema for `items.primary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + + +### Nested Schema for `items.secondary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + diff --git a/docs/resources/image_virtual.md b/docs/resources/image_virtual.md new file mode 100644 index 0000000..ae55a69 --- /dev/null +++ b/docs/resources/image_virtual.md @@ -0,0 +1,87 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_image_virtual Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_image_virtual (Resource) + + + + + + +## Schema + +### Required + +- `link_to` (Number) ID of real image to link this virtual image to upon creation +- `name` (String) Name of the rescue disk + +### Optional + +- `permanently` (Boolean) whether to completely delete the image +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `account_id` (Number) +- `acl` (String) +- `architecture` (String) +- `boot_type` (String) +- `bootable` (Boolean) +- `ckey` (String) +- `compute_ci_id` (Number) +- `deleted_time` (String) +- `desc` (String) +- `drivers` (List of String) +- `enabled` (Boolean) +- `gid` (Number) +- `guid` (Number) +- `history` (List of Object) (see [below for nested schema](#nestedatt--history)) +- `hot_resize` (Boolean) +- `id` (String) The ID of this resource. +- `image_id` (Number) Image id +- `image_name` (String) +- `last_modified` (Number) +- `milestones` (Number) +- `password` (String) +- `pool_name` (String) +- `provider_name` (String) +- `purge_attempts` (Number) +- `res_id` (String) +- `rescuecd` (Boolean) +- `sep_id` (Number) +- `shared_with` (List of Number) +- `size` (Number) +- `status` (String) +- `tech_status` (String) +- `type` (String) +- `unc_path` (String) +- `username` (String) +- `version` (String) + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + + +### Nested Schema for `history` + +Read-Only: + +- `guid` (String) +- `id` (Number) +- `timestamp` (Number) + + diff --git a/docs/resources/kvmvm.md b/docs/resources/kvmvm.md index 932c7f0..d160102 100644 --- a/docs/resources/kvmvm.md +++ b/docs/resources/kvmvm.md @@ -29,8 +29,12 @@ description: |- - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `description` (String) Optional text description of this compute instance. +- `detach_disks` (Boolean) - `extra_disks` (Set of Number) Optional list of IDs of extra disks to attach to this compute. You may specify several extra disks. +- `ipa_type` (String) compute purpose +- `is` (String) system name - `network` (Block Set, Max: 8) Optional network connection(s) for this compute. You may specify several network blocks, one for each connection. (see [below for nested schema](#nestedblock--network)) +- `permanently` (Boolean) - `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system. - `sep_id` (Number) ID of SEP to create bootDisk on. Uses image's sepId if not set. - `started` (Boolean) Is compute started. diff --git a/docs/resources/lb.md b/docs/resources/lb.md new file mode 100644 index 0000000..c0e18c2 --- /dev/null +++ b/docs/resources/lb.md @@ -0,0 +1,176 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_lb (Resource) + + + + + + +## Schema + +### Required + +- `extnet_id` (Number) +- `name` (String) +- `rg_id` (Number) +- `start` (Boolean) +- `vins_id` (Number) + +### Optional + +- `config_reset` (Boolean) +- `desc` (String) +- `enable` (Boolean) +- `permanently` (Boolean) +- `restart` (Boolean) +- `restore` (Boolean) +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `backends` (List of Object) (see [below for nested schema](#nestedatt--backends)) +- `created_by` (String) +- `created_time` (Number) +- `deleted_by` (String) +- `deleted_time` (Number) +- `dp_api_user` (String) +- `frontends` (List of Object) (see [below for nested schema](#nestedatt--frontends)) +- `gid` (Number) +- `guid` (Number) +- `ha_mode` (Boolean) +- `id` (String) The ID of this resource. +- `image_id` (Number) +- `lb_id` (Number) +- `milestones` (Number) +- `primary_node` (List of Object) (see [below for nested schema](#nestedatt--primary_node)) +- `rg_name` (String) +- `secondary_node` (List of Object) (see [below for nested schema](#nestedatt--secondary_node)) +- `status` (String) +- `tech_status` (String) +- `updated_by` (String) +- `updated_time` (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + + +### Nested Schema for `backends` + +Read-Only: + +- `algorithm` (String) +- `guid` (String) +- `name` (String) +- `server_default_settings` (List of Object) (see [below for nested schema](#nestedobjatt--backends--server_default_settings)) +- `servers` (List of Object) (see [below for nested schema](#nestedobjatt--backends--servers)) + + +### Nested Schema for `backends.server_default_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + +### Nested Schema for `backends.servers` + +Read-Only: + +- `address` (String) +- `check` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) +- `server_settings` (List of Object) (see [below for nested schema](#nestedobjatt--backends--servers--server_settings)) + + +### Nested Schema for `backends.servers.server_settings` + +Read-Only: + +- `downinter` (Number) +- `fall` (Number) +- `guid` (String) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + + + + + +### Nested Schema for `frontends` + +Read-Only: + +- `backend` (String) +- `bindings` (List of Object) (see [below for nested schema](#nestedobjatt--frontends--bindings)) +- `guid` (String) +- `name` (String) + + +### Nested Schema for `frontends.bindings` + +Read-Only: + +- `address` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) + + + + +### Nested Schema for `primary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + + +### Nested Schema for `secondary_node` + +Read-Only: + +- `backend_ip` (String) +- `compute_id` (Number) +- `frontend_ip` (String) +- `guid` (String) +- `mgmt_ip` (String) +- `network_id` (Number) + + diff --git a/docs/resources/lb_backend.md b/docs/resources/lb_backend.md new file mode 100644 index 0000000..8ef7baa --- /dev/null +++ b/docs/resources/lb_backend.md @@ -0,0 +1,88 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_backend Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_backend (Resource) + + + + + + +## Schema + +### Required + +- `lb_id` (Number) ID of the LB instance to backendCreate +- `name` (String) Must be unique among all backends of this LB - name of the new backend to create + +### Optional + +- `algorithm` (String) +- `downinter` (Number) +- `fall` (Number) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `servers` (Block List) (see [below for nested schema](#nestedblock--servers)) +- `slowstart` (Number) +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- `weight` (Number) + +### Read-Only + +- `guid` (String) +- `id` (String) The ID of this resource. + + +### Nested Schema for `servers` + +Optional: + +- `address` (String) +- `check` (String) +- `name` (String) +- `port` (Number) +- `server_settings` (Block List) (see [below for nested schema](#nestedblock--servers--server_settings)) + +Read-Only: + +- `guid` (String) + + +### Nested Schema for `servers.server_settings` + +Optional: + +- `downinter` (Number) +- `fall` (Number) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `weight` (Number) + +Read-Only: + +- `guid` (String) + + + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + diff --git a/docs/resources/lb_backend_server.md b/docs/resources/lb_backend_server.md new file mode 100644 index 0000000..7b0a18b --- /dev/null +++ b/docs/resources/lb_backend_server.md @@ -0,0 +1,55 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_backend_server Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_backend_server (Resource) + + + + + + +## Schema + +### Required + +- `address` (String) IP address of the server. +- `backend_name` (String) Must be unique among all backends of this LB - name of the new backend to create +- `lb_id` (Number) ID of the LB instance to backendCreate +- `name` (String) Must be unique among all servers defined for this backend - name of the server definition to add. +- `port` (Number) Port number on the server + +### Optional + +- `check` (String) set to disabled if this server should be used regardless of its state. +- `downinter` (Number) +- `fall` (Number) +- `inter` (Number) +- `maxconn` (Number) +- `maxqueue` (Number) +- `rise` (Number) +- `slowstart` (Number) +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- `weight` (Number) + +### Read-Only + +- `guid` (String) +- `id` (String) The ID of this resource. + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + diff --git a/docs/resources/lb_frontend.md b/docs/resources/lb_frontend.md new file mode 100644 index 0000000..502ccd1 --- /dev/null +++ b/docs/resources/lb_frontend.md @@ -0,0 +1,56 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_frontend Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_frontend (Resource) + + + + + + +## Schema + +### Required + +- `backend_name` (String) +- `lb_id` (Number) ID of the LB instance to backendCreate +- `name` (String) + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `bindings` (List of Object) (see [below for nested schema](#nestedatt--bindings)) +- `guid` (String) +- `id` (String) The ID of this resource. + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + + +### Nested Schema for `bindings` + +Read-Only: + +- `address` (String) +- `guid` (String) +- `name` (String) +- `port` (Number) + + diff --git a/docs/resources/lb_frontend_bind.md b/docs/resources/lb_frontend_bind.md new file mode 100644 index 0000000..b7f1236 --- /dev/null +++ b/docs/resources/lb_frontend_bind.md @@ -0,0 +1,46 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_lb_frontend_bind Resource - decort" +subcategory: "" +description: |- + +--- + +# decort_lb_frontend_bind (Resource) + + + + + + +## Schema + +### Required + +- `address` (String) +- `frontend_name` (String) Must be unique among all backends of this LB - name of the new backend to create +- `lb_id` (Number) ID of the LB instance to backendCreate +- `name` (String) +- `port` (Number) + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `guid` (String) +- `id` (String) The ID of this resource. + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + diff --git a/internal/provider/cloudapi/data_sources_map.go b/internal/provider/cloudapi/data_sources_map.go index e7aad67..2b721c9 100644 --- a/internal/provider/cloudapi/data_sources_map.go +++ b/internal/provider/cloudapi/data_sources_map.go @@ -27,6 +27,7 @@ import ( "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/extnet" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/image" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/kvmvm" + "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/lb" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/locations" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/rg" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/snapshot" @@ -69,6 +70,9 @@ func NewDataSourcesMap() map[string]*schema.Resource { "decort_location_url": locations.DataSourceLocationUrl(), "decort_image_list": image.DataSourceImageList(), "decort_image": image.DataSourceImage(), + "decort_lb": lb.DataSourceLB(), + "decort_lb_list": lb.DataSourceLBList(), + "decort_lb_list_deleted": lb.DataSourceLBListDeleted(), // "decort_pfw": dataSourcePfw(), } diff --git a/internal/provider/cloudapi/resource_map.go b/internal/provider/cloudapi/resource_map.go index 844bd76..d750a57 100644 --- a/internal/provider/cloudapi/resource_map.go +++ b/internal/provider/cloudapi/resource_map.go @@ -27,6 +27,7 @@ import ( "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/image" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/k8s" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/kvmvm" + "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/lb" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/pfw" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/rg" "github.com/rudecs/terraform-provider-decort/internal/service/cloudapi/snapshot" @@ -35,18 +36,23 @@ import ( func NewRersourcesMap() map[string]*schema.Resource { return map[string]*schema.Resource{ - "decort_resgroup": rg.ResourceResgroup(), - "decort_kvmvm": kvmvm.ResourceCompute(), - "decort_disk": disks.ResourceDisk(), - "decort_vins": vins.ResourceVins(), - "decort_pfw": pfw.ResourcePfw(), - "decort_k8s": k8s.ResourceK8s(), - "decort_k8s_wg": k8s.ResourceK8sWg(), - "decort_snapshot": snapshot.ResourceSnapshot(), - "decort_account": account.ResourceAccount(), - "decort_bservice": bservice.ResourceBasicService(), - "decort_bservice_group": bservice.ResourceBasicServiceGroup(), - "decort_image": image.ResourceImage(), - "decort_image_virtual": image.ResourceImageVirtual(), + "decort_resgroup": rg.ResourceResgroup(), + "decort_kvmvm": kvmvm.ResourceCompute(), + "decort_disk": disks.ResourceDisk(), + "decort_vins": vins.ResourceVins(), + "decort_pfw": pfw.ResourcePfw(), + "decort_k8s": k8s.ResourceK8s(), + "decort_k8s_wg": k8s.ResourceK8sWg(), + "decort_snapshot": snapshot.ResourceSnapshot(), + "decort_account": account.ResourceAccount(), + "decort_bservice": bservice.ResourceBasicService(), + "decort_bservice_group": bservice.ResourceBasicServiceGroup(), + "decort_image": image.ResourceImage(), + "decort_image_virtual": image.ResourceImageVirtual(), + "decort_lb": lb.ResourceLB(), + "decort_lb_backend": lb.ResourceLBBackend(), + "decort_lb_backend_server": lb.ResourceLBBackendServer(), + "decort_lb_frontend": lb.ResourceLBFrontend(), + "decort_lb_frontend_bind": lb.ResourceLBFrontendBind(), } } diff --git a/internal/service/cloudapi/account/resource_account.go b/internal/service/cloudapi/account/resource_account.go index 4013760..8149058 100644 --- a/internal/service/cloudapi/account/resource_account.go +++ b/internal/service/cloudapi/account/resource_account.go @@ -786,7 +786,7 @@ func ResourceAccount() *schema.Resource { DeleteContext: resourceAccountDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/bservice/resource_bservice.go b/internal/service/cloudapi/bservice/resource_bservice.go index f8a3ed0..e97e833 100644 --- a/internal/service/cloudapi/bservice/resource_bservice.go +++ b/internal/service/cloudapi/bservice/resource_bservice.go @@ -511,7 +511,7 @@ func ResourceBasicService() *schema.Resource { DeleteContext: resourceBasicServiceDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/bservice/resource_bservice_group.go b/internal/service/cloudapi/bservice/resource_bservice_group.go index 2c0e28f..56cb12d 100644 --- a/internal/service/cloudapi/bservice/resource_bservice_group.go +++ b/internal/service/cloudapi/bservice/resource_bservice_group.go @@ -616,7 +616,7 @@ func ResourceBasicServiceGroup() *schema.Resource { DeleteContext: resourceBasicServiceGroupDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/disks/resource_disk.go b/internal/service/cloudapi/disks/resource_disk.go index 2ab95c4..872e2a4 100644 --- a/internal/service/cloudapi/disks/resource_disk.go +++ b/internal/service/cloudapi/disks/resource_disk.go @@ -610,7 +610,7 @@ func ResourceDisk() *schema.Resource { DeleteContext: resourceDiskDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/image/resource_image.go b/internal/service/cloudapi/image/resource_image.go index e7f96ea..eb5bc39 100644 --- a/internal/service/cloudapi/image/resource_image.go +++ b/internal/service/cloudapi/image/resource_image.go @@ -244,7 +244,7 @@ func ResourceImage() *schema.Resource { DeleteContext: resourceImageDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/image/resource_image_virtual.go b/internal/service/cloudapi/image/resource_image_virtual.go index 4252a7f..51dcb3d 100644 --- a/internal/service/cloudapi/image/resource_image_virtual.go +++ b/internal/service/cloudapi/image/resource_image_virtual.go @@ -116,7 +116,7 @@ func ResourceImageVirtual() *schema.Resource { DeleteContext: resourceImageDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/k8s/resource_k8s.go b/internal/service/cloudapi/k8s/resource_k8s.go index 99dca28..3c72d93 100644 --- a/internal/service/cloudapi/k8s/resource_k8s.go +++ b/internal/service/cloudapi/k8s/resource_k8s.go @@ -376,7 +376,7 @@ func ResourceK8s() *schema.Resource { DeleteContext: resourceK8sDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/k8s/resource_k8s_wg.go b/internal/service/cloudapi/k8s/resource_k8s_wg.go index b167d7d..66cb6cb 100644 --- a/internal/service/cloudapi/k8s/resource_k8s_wg.go +++ b/internal/service/cloudapi/k8s/resource_k8s_wg.go @@ -228,7 +228,7 @@ func ResourceK8sWg() *schema.Resource { DeleteContext: resourceK8sWgDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/kvmvm/api.go b/internal/service/cloudapi/kvmvm/api.go index 97678d9..09305af 100644 --- a/internal/service/cloudapi/kvmvm/api.go +++ b/internal/service/cloudapi/kvmvm/api.go @@ -44,3 +44,4 @@ const ComputeStopAPI = "/restmachine/cloudapi/compute/stop" const ComputeResizeAPI = "/restmachine/cloudapi/compute/resize" const DisksResizeAPI = "/restmachine/cloudapi/disks/resize2" const ComputeDeleteAPI = "/restmachine/cloudapi/compute/delete" +const ComputeUpdateAPI = "/restmachine/cloudapi/compute/update" diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go index 8d0483c..5f03215 100644 --- a/internal/service/cloudapi/kvmvm/resource_compute.go +++ b/internal/service/cloudapi/kvmvm/resource_compute.go @@ -92,6 +92,14 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf urlValues.Add("pool", pool.(string)) } + if ipaType, ok := d.GetOk("ipa_type"); ok { + urlValues.Add("ipaType", ipaType.(string)) + } + + if IS, ok := d.GetOk("is"); ok { + urlValues.Add("IS", IS.(string)) + } + /* sshKeysVal, sshKeysSet := d.GetOk("ssh_keys") if sshKeysSet { @@ -287,6 +295,16 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf return diag.FromErr(err) } + if d.HasChange("description") || d.HasChange("name") { + updateParams := &url.Values{} + updateParams.Add("computeId", d.Id()) + updateParams.Add("name", d.Get("name").(string)) + updateParams.Add("desc", d.Get("description").(string)) + if _, err := c.DecortAPICall(ctx, "POST", ComputeUpdateAPI, updateParams); err != nil { + return diag.FromErr(err) + } + } + if d.HasChange("started") { params := &url.Values{} params.Add("computeId", d.Id()) @@ -318,8 +336,8 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf params := &url.Values{} params.Add("computeId", d.Id()) - params.Add("permanently", "1") - params.Add("detachDisks", "1") + params.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool))) + params.Add("detachDisks", strconv.FormatBool(d.Get("detach_disks").(bool))) if _, err := c.DecortAPICall(ctx, "POST", ComputeDeleteAPI, params); err != nil { return diag.FromErr(err) @@ -338,7 +356,7 @@ func ResourceCompute() *schema.Resource { DeleteContext: resourceComputeDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ @@ -501,6 +519,26 @@ func ResourceCompute() *schema.Resource { Default: true, Description: "Is compute started.", }, + "detach_disks": { + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + "permanently": { + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + "is": { + Type: schema.TypeString, + Optional: true, + Description: "system name", + }, + "ipa_type": { + Type: schema.TypeString, + Optional: true, + Description: "compute purpose", + }, }, } } diff --git a/internal/service/cloudapi/kvmvm/utility_compute.go b/internal/service/cloudapi/kvmvm/utility_compute.go index 0bf64ea..259040b 100644 --- a/internal/service/cloudapi/kvmvm/utility_compute.go +++ b/internal/service/cloudapi/kvmvm/utility_compute.go @@ -267,12 +267,12 @@ func utilityComputeCheckPresence(ctx context.Context, d *schema.ResourceData, m // 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") + 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)) + 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)) diff --git a/internal/service/cloudapi/lb/api.go b/internal/service/cloudapi/lb/api.go new file mode 100644 index 0000000..1c5e3d4 --- /dev/null +++ b/internal/service/cloudapi/lb/api.go @@ -0,0 +1,57 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +const lbListAPI = "/restmachine/cloudapi/lb/list" +const lbListDeletedAPI = "/restmachine/cloudapi/lb/listDeleted" +const lbGetAPI = "/restmachine/cloudapi/lb/get" +const lbCreateAPI = "/restmachine/cloudapi/lb/create" +const lbDeleteAPI = "/restmachine/cloudapi/lb/delete" +const lbDisableAPI = "/restmachine/cloudapi/lb/disable" +const lbEnableAPI = "/restmachine/cloudapi/lb/enable" +const lbUpdateAPI = "/restmachine/cloudapi/lb/update" +const lbStartAPI = "/restmachine/cloudapi/lb/start" +const lbStopAPI = "/restmachine/cloudapi/lb/stop" +const lbRestartAPI = "/restmachine/cloudapi/lb/restart" +const lbRestoreAPI = "/restmachine/cloudapi/lb/restore" +const lbConfigResetAPI = "/restmachine/cloudapi/lb/configReset" +const lbBackendCreateAPI = "/restmachine/cloudapi/lb/backendCreate" +const lbBackendDeleteAPI = "/restmachine/cloudapi/lb/backendDelete" +const lbBackendUpdateAPI = "/restmachine/cloudapi/lb/backendUpdate" +const lbBackendServerAddAPI = "/restmachine/cloudapi/lb/backendServerAdd" +const lbBackendServerDeleteAPI = "/restmachine/cloudapi/lb/backendServerDelete" +const lbBackendServerUpdateAPI = "/restmachine/cloudapi/lb/backendServerUpdate" +const lbFrontendCreateAPI = "/restmachine/cloudapi/lb/frontendCreate" +const lbFrontendDeleteAPI = "/restmachine/cloudapi/lb/frontendDelete" +const lbFrontendBindAPI = "/restmachine/cloudapi/lb/frontendBind" +const lbFrontendBindDeleteAPI = "/restmachine/cloudapi/lb/frontendBindDelete" +const lbFrontendBindUpdateAPI = "/restmachine/cloudapi/lb/frontendBindingUpdate" diff --git a/internal/service/cloudapi/lb/data_source_lb.go b/internal/service/cloudapi/lb/data_source_lb.go new file mode 100644 index 0000000..31c1bfe --- /dev/null +++ b/internal/service/cloudapi/lb/data_source_lb.go @@ -0,0 +1,96 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" +) + +func flattenLB(d *schema.ResourceData, lb *LoadBalancer) { + d.Set("ha_mode", lb.HAMode) + d.Set("backends", flattenLBBackends(lb.Backends)) + d.Set("created_by", lb.CreatedBy) + d.Set("created_time", lb.CreatedTime) + d.Set("deleted_by", lb.DeletedBy) + d.Set("deleted_time", lb.DeletedTime) + d.Set("desc", lb.Description) + d.Set("dp_api_user", lb.DPAPIUser) + d.Set("extnet_id", lb.ExtnetId) + d.Set("frontends", flattenFrontends(lb.Frontends)) + d.Set("gid", lb.GID) + d.Set("guid", lb.GUID) + d.Set("image_id", lb.ImageId) + d.Set("milestones", lb.Milestones) + d.Set("name", lb.Name) + d.Set("primary_node", flattenNode(lb.PrimaryNode)) + d.Set("rg_id", lb.RGID) + d.Set("rg_name", lb.RGName) + d.Set("secondary_node", flattenNode(lb.SecondaryNode)) + d.Set("status", lb.Status) + d.Set("tech_status", lb.TechStatus) + d.Set("updated_by", lb.UpdatedBy) + d.Set("updated_time", lb.UpdatedTime) + d.Set("vins_id", lb.VinsId) +} + +func dataSourceLBRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + lb, err := utilityLBCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.FormatUint(lb.ID, 10)) + + flattenLB(d, lb) + + return nil +} + +func DataSourceLB() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceLBRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dsLBSchemaMake(), + } +} diff --git a/internal/service/cloudapi/lb/data_source_lb_list.go b/internal/service/cloudapi/lb/data_source_lb_list.go new file mode 100644 index 0000000..19ed768 --- /dev/null +++ b/internal/service/cloudapi/lb/data_source_lb_list.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" +) + +func flattenLBList(lbl LBList) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(lbl)) + for _, lb := range lbl { + temp := map[string]interface{}{ + "ha_mode": lb.HAMode, + "backends": flattenLBBackends(lb.Backends), + "created_by": lb.CreatedBy, + "created_time": lb.CreatedTime, + "deleted_by": lb.DeletedBy, + "deleted_time": lb.DeletedTime, + "desc": lb.Description, + "dp_api_user": lb.DPAPIUser, + "dp_api_password": lb.DPAPIPassword, + "extnet_id": lb.ExtnetId, + "frontends": flattenFrontends(lb.Frontends), + "gid": lb.GID, + "guid": lb.GUID, + "image_id": lb.ImageId, + "milestones": lb.Milestones, + "name": lb.Name, + "primary_node": flattenNode(lb.PrimaryNode), + "rg_id": lb.RGID, + "rg_name": lb.RGName, + "secondary_node": flattenNode(lb.SecondaryNode), + "status": lb.Status, + "tech_status": lb.TechStatus, + "updated_by": lb.UpdatedBy, + "updated_time": lb.UpdatedTime, + "vins_id": lb.VinsId, + } + res = append(res, temp) + } + return res +} + +func dataSourceLBListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + lbList, err := utilityLBListCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenLBList(lbList)) + + return nil +} + +func DataSourceLBList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceLBListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dsLBListSchemaMake(), + } +} diff --git a/internal/service/cloudapi/lb/data_source_lb_list_deleted.go b/internal/service/cloudapi/lb/data_source_lb_list_deleted.go new file mode 100644 index 0000000..b6cc24f --- /dev/null +++ b/internal/service/cloudapi/lb/data_source_lb_list_deleted.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" +) + +func dataSourceLBListDeletedRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + lbList, err := utilityLBListDeletedCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenLBList(lbList)) + + return nil +} + +func DataSourceLBListDeleted() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceLBListDeletedRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dsLBListDeletedSchemaMake(), + } +} diff --git a/internal/service/cloudapi/lb/flattens.go b/internal/service/cloudapi/lb/flattens.go new file mode 100644 index 0000000..9e9b785 --- /dev/null +++ b/internal/service/cloudapi/lb/flattens.go @@ -0,0 +1,128 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +func flattenNode(node Node) []map[string]interface{} { + temp := make([]map[string]interface{}, 0) + n := map[string]interface{}{ + "backend_ip": node.BackendIp, + "compute_id": node.ComputeId, + "frontend_ip": node.FrontendIp, + "guid": node.GUID, + "mgmt_ip": node.MGMTIp, + "network_id": node.NetworkId, + } + + temp = append(temp, n) + + return temp +} + +func flattendBindings(bs []Binding) []map[string]interface{} { + temp := make([]map[string]interface{}, 0, len(bs)) + for _, b := range bs { + t := map[string]interface{}{ + "address": b.Address, + "guid": b.GUID, + "name": b.Name, + "port": b.Port, + } + temp = append(temp, t) + } + return temp +} + +func flattenFrontends(fs []Frontend) []map[string]interface{} { + temp := make([]map[string]interface{}, 0, len(fs)) + for _, f := range fs { + t := map[string]interface{}{ + "backend": f.Backend, + "bindings": flattendBindings(f.Bindings), + "guid": f.GUID, + "name": f.Name, + } + temp = append(temp, t) + } + + return temp +} + +func flattenServers(servers []Server) []map[string]interface{} { + temp := make([]map[string]interface{}, 0, len(servers)) + for _, server := range servers { + t := map[string]interface{}{ + "address": server.Address, + "check": server.Check, + "guid": server.GUID, + "name": server.Name, + "port": server.Port, + "server_settings": flattenServerSettings(server.ServerSettings), + } + + temp = append(temp, t) + } + return temp +} + +func flattenServerSettings(defSet ServerSettings) []map[string]interface{} { + temp := map[string]interface{}{ + "downinter": defSet.DownInter, + "fall": defSet.Fall, + "guid": defSet.GUID, + "inter": defSet.Inter, + "maxconn": defSet.MaxConn, + "maxqueue": defSet.MaxQueue, + "rise": defSet.Rise, + "slowstart": defSet.SlowStart, + "weight": defSet.Weight, + } + + res := make([]map[string]interface{}, 0) + res = append(res, temp) + return res +} + +func flattenLBBackends(backends []Backend) []map[string]interface{} { + temp := make([]map[string]interface{}, 0, len(backends)) + for _, item := range backends { + t := map[string]interface{}{ + "algorithm": item.Algorithm, + "guid": item.GUID, + "name": item.Name, + "server_default_settings": flattenServerSettings(item.ServerDefaultSettings), + "servers": flattenServers(item.Servers), + } + + temp = append(temp, t) + } + return temp +} diff --git a/internal/service/cloudapi/lb/lb_data_subresource.go b/internal/service/cloudapi/lb/lb_data_subresource.go new file mode 100644 index 0000000..8f99c8f --- /dev/null +++ b/internal/service/cloudapi/lb/lb_data_subresource.go @@ -0,0 +1,101 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +func dsLBSchemaMake() map[string]*schema.Schema { + sch := createLBSchema() + sch["lb_id"] = &schema.Schema{ + Type: schema.TypeInt, + Required: true, + } + return sch +} + +func dsLBListDeletedSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "page": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: dsLBItemSchemaMake(), + }, + }, + } +} + +func dsLBListSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "includedeleted": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: dsLBItemSchemaMake(), + }, + }, + } +} + +func dsLBItemSchemaMake() map[string]*schema.Schema { + sch := createLBSchema() + sch["dp_api_password"] = &schema.Schema{ + Type: schema.TypeString, + Computed: true, + } + return sch +} diff --git a/internal/service/cloudapi/lb/lb_resource_subresource.go b/internal/service/cloudapi/lb/lb_resource_subresource.go new file mode 100644 index 0000000..a53f6da --- /dev/null +++ b/internal/service/cloudapi/lb/lb_resource_subresource.go @@ -0,0 +1,91 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +func lbResourceSchemaMake() map[string]*schema.Schema { + sch := createLBSchema() + sch["rg_id"] = &schema.Schema{ + Type: schema.TypeInt, + Required: true, + } + sch["name"] = &schema.Schema{ + Type: schema.TypeString, + Required: true, + } + + sch["extnet_id"] = &schema.Schema{ + Type: schema.TypeInt, + Required: true, + } + + sch["vins_id"] = &schema.Schema{ + Type: schema.TypeInt, + Required: true, + } + sch["start"] = &schema.Schema{ + Type: schema.TypeBool, + Required: true, + } + sch["desc"] = &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Computed: true, + } + + sch["enable"] = &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + } + + sch["restart"] = &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + } + + sch["restore"] = &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + } + + sch["config_reset"] = &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + } + + sch["permanently"] = &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + } + return sch +} diff --git a/internal/service/cloudapi/lb/lb_schema.go b/internal/service/cloudapi/lb/lb_schema.go new file mode 100644 index 0000000..8f908aa --- /dev/null +++ b/internal/service/cloudapi/lb/lb_schema.go @@ -0,0 +1,367 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +func createLBSchema() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "ha_mode": { + Type: schema.TypeBool, + Computed: true, + }, + "backends": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "algorithm": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "server_default_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "downinter": { + Type: schema.TypeInt, + Computed: true, + }, + "fall": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "inter": { + Type: schema.TypeInt, + Computed: true, + }, + "maxconn": { + Type: schema.TypeInt, + Computed: true, + }, + "maxqueue": { + Type: schema.TypeInt, + Computed: true, + }, + "rise": { + Type: schema.TypeInt, + Computed: true, + }, + "slowstart": { + Type: schema.TypeInt, + Computed: true, + }, + "weight": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "servers": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Computed: true, + }, + "check": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "port": { + Type: schema.TypeInt, + Computed: true, + }, + "server_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "downinter": { + Type: schema.TypeInt, + Computed: true, + }, + "fall": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "inter": { + Type: schema.TypeInt, + Computed: true, + }, + "maxconn": { + Type: schema.TypeInt, + Computed: true, + }, + "maxqueue": { + Type: schema.TypeInt, + Computed: true, + }, + "rise": { + Type: schema.TypeInt, + Computed: true, + }, + "slowstart": { + Type: schema.TypeInt, + Computed: true, + }, + "weight": { + 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, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "dp_api_user": { + Type: schema.TypeString, + Computed: true, + }, + "extnet_id": { + Type: schema.TypeInt, + Computed: true, + }, + "frontends": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "backend": { + Type: schema.TypeString, + Computed: true, + }, + "bindings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "port": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "lb_id": { + Type: schema.TypeInt, + Computed: true, + }, + "image_id": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "primary_node": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "backend_ip": { + Type: schema.TypeString, + Computed: true, + }, + "compute_id": { + Type: schema.TypeInt, + Computed: true, + }, + "frontend_ip": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "mgmt_ip": { + Type: schema.TypeString, + Computed: true, + }, + "network_id": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "secondary_node": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "backend_ip": { + Type: schema.TypeString, + Computed: true, + }, + "compute_id": { + Type: schema.TypeInt, + Computed: true, + }, + "frontend_ip": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "mgmt_ip": { + Type: schema.TypeString, + Computed: true, + }, + "network_id": { + 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, + }, + "vins_id": { + Type: schema.TypeInt, + Computed: true, + }, + } +} diff --git a/internal/service/cloudapi/lb/models.go b/internal/service/cloudapi/lb/models.go new file mode 100644 index 0000000..bd79d1f --- /dev/null +++ b/internal/service/cloudapi/lb/models.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +type LoadBalancer struct { + HAMode bool `json:"HAmode"` + ACL interface{} `json:"acl"` + Backends []Backend `json:"backends"` + CreatedBy string `json:"createdBy"` + CreatedTime uint64 `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime uint64 `json:"deletedTime"` + Description string `json:"desc"` + DPAPIUser string `json:"dpApiUser"` + ExtnetId uint64 `json:"extnetId"` + Frontends []Frontend `json:"frontends"` + GID uint64 `json:"gid"` + GUID uint64 `json:"guid"` + ID uint64 `json:"id"` + ImageId uint64 `json:"imageId"` + Milestones uint64 `json:"milestones"` + Name string `json:"name"` + PrimaryNode Node `json:"primaryNode"` + RGID uint64 `json:"rgId"` + RGName string `json:"rgName"` + SecondaryNode Node `json:"secondaryNode"` + Status string `json:"status"` + TechStatus string `json:"techStatus"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime uint64 `json:"updatedTime"` + VinsId uint64 `json:"vinsId"` +} + +type LoadBalancerDetailed struct { + DPAPIPassword string `json:"dpApiPassword"` + LoadBalancer +} + +type Backend struct { + Algorithm string `json:"algorithm"` + GUID string `json:"guid"` + Name string `json:"name"` + ServerDefaultSettings ServerSettings `json:"serverDefaultSettings"` + Servers []Server `json:"servers"` +} + +type LBList []LoadBalancerDetailed + +type ServerSettings struct { + Inter uint64 `json:"inter"` + GUID string `json:"guid"` + DownInter uint64 `json:"downinter"` + Rise uint `json:"rise"` + Fall uint `json:"fall"` + SlowStart uint64 `json:"slowstart"` + MaxConn uint `json:"maxconn"` + MaxQueue uint `json:"maxqueue"` + Weight uint `json:"weight"` +} + +type Server struct { + Address string `json:"address"` + Check string `json:"check"` + GUID string `json:"guid"` + Name string `json:"name"` + Port uint `json:"port"` + ServerSettings ServerSettings `json:"serverSettings"` +} + +type Node struct { + BackendIp string `json:"backendIp"` + ComputeId uint64 `json:"computeId"` + FrontendIp string `json:"frontendIp"` + GUID string `json:"guid"` + MGMTIp string `json:"mgmtIp"` + NetworkId uint64 `json:"networkId"` +} + +type Frontend struct { + Backend string `json:"backend"` + Bindings []Binding `json:"bindings"` + GUID string `json:"guid"` + Name string `json:"name"` +} + +type Binding struct { + Address string `json:"address"` + GUID string `json:"guid"` + Name string `json:"name"` + Port uint `json:"port"` +} diff --git a/internal/service/cloudapi/lb/resource_lb.go b/internal/service/cloudapi/lb/resource_lb.go new file mode 100644 index 0000000..b4b94dd --- /dev/null +++ b/internal/service/cloudapi/lb/resource_lb.go @@ -0,0 +1,281 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "net/url" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" +) + +func resourceLBCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBCreate") + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("name", d.Get("name").(string)) + urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int))) + urlValues.Add("extnetId", strconv.Itoa(d.Get("extnet_id").(int))) + urlValues.Add("vinsId", strconv.Itoa(d.Get("vins_id").(int))) + urlValues.Add("start", strconv.FormatBool((d.Get("start").(bool)))) + + if desc, ok := d.GetOk("desc"); ok { + urlValues.Add("desc", desc.(string)) + } + + lbId, err := c.DecortAPICall(ctx, "POST", lbCreateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(lbId) + d.Set("lb_id", lbId) + + _, err = utilityLBCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + diagnostics := resourceLBRead(ctx, d, m) + if diagnostics != nil { + return diagnostics + } + + urlValues = &url.Values{} + + if enable, ok := d.GetOk("enable"); ok { + api := lbDisableAPI + if enable.(bool) { + api = lbEnableAPI + } + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + _, err := c.DecortAPICall(ctx, "POST", api, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + + return nil +} + +func resourceLBRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBRead") + + lb, err := utilityLBCheckPresence(ctx, d, m) + if lb == nil { + d.SetId("") + return diag.FromErr(err) + } + + d.Set("ha_mode", lb.HAMode) + d.Set("backends", flattenLBBackends(lb.Backends)) + d.Set("created_by", lb.CreatedBy) + d.Set("created_time", lb.CreatedTime) + d.Set("deleted_by", lb.DeletedBy) + d.Set("deleted_time", lb.DeletedTime) + d.Set("desc", lb.Description) + d.Set("dp_api_user", lb.DPAPIUser) + d.Set("extnet_id", lb.ExtnetId) + d.Set("frontends", flattenFrontends(lb.Frontends)) + d.Set("gid", lb.GID) + d.Set("guid", lb.GUID) + d.Set("lb_id", lb.ID) + d.Set("image_id", lb.ImageId) + d.Set("milestones", lb.Milestones) + d.Set("name", lb.Name) + d.Set("primary_node", flattenNode(lb.PrimaryNode)) + d.Set("rg_id", lb.RGID) + d.Set("rg_name", lb.RGName) + d.Set("secondary_node", flattenNode(lb.SecondaryNode)) + d.Set("status", lb.Status) + d.Set("tech_status", lb.TechStatus) + d.Set("updated_by", lb.UpdatedBy) + d.Set("updated_time", lb.UpdatedTime) + d.Set("vins_id", lb.VinsId) + + return nil +} + +func resourceLBDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBDelete") + + lb, err := utilityLBCheckPresence(ctx, d, m) + if lb == nil { + if err != nil { + return diag.FromErr(err) + } + return nil + } + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + if permanently, ok := d.GetOk("permanently"); ok { + urlValues.Add("permanently", strconv.FormatBool(permanently.(bool))) + } + + _, err = c.DecortAPICall(ctx, "POST", lbDeleteAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func resourceLBEdit(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBEdit") + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + if d.HasChange("enable") { + api := lbDisableAPI + enable := d.Get("enable").(bool) + if enable { + api = lbEnableAPI + } + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + _, err := c.DecortAPICall(ctx, "POST", api, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + + if d.HasChange("start") { + api := lbStopAPI + start := d.Get("start").(bool) + if start { + api = lbStartAPI + } + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + _, err := c.DecortAPICall(ctx, "POST", api, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + + if d.HasChange("desc") { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("desc", d.Get("desc").(string)) + + _, err := c.DecortAPICall(ctx, "POST", lbUpdateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + + if d.HasChange("restart") { + restart := d.Get("restart").(bool) + if restart { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + _, err := c.DecortAPICall(ctx, "POST", lbRestartAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + } + + if d.HasChange("restore") { + restore := d.Get("restore").(bool) + if restore { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + _, err := c.DecortAPICall(ctx, "POST", lbRestoreAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + } + + if d.HasChange("config_reset") { + cfgReset := d.Get("config_reset").(bool) + if cfgReset { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + _, err := c.DecortAPICall(ctx, "POST", lbConfigResetAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + urlValues = &url.Values{} + } + } + + //TODO: перенести backend и frontend из ресурсов сюда + + return resourceLBRead(ctx, d, m) +} + +func ResourceLB() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceLBCreate, + ReadContext: resourceLBRead, + UpdateContext: resourceLBEdit, + DeleteContext: resourceLBDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout60s, + Read: &constants.Timeout30s, + Update: &constants.Timeout60s, + Delete: &constants.Timeout60s, + Default: &constants.Timeout60s, + }, + + Schema: lbResourceSchemaMake(), + } +} diff --git a/internal/service/cloudapi/lb/resource_lb_backend.go b/internal/service/cloudapi/lb/resource_lb_backend.go new file mode 100644 index 0000000..bd47c55 --- /dev/null +++ b/internal/service/cloudapi/lb/resource_lb_backend.go @@ -0,0 +1,373 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/rudecs/terraform-provider-decort/internal/constants" + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" +) + +func resourceLBBackendCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendCreate") + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("backendName", d.Get("name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + if algorithm, ok := d.GetOk("algorithm"); ok { + urlValues.Add("algorithm", algorithm.(string)) + } + if inter, ok := d.GetOk("inter"); ok { + urlValues.Add("inter", strconv.Itoa(inter.(int))) + } + if downinter, ok := d.GetOk("downinter"); ok { + urlValues.Add("downinter", strconv.Itoa(downinter.(int))) + } + if rise, ok := d.GetOk("rise"); ok { + urlValues.Add("rise", strconv.Itoa(rise.(int))) + } + if fall, ok := d.GetOk("fall"); ok { + urlValues.Add("fall", strconv.Itoa(fall.(int))) + } + if slowstart, ok := d.GetOk("slowstart"); ok { + urlValues.Add("slowstart", strconv.Itoa(slowstart.(int))) + } + if maxconn, ok := d.GetOk("maxconn"); ok { + urlValues.Add("maxconn", strconv.Itoa(maxconn.(int))) + } + if maxqueue, ok := d.GetOk("maxqueue"); ok { + urlValues.Add("maxqueue", strconv.Itoa(maxqueue.(int))) + } + if weight, ok := d.GetOk("weight"); ok { + urlValues.Add("weight", strconv.Itoa(weight.(int))) + } + + _, err := c.DecortAPICall(ctx, "POST", lbBackendCreateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.Itoa(d.Get("lb_id").(int)) + "-" + d.Get("name").(string)) + + _, err = utilityLBBackendCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + diagnostics := resourceLBBackendRead(ctx, d, m) + if diagnostics != nil { + return diagnostics + } + + return nil +} + +func resourceLBBackendRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendRead") + + b, err := utilityLBBackendCheckPresence(ctx, d, m) + if b == nil { + d.SetId("") + return diag.FromErr(err) + } + + lbId, _ := strconv.ParseInt(strings.Split(d.Id(), "-")[0], 10, 32) + + d.Set("lb_id", lbId) + d.Set("name", b.Name) + d.Set("algorithm", b.Algorithm) + d.Set("guid", b.GUID) + d.Set("downinter", b.ServerDefaultSettings.DownInter) + d.Set("fall", b.ServerDefaultSettings.Fall) + d.Set("inter", b.ServerDefaultSettings.Inter) + d.Set("maxconn", b.ServerDefaultSettings.MaxConn) + d.Set("maxqueue", b.ServerDefaultSettings.MaxQueue) + d.Set("rise", b.ServerDefaultSettings.Rise) + d.Set("slowstart", b.ServerDefaultSettings.SlowStart) + d.Set("weight", b.ServerDefaultSettings.Weight) + d.Set("servers", flattenServers(b.Servers)) + + return nil +} + +func resourceLBBackendDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendDelete") + + lb, err := utilityLBBackendCheckPresence(ctx, d, m) + if lb == nil { + if err != nil { + return diag.FromErr(err) + } + return nil + } + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("backendName", d.Get("name").(string)) + + _, err = c.DecortAPICall(ctx, "POST", lbBackendDeleteAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func resourceLBBackendEdit(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendEdit") + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("backendName", d.Get("name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + if d.HasChange("algorithm") { + urlValues.Add("algorithm", d.Get("algorithm").(string)) + } + if d.HasChange("inter") { + urlValues.Add("inter", strconv.Itoa(d.Get("inter").(int))) + } + if d.HasChange("downinter") { + urlValues.Add("downinter", strconv.Itoa(d.Get("downinter").(int))) + } + if d.HasChange("rise") { + urlValues.Add("rise", strconv.Itoa(d.Get("rise").(int))) + } + if d.HasChange("fall") { + urlValues.Add("fall", strconv.Itoa(d.Get("fall").(int))) + } + if d.HasChange("slowstart") { + urlValues.Add("slowstart", strconv.Itoa(d.Get("slowstart").(int))) + } + if d.HasChange("maxconn") { + urlValues.Add("maxconn", strconv.Itoa(d.Get("maxconn").(int))) + } + if d.HasChange("maxqueue") { + urlValues.Add("maxqueue", strconv.Itoa(d.Get("maxqueue").(int))) + } + if d.HasChange("weight") { + urlValues.Add("weight", strconv.Itoa(d.Get("weight").(int))) + } + + _, err := c.DecortAPICall(ctx, "POST", lbBackendUpdateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + //TODO: перенести servers сюда + + return resourceLBBackendRead(ctx, d, m) +} + +func ResourceLBBackend() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceLBBackendCreate, + ReadContext: resourceLBBackendRead, + UpdateContext: resourceLBBackendEdit, + DeleteContext: resourceLBBackendDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout60s, + Read: &constants.Timeout30s, + Update: &constants.Timeout60s, + Delete: &constants.Timeout60s, + Default: &constants.Timeout60s, + }, + + Schema: map[string]*schema.Schema{ + "lb_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the LB instance to backendCreate", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Must be unique among all backends of this LB - name of the new backend to create", + }, + "algorithm": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ValidateFunc: validation.StringInSlice([]string{"roundrobin", "static-rr", "leastconn"}, false), + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "downinter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "fall": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "inter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxconn": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxqueue": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "rise": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "slowstart": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "weight": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "servers": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "check": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "port": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "server_settings": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "downinter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "fall": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "inter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxconn": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxqueue": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "rise": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "slowstart": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "weight": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/service/cloudapi/lb/resource_lb_backend_server.go b/internal/service/cloudapi/lb/resource_lb_backend_server.go new file mode 100644 index 0000000..9ec3f52 --- /dev/null +++ b/internal/service/cloudapi/lb/resource_lb_backend_server.go @@ -0,0 +1,314 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/rudecs/terraform-provider-decort/internal/constants" + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" +) + +func resourceLBBackendServerCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendServerCreate") + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("backendName", d.Get("backend_name").(string)) + urlValues.Add("serverName", d.Get("name").(string)) + urlValues.Add("address", d.Get("address").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("port", strconv.Itoa(d.Get("port").(int))) + + if check, ok := d.GetOk("check"); ok { + urlValues.Add("check", check.(string)) + } + + if inter, ok := d.GetOk("inter"); ok { + urlValues.Add("inter", strconv.Itoa(inter.(int))) + } + if downinter, ok := d.GetOk("downinter"); ok { + urlValues.Add("downinter", strconv.Itoa(downinter.(int))) + } + if rise, ok := d.GetOk("rise"); ok { + urlValues.Add("rise", strconv.Itoa(rise.(int))) + } + if fall, ok := d.GetOk("fall"); ok { + urlValues.Add("fall", strconv.Itoa(fall.(int))) + } + if slowstart, ok := d.GetOk("slowstart"); ok { + urlValues.Add("slowstart", strconv.Itoa(slowstart.(int))) + } + if maxconn, ok := d.GetOk("maxconn"); ok { + urlValues.Add("maxconn", strconv.Itoa(maxconn.(int))) + } + if maxqueue, ok := d.GetOk("maxqueue"); ok { + urlValues.Add("maxqueue", strconv.Itoa(maxqueue.(int))) + } + if weight, ok := d.GetOk("weight"); ok { + urlValues.Add("weight", strconv.Itoa(weight.(int))) + } + + _, err := c.DecortAPICall(ctx, "POST", lbBackendServerAddAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.Itoa(d.Get("lb_id").(int)) + "-" + d.Get("backend_name").(string) + "-" + d.Get("name").(string)) + + _, err = utilityLBBackendServerCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + diagnostics := resourceLBBackendServerRead(ctx, d, m) + if diagnostics != nil { + return diagnostics + } + + return nil +} + +func resourceLBBackendServerRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendServerRead") + + s, err := utilityLBBackendServerCheckPresence(ctx, d, m) + if s == nil { + d.SetId("") + return diag.FromErr(err) + } + + lbId, _ := strconv.ParseInt(strings.Split(d.Id(), "-")[0], 10, 32) + backendName := strings.Split(d.Id(), "-")[1] + + d.Set("lb_id", lbId) + d.Set("backend_name", backendName) + d.Set("name", s.Name) + d.Set("port", s.Port) + d.Set("address", s.Address) + d.Set("check", s.Check) + d.Set("guid", s.GUID) + d.Set("downinter", s.ServerSettings.DownInter) + d.Set("fall", s.ServerSettings.Fall) + d.Set("inter", s.ServerSettings.Inter) + d.Set("maxconn", s.ServerSettings.MaxConn) + d.Set("maxqueue", s.ServerSettings.MaxQueue) + d.Set("rise", s.ServerSettings.Rise) + d.Set("slowstart", s.ServerSettings.SlowStart) + d.Set("weight", s.ServerSettings.Weight) + + return nil +} + +func resourceLBBackendServerDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendServerDelete") + + lb, err := utilityLBBackendServerCheckPresence(ctx, d, m) + if lb == nil { + if err != nil { + return diag.FromErr(err) + } + return nil + } + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("serverName", d.Get("name").(string)) + urlValues.Add("backendName", d.Get("backend_name").(string)) + + _, err = c.DecortAPICall(ctx, "POST", lbBackendServerDeleteAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func resourceLBBackendServerEdit(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBBackendServerEdit") + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("backendName", d.Get("backend_name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("serverName", d.Get("name").(string)) + urlValues.Add("address", d.Get("address").(string)) + urlValues.Add("port", strconv.Itoa(d.Get("port").(int))) + + if d.HasChange("check") { + urlValues.Add("check", d.Get("check").(string)) + } + if d.HasChange("inter") { + urlValues.Add("inter", strconv.Itoa(d.Get("inter").(int))) + } + if d.HasChange("downinter") { + urlValues.Add("downinter", strconv.Itoa(d.Get("downinter").(int))) + } + if d.HasChange("rise") { + urlValues.Add("rise", strconv.Itoa(d.Get("rise").(int))) + } + if d.HasChange("fall") { + urlValues.Add("fall", strconv.Itoa(d.Get("fall").(int))) + } + if d.HasChange("slowstart") { + urlValues.Add("slowstart", strconv.Itoa(d.Get("slowstart").(int))) + } + if d.HasChange("maxconn") { + urlValues.Add("maxconn", strconv.Itoa(d.Get("maxconn").(int))) + } + if d.HasChange("maxqueue") { + urlValues.Add("maxqueue", strconv.Itoa(d.Get("maxqueue").(int))) + } + if d.HasChange("weight") { + urlValues.Add("weight", strconv.Itoa(d.Get("weight").(int))) + } + + _, err := c.DecortAPICall(ctx, "POST", lbBackendServerUpdateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + //TODO: перенести servers сюда + + return resourceLBBackendServerRead(ctx, d, m) +} + +func ResourceLBBackendServer() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceLBBackendServerCreate, + ReadContext: resourceLBBackendServerRead, + UpdateContext: resourceLBBackendServerEdit, + DeleteContext: resourceLBBackendServerDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout60s, + Read: &constants.Timeout30s, + Update: &constants.Timeout60s, + Delete: &constants.Timeout60s, + Default: &constants.Timeout60s, + }, + + Schema: map[string]*schema.Schema{ + "lb_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the LB instance to backendCreate", + }, + "backend_name": { + Type: schema.TypeString, + Required: true, + Description: "Must be unique among all backends of this LB - name of the new backend to create", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Must be unique among all servers defined for this backend - name of the server definition to add.", + }, + "address": { + Type: schema.TypeString, + Required: true, + Description: "IP address of the server.", + }, + "port": { + Type: schema.TypeInt, + Required: true, + Description: "Port number on the server", + }, + "check": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ValidateFunc: validation.StringInSlice([]string{"disabled", "enabled"}, false), + Description: "set to disabled if this server should be used regardless of its state.", + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "downinter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "fall": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "inter": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxconn": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "maxqueue": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "rise": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "slowstart": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "weight": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + }, + } +} diff --git a/internal/service/cloudapi/lb/resource_lb_frontend.go b/internal/service/cloudapi/lb/resource_lb_frontend.go new file mode 100644 index 0000000..1b3eaa6 --- /dev/null +++ b/internal/service/cloudapi/lb/resource_lb_frontend.go @@ -0,0 +1,192 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" +) + +func resourceLBFrontendCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendCreate") + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("backendName", d.Get("backend_name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("frontendName", d.Get("name").(string)) + + _, err := c.DecortAPICall(ctx, "POST", lbFrontendCreateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.Itoa(d.Get("lb_id").(int)) + "-" + d.Get("name").(string)) + + _, err = utilityLBFrontendCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + diagnostics := resourceLBFrontendRead(ctx, d, m) + if diagnostics != nil { + return diagnostics + } + + return nil +} + +func resourceLBFrontendRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendRead") + + f, err := utilityLBFrontendCheckPresence(ctx, d, m) + if f == nil { + d.SetId("") + return diag.FromErr(err) + } + + lbId, _ := strconv.ParseInt(strings.Split(d.Id(), "-")[0], 10, 32) + d.Set("lb_id", lbId) + d.Set("backend_name", f.Backend) + d.Set("name", f.Name) + d.Set("guid", f.GUID) + d.Set("bindings", flattendBindings(f.Bindings)) + + return nil +} + +func resourceLBFrontendDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendDelete") + + lb, err := utilityLBFrontendCheckPresence(ctx, d, m) + if lb == nil { + if err != nil { + return diag.FromErr(err) + } + return nil + } + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("frontendName", d.Get("name").(string)) + + _, err = c.DecortAPICall(ctx, "POST", lbFrontendDeleteAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func resourceLBFrontendEdit(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + + //TODO: перенести bindings сюда + + return nil +} + +func ResourceLBFrontend() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceLBFrontendCreate, + ReadContext: resourceLBFrontendRead, + UpdateContext: resourceLBFrontendEdit, + DeleteContext: resourceLBFrontendDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout60s, + Read: &constants.Timeout30s, + Update: &constants.Timeout60s, + Delete: &constants.Timeout60s, + Default: &constants.Timeout60s, + }, + + Schema: map[string]*schema.Schema{ + "lb_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the LB instance to backendCreate", + }, + "backend_name": { + Type: schema.TypeString, + Required: true, + }, + "name": { + Type: schema.TypeString, + Required: true, + }, + "bindings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "port": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} diff --git a/internal/service/cloudapi/lb/resource_lb_frontend_bind.go b/internal/service/cloudapi/lb/resource_lb_frontend_bind.go new file mode 100644 index 0000000..0860406 --- /dev/null +++ b/internal/service/cloudapi/lb/resource_lb_frontend_bind.go @@ -0,0 +1,201 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/constants" + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" +) + +func resourceLBFrontendBindCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendBindCreate") + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("frontendName", d.Get("frontend_name").(string)) + urlValues.Add("bindingName", d.Get("name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("bindingAddress", d.Get("address").(string)) + urlValues.Add("bindingPort", strconv.Itoa(d.Get("port").(int))) + + _, err := c.DecortAPICall(ctx, "POST", lbFrontendBindAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.Itoa(d.Get("lb_id").(int)) + "-" + d.Get("frontend_name").(string) + "-" + d.Get("name").(string)) + + _, err = utilityLBFrontendBindCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + + diagnostics := resourceLBFrontendBindRead(ctx, d, m) + if diagnostics != nil { + return diagnostics + } + + return nil +} + +func resourceLBFrontendBindRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendBindRead") + + b, err := utilityLBFrontendBindCheckPresence(ctx, d, m) + if b == nil { + d.SetId("") + return diag.FromErr(err) + } + + lbId, _ := strconv.ParseInt(strings.Split(d.Id(), "-")[0], 10, 32) + frontendName := strings.Split(d.Id(), "-")[1] + + d.Set("lb_id", lbId) + d.Set("frontend_name", frontendName) + d.Set("name", b.Name) + d.Set("address", b.Address) + d.Set("guid", b.GUID) + d.Set("port", b.Port) + + return nil +} + +func resourceLBFrontendBindDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendBindDelete") + + b, err := utilityLBFrontendBindCheckPresence(ctx, d, m) + if b == nil { + if err != nil { + return diag.FromErr(err) + } + return nil + } + + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + urlValues.Add("bindingName", d.Get("name").(string)) + urlValues.Add("frontendName", d.Get("frontend_name").(string)) + + _, err = c.DecortAPICall(ctx, "POST", lbFrontendBindDeleteAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func resourceLBFrontendBindEdit(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceLBFrontendBindEdit") + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("frontendName", d.Get("frontend_name").(string)) + urlValues.Add("bindingName", d.Get("name").(string)) + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + + if d.HasChange("address") { + urlValues.Add("bindingAddress", d.Get("address").(string)) + } + + if d.HasChange("port") { + urlValues.Add("bindingPort", strconv.Itoa(d.Get("port").(int))) + } + + _, err := c.DecortAPICall(ctx, "POST", lbFrontendBindUpdateAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + + return resourceLBFrontendBindRead(ctx, d, m) +} + +func ResourceLBFrontendBind() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceLBFrontendBindCreate, + ReadContext: resourceLBFrontendBindRead, + UpdateContext: resourceLBFrontendBindEdit, + DeleteContext: resourceLBFrontendBindDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout60s, + Read: &constants.Timeout30s, + Update: &constants.Timeout60s, + Delete: &constants.Timeout60s, + Default: &constants.Timeout60s, + }, + + Schema: map[string]*schema.Schema{ + "lb_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the LB instance to backendCreate", + }, + "frontend_name": { + Type: schema.TypeString, + Required: true, + Description: "Must be unique among all backends of this LB - name of the new backend to create", + }, + "address": { + Type: schema.TypeString, + Required: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Required: true, + }, + "port": { + Type: schema.TypeInt, + Required: true, + }, + }, + } +} diff --git a/internal/service/cloudapi/lb/utility_lb.go b/internal/service/cloudapi/lb/utility_lb.go new file mode 100644 index 0000000..81b2d0a --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb.go @@ -0,0 +1,70 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/controller" +) + +func utilityLBCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*LoadBalancer, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + if (d.Get("lb_id").(int)) != 0 { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + } else { + urlValues.Add("lbId", d.Id()) + } + + resp, err := c.DecortAPICall(ctx, "POST", lbGetAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "" { + return nil, nil + } + + lb := &LoadBalancer{} + if err := json.Unmarshal([]byte(resp), lb); err != nil { + return nil, fmt.Errorf("can not unmarshall data to lb: %s %+v", resp, lb) + } + + return lb, nil +} diff --git a/internal/service/cloudapi/lb/utility_lb_backend.go b/internal/service/cloudapi/lb/utility_lb_backend.go new file mode 100644 index 0000000..df81d2e --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_backend.go @@ -0,0 +1,82 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/controller" +) + +func utilityLBBackendCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*Backend, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + bName := d.Get("name").(string) + + if (d.Get("lb_id").(int)) != 0 { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + } else { + parameters := strings.Split(d.Id(), "-") + urlValues.Add("lbId", parameters[0]) + bName = parameters[1] + } + + resp, err := c.DecortAPICall(ctx, "POST", lbGetAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "" { + return nil, nil + } + + lb := &LoadBalancer{} + if err := json.Unmarshal([]byte(resp), lb); err != nil { + return nil, fmt.Errorf("can not unmarshall data to lb: %s %+v", resp, lb) + } + + backends := lb.Backends + for _, b := range backends { + if b.Name == bName { + return &b, nil + } + } + + return nil, fmt.Errorf("can not find backend with name: %s for lb: %d", bName, lb.ID) +} diff --git a/internal/service/cloudapi/lb/utility_lb_backend_server.go b/internal/service/cloudapi/lb/utility_lb_backend_server.go new file mode 100644 index 0000000..3da1342 --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_backend_server.go @@ -0,0 +1,95 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/controller" +) + +func utilityLBBackendServerCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*Server, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + bName := d.Get("backend_name").(string) + sName := d.Get("name").(string) + + if (d.Get("lb_id").(int)) != 0 { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + } else { + parameters := strings.Split(d.Id(), "-") + urlValues.Add("lbId", parameters[0]) + bName = parameters[1] + sName = parameters[2] + } + + resp, err := c.DecortAPICall(ctx, "POST", lbGetAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "" { + return nil, nil + } + + lb := &LoadBalancer{} + if err := json.Unmarshal([]byte(resp), lb); err != nil { + return nil, fmt.Errorf("can not unmarshall data to lb: %s %+v", resp, lb) + } + + backend := &Backend{} + backends := lb.Backends + for i, b := range backends { + if b.Name == bName { + backend = &backends[i] + break + } + } + if backend.Name == "" { + return nil, fmt.Errorf("can not find backend with name: %s for lb: %d", bName, lb.ID) + } + + for _, s := range backend.Servers { + if s.Name == sName { + return &s, nil + } + } + + return nil, fmt.Errorf("can not find server with name: %s for backend: %s for lb: %d", sName, bName, lb.ID) +} diff --git a/internal/service/cloudapi/lb/utility_lb_frontend.go b/internal/service/cloudapi/lb/utility_lb_frontend.go new file mode 100644 index 0000000..d7aabf1 --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_frontend.go @@ -0,0 +1,82 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/controller" +) + +func utilityLBFrontendCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*Frontend, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + fName := d.Get("name").(string) + + if (d.Get("lb_id").(int)) != 0 { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + } else { + parameters := strings.Split(d.Id(), "-") + urlValues.Add("lbId", parameters[0]) + fName = parameters[1] + } + + resp, err := c.DecortAPICall(ctx, "POST", lbGetAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "" { + return nil, nil + } + + lb := &LoadBalancer{} + if err := json.Unmarshal([]byte(resp), lb); err != nil { + return nil, fmt.Errorf("can not unmarshall data to lb: %s %+v", resp, lb) + } + + frontends := lb.Frontends + for _, f := range frontends { + if f.Name == fName { + return &f, nil + } + } + + return nil, fmt.Errorf("can not find frontend with name: %s for lb: %d", fName, lb.ID) +} diff --git a/internal/service/cloudapi/lb/utility_lb_frontend_bind.go b/internal/service/cloudapi/lb/utility_lb_frontend_bind.go new file mode 100644 index 0000000..1ae9638 --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_frontend_bind.go @@ -0,0 +1,95 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/rudecs/terraform-provider-decort/internal/controller" +) + +func utilityLBFrontendBindCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*Binding, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + fName := d.Get("frontend_name").(string) + bName := d.Get("name").(string) + + if (d.Get("lb_id").(int)) != 0 { + urlValues.Add("lbId", strconv.Itoa(d.Get("lb_id").(int))) + } else { + parameters := strings.Split(d.Id(), "-") + urlValues.Add("lbId", parameters[0]) + fName = parameters[1] + bName = parameters[2] + } + + resp, err := c.DecortAPICall(ctx, "POST", lbGetAPI, urlValues) + if err != nil { + return nil, err + } + + if resp == "" { + return nil, nil + } + + lb := &LoadBalancer{} + if err := json.Unmarshal([]byte(resp), lb); err != nil { + return nil, fmt.Errorf("can not unmarshall data to lb: %s %+v", resp, lb) + } + + frontend := &Frontend{} + frontends := lb.Frontends + for i, f := range frontends { + if f.Name == fName { + frontend = &frontends[i] + break + } + } + if frontend.Name == "" { + return nil, fmt.Errorf("can not find frontend with name: %s for lb: %d", fName, lb.ID) + } + + for _, b := range frontend.Bindings { + if b.Name == bName { + return &b, nil + } + } + + return nil, fmt.Errorf("can not find bind with name: %s for frontend: %s for lb: %d", bName, fName, lb.ID) +} diff --git a/internal/service/cloudapi/lb/utility_lb_list.go b/internal/service/cloudapi/lb/utility_lb_list.go new file mode 100644 index 0000000..aa20952 --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_list.go @@ -0,0 +1,74 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "net/url" + "strconv" + + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityLBListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (LBList, error) { + lbList := LBList{} + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + + if includedeleted, ok := d.GetOk("includedeleted"); 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("utilityLBListCheckPresence: load lb list") + lbListRaw, err := c.DecortAPICall(ctx, "POST", lbListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(lbListRaw), &lbList) + if err != nil { + return nil, err + } + + return lbList, nil +} diff --git a/internal/service/cloudapi/lb/utility_lb_list_deleted.go b/internal/service/cloudapi/lb/utility_lb_list_deleted.go new file mode 100644 index 0000000..578c7d2 --- /dev/null +++ b/internal/service/cloudapi/lb/utility_lb_list_deleted.go @@ -0,0 +1,70 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, + +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. +*/ + +/* +Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud +Orchestration Technology) with Terraform by Hashicorp. + +Source code: https://github.com/rudecs/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://github.com/rudecs/terraform-provider-decort/wiki +*/ + +package lb + +import ( + "context" + "encoding/json" + "net/url" + "strconv" + + "github.com/rudecs/terraform-provider-decort/internal/controller" + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityLBListDeletedCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (LBList, error) { + lbList := LBList{} + c := m.(*controller.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("utilityLBListDeletedCheckPresence: load lb list") + lbListRaw, err := c.DecortAPICall(ctx, "POST", lbListDeletedAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(lbListRaw), &lbList) + if err != nil { + return nil, err + } + + return lbList, nil +} diff --git a/internal/service/cloudapi/pfw/resource_pfw.go b/internal/service/cloudapi/pfw/resource_pfw.go index 70b3e75..478fba0 100644 --- a/internal/service/cloudapi/pfw/resource_pfw.go +++ b/internal/service/cloudapi/pfw/resource_pfw.go @@ -181,7 +181,7 @@ func ResourcePfw() *schema.Resource { DeleteContext: resourcePfwDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/rg/resource_rg.go b/internal/service/cloudapi/rg/resource_rg.go index 09334ba..3e1c799 100644 --- a/internal/service/cloudapi/rg/resource_rg.go +++ b/internal/service/cloudapi/rg/resource_rg.go @@ -307,7 +307,7 @@ func ResourceResgroup() *schema.Resource { DeleteContext: resourceResgroupDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/snapshot/resource_snapshot.go b/internal/service/cloudapi/snapshot/resource_snapshot.go index 2169720..8090437 100644 --- a/internal/service/cloudapi/snapshot/resource_snapshot.go +++ b/internal/service/cloudapi/snapshot/resource_snapshot.go @@ -178,7 +178,7 @@ func ResourceSnapshot() *schema.Resource { DeleteContext: resourceSnapshotDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudapi/vins/resource_vins.go b/internal/service/cloudapi/vins/resource_vins.go index a394b87..6cb6aa8 100644 --- a/internal/service/cloudapi/vins/resource_vins.go +++ b/internal/service/cloudapi/vins/resource_vins.go @@ -292,7 +292,7 @@ func ResourceVins() *schema.Resource { DeleteContext: resourceVinsDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/account/resource_account.go b/internal/service/cloudbroker/account/resource_account.go index 0c33d51..a66af37 100644 --- a/internal/service/cloudbroker/account/resource_account.go +++ b/internal/service/cloudbroker/account/resource_account.go @@ -455,7 +455,7 @@ func ResourceAccount() *schema.Resource { DeleteContext: resourceAccountDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/disks/resource_disk.go b/internal/service/cloudbroker/disks/resource_disk.go index 2ab95c4..872e2a4 100644 --- a/internal/service/cloudbroker/disks/resource_disk.go +++ b/internal/service/cloudbroker/disks/resource_disk.go @@ -610,7 +610,7 @@ func ResourceDisk() *schema.Resource { DeleteContext: resourceDiskDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/image/resource_cdrom_image.go b/internal/service/cloudbroker/image/resource_cdrom_image.go index 8b0068c..d6592c7 100644 --- a/internal/service/cloudbroker/image/resource_cdrom_image.go +++ b/internal/service/cloudbroker/image/resource_cdrom_image.go @@ -381,7 +381,7 @@ func ResourceCDROMImage() *schema.Resource { DeleteContext: resourceCDROMImageDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/image/resource_delete_images.go b/internal/service/cloudbroker/image/resource_delete_images.go index 233191a..14b3050 100644 --- a/internal/service/cloudbroker/image/resource_delete_images.go +++ b/internal/service/cloudbroker/image/resource_delete_images.go @@ -126,7 +126,7 @@ func ResourceDeleteImages() *schema.Resource { DeleteContext: resourceDeleteListImages, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/image/resource_image.go b/internal/service/cloudbroker/image/resource_image.go index 8868b2e..8962212 100644 --- a/internal/service/cloudbroker/image/resource_image.go +++ b/internal/service/cloudbroker/image/resource_image.go @@ -665,7 +665,7 @@ func ResourceImage() *schema.Resource { DeleteContext: resourceImageDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/image/resource_virtual_image.go b/internal/service/cloudbroker/image/resource_virtual_image.go index ec540d7..4f247a9 100644 --- a/internal/service/cloudbroker/image/resource_virtual_image.go +++ b/internal/service/cloudbroker/image/resource_virtual_image.go @@ -328,7 +328,7 @@ func ResourceVirtualImage() *schema.Resource { DeleteContext: resourceImageDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/k8s/resource_k8s.go b/internal/service/cloudbroker/k8s/resource_k8s.go index 99dca28..3c72d93 100644 --- a/internal/service/cloudbroker/k8s/resource_k8s.go +++ b/internal/service/cloudbroker/k8s/resource_k8s.go @@ -376,7 +376,7 @@ func ResourceK8s() *schema.Resource { DeleteContext: resourceK8sDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/k8s/resource_k8s_wg.go b/internal/service/cloudbroker/k8s/resource_k8s_wg.go index b167d7d..66cb6cb 100644 --- a/internal/service/cloudbroker/k8s/resource_k8s_wg.go +++ b/internal/service/cloudbroker/k8s/resource_k8s_wg.go @@ -228,7 +228,7 @@ func ResourceK8sWg() *schema.Resource { DeleteContext: resourceK8sWgDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/kvmvm/resource_compute.go b/internal/service/cloudbroker/kvmvm/resource_compute.go index 8d0483c..4367d74 100644 --- a/internal/service/cloudbroker/kvmvm/resource_compute.go +++ b/internal/service/cloudbroker/kvmvm/resource_compute.go @@ -338,7 +338,7 @@ func ResourceCompute() *schema.Resource { DeleteContext: resourceComputeDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/pcidevice/resource_pcidevice.go b/internal/service/cloudbroker/pcidevice/resource_pcidevice.go index 1fcb0d9..640f4e7 100644 --- a/internal/service/cloudbroker/pcidevice/resource_pcidevice.go +++ b/internal/service/cloudbroker/pcidevice/resource_pcidevice.go @@ -229,7 +229,7 @@ func ResourcePcidevice() *schema.Resource { DeleteContext: resourcePcideviceDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/pfw/resource_pfw.go b/internal/service/cloudbroker/pfw/resource_pfw.go index 70b3e75..478fba0 100644 --- a/internal/service/cloudbroker/pfw/resource_pfw.go +++ b/internal/service/cloudbroker/pfw/resource_pfw.go @@ -181,7 +181,7 @@ func ResourcePfw() *schema.Resource { DeleteContext: resourcePfwDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/rg/resource_rg.go b/internal/service/cloudbroker/rg/resource_rg.go index 09334ba..3e1c799 100644 --- a/internal/service/cloudbroker/rg/resource_rg.go +++ b/internal/service/cloudbroker/rg/resource_rg.go @@ -307,7 +307,7 @@ func ResourceResgroup() *schema.Resource { DeleteContext: resourceResgroupDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/sep/resource_sep.go b/internal/service/cloudbroker/sep/resource_sep.go index 9bc2fff..56ae2f7 100644 --- a/internal/service/cloudbroker/sep/resource_sep.go +++ b/internal/service/cloudbroker/sep/resource_sep.go @@ -492,7 +492,7 @@ func ResourceSep() *schema.Resource { DeleteContext: resourceSepDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/sep/resource_sep_config.go b/internal/service/cloudbroker/sep/resource_sep_config.go index f48b51d..3a45bda 100644 --- a/internal/service/cloudbroker/sep/resource_sep_config.go +++ b/internal/service/cloudbroker/sep/resource_sep_config.go @@ -188,7 +188,7 @@ func ResourceSepConfig() *schema.Resource { DeleteContext: resourceSepConfigDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/snapshot/resource_snapshot.go b/internal/service/cloudbroker/snapshot/resource_snapshot.go index 2169720..8090437 100644 --- a/internal/service/cloudbroker/snapshot/resource_snapshot.go +++ b/internal/service/cloudbroker/snapshot/resource_snapshot.go @@ -178,7 +178,7 @@ func ResourceSnapshot() *schema.Resource { DeleteContext: resourceSnapshotDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/internal/service/cloudbroker/vins/resource_vins.go b/internal/service/cloudbroker/vins/resource_vins.go index a394b87..6cb6aa8 100644 --- a/internal/service/cloudbroker/vins/resource_vins.go +++ b/internal/service/cloudbroker/vins/resource_vins.go @@ -292,7 +292,7 @@ func ResourceVins() *schema.Resource { DeleteContext: resourceVinsDelete, Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, + StateContext: schema.ImportStatePassthroughContext, }, Timeouts: &schema.ResourceTimeout{ diff --git a/samples/README.md b/samples/README.md index 9ec7c53..98b59a3 100644 --- a/samples/README.md +++ b/samples/README.md @@ -1,7 +1,10 @@ # Примеры применения ресурсов terraform-provider-decort + Каждый файл снабжен комментариями, которые кратко описывают возможности и параметры ресурса. Для успешной работы необходим установленный terraform. + ## Ресурсы в примерах + - cloudapi: - data: - image @@ -37,6 +40,9 @@ - vins_list - locations_list - location_url + - lb + - lb_list + - lb_list_deleted - resources: - image - virtual_image @@ -49,6 +55,11 @@ - account - bservice - bservice_group + - lb + - lb_frontend + - lb_backend + - lb_frontend_bind + - lb_backend_server - cloudbroker: - data: - grid @@ -94,13 +105,14 @@ - vins ## Как пользоваться примерами + 1. Установить terraform 2. Установить terraform-provider-decort с помощью команды `terraform init` (выполняется автоматически), либо вручную. -3. Заменить параметр *controller_url* на ваш. -4. Заменить параметр *oauth2* на ваш. -5. Добавить ключи -*DECORT_APP_SECRET* и *DECORT_APP_ID* -в качестве переменных окружения, либо -можно добавить `app_id` и `app_secret` -в блок `provider`,что небезопасно, т.к. данные -могут быть похищены при передачи файла. +3. Заменить параметр _controller_url_ на ваш. +4. Заменить параметр _oauth2_ на ваш. +5. Добавить ключи + _DECORT_APP_SECRET_ и _DECORT_APP_ID_ + в качестве переменных окружения, либо + можно добавить `app_id` и `app_secret` + в блок `provider`,что небезопасно, т.к. данные + могут быть похищены при передачи файла. diff --git a/samples/cloudapi/data_lb/main.tf b/samples/cloudapi/data_lb/main.tf new file mode 100644 index 0000000..3474d5d --- /dev/null +++ b/samples/cloudapi/data_lb/main.tf @@ -0,0 +1,37 @@ +/* +Пример использования +Получение информации о load balancer (балансировщик нагрузок) +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_lb" "lb" { + #id балансировщика нагрузок + #обязательный параметр + #тип - число + lb_id = 238 +} + +output "test" { + value = data.decort_lb.lb +} diff --git a/samples/cloudapi/data_lb_list/main.tf b/samples/cloudapi/data_lb_list/main.tf new file mode 100644 index 0000000..8cbb220 --- /dev/null +++ b/samples/cloudapi/data_lb_list/main.tf @@ -0,0 +1,52 @@ +/* +Пример использования +Получение списка load balancer (балансировщиков нагрузки) +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_lb_list" "lbl" { + #флаг влючения в результат удаленных балансироващиков нагрузки + #опциональный параметр + #тип - булев тип + #значение по-умолчанию - false + #если не задан - выводятся все доступные неудаленные балансировщики + #includedeleted = true + + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 1 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 1 +} + +output "test" { + value = data.decort_lb_list.lbl +} diff --git a/samples/cloudapi/data_lb_list_deleted/main.tf b/samples/cloudapi/data_lb_list_deleted/main.tf new file mode 100644 index 0000000..5dd1aa2 --- /dev/null +++ b/samples/cloudapi/data_lb_list_deleted/main.tf @@ -0,0 +1,45 @@ +/* +Пример использования +Получение списка удаленных load balancer (балансировщиков нагрузок) + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_lb_list_deleted" "lbld" { + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 1 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 1 +} + +output "test" { + value = data.decort_lb_list_deleted.lbld +} diff --git a/samples/cloudapi/resource_kvmvm/main.tf b/samples/cloudapi/resource_kvmvm/main.tf new file mode 100644 index 0000000..8d591ad --- /dev/null +++ b/samples/cloudapi/resource_kvmvm/main.tf @@ -0,0 +1,80 @@ +/* +Пример использования +Работа с ресурсом kvmvm (compute) +Ресурс позволяет: +1. Создавать compute +2. Редактировать compute +3. Удалять compute +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_kvmvm" "comp" { + #имя compute + #обязательный параметр + #мб изменен + #тип - строка + name = "test-tf-compute-update-new" + + #id resource group + #обязательный параметр + #тип - число + rg_id = 1111 + + #тип драйвера для compute + #обязательный параметр + #тип - строка + driver = "KVM_X86" + + #число cpu + #обязательный параметр + #тип - число + cpu = 1 + + #кол-во оперативной памяти, МБ + #обязательный параметр + #тип - число + ram = 2048 + + #id образа диска для создания compute + #обязательный параметр + #тип - число + image_id = 111 + + #размер загрузочного диска + #обязательный параметр + #тип - число + boot_disk_size = 20 + + #описание compute + #опциональный параметр + #тип - строка + description = "test update description in tf words update" + + +} + +output "test" { + value = decort_kvmvm.comp +} diff --git a/samples/cloudapi/resource_lb/main.tf b/samples/cloudapi/resource_lb/main.tf new file mode 100644 index 0000000..8002bad --- /dev/null +++ b/samples/cloudapi/resource_lb/main.tf @@ -0,0 +1,108 @@ +/* +Пример использования +Ресурса load balancer +Ресурс позволяет: +1. Создавать load balancer +2. Редактировать load balancer +3. Удалять load balancer + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_lb" "lb" { + #id ресурсной группы для со + #обязательный параметр + #тип - число + rg_id = 1111 + + #наименование load balancer + #обязательный параметр + #тип - строка + name = "tf-test-lb" + + #id внешней сети + #обязательный параметр + #тип - число + extnet_id = 6 + + #id виртуальной сети + #обязательный параметр + #тип - число + vins_id = 758 + + #флаг запуска load balancer + #обязательный параметр + #тип - булев тип + #по умолчанию - true + #если load balancer был в статусе "stopped" (start = false), + #то для успешного старта, он должен быть доступен (enable = true) + start = true + + #описание + #опциональный параметр + #тип - строка + #desc = "temp super lb for testing tf provider" + + #флаг доступности load balancer + #необязательный параметр + #тип - булев тип + #enable = true + + #флаг перезапуска load balancer + #необязательный параметр + #тип - булев тип + #перезагрузка срабатывает только при изменении флага с false на true + #restart = false + + #флаг сброса конфигурации load balancer + #необязательный параметр + #тип - булев тип + #сброс срабатывает только при изменении флага с false на true + #config_reset = false + + #флаг моментального удаления load balancer + #необязательный параметр + #тип - булев тип + #по умолчанию - false + #применяется при выполнении команды terraform destroy + #permanently = false + + #флаг восстановления load balancer + #необязательный параметр + #тип - булев тип + #восстановить можно load balancer, удаленным с флагом permanently = false + #restore = true + + + timeouts { + create = "5m" + read = "5m" + update = "5m" + delete = "5m" + } +} + +output "test" { + value = decort_lb.lb +} diff --git a/samples/cloudapi/resource_lb_backend/main.tf b/samples/cloudapi/resource_lb_backend/main.tf new file mode 100644 index 0000000..d91cb6e --- /dev/null +++ b/samples/cloudapi/resource_lb_backend/main.tf @@ -0,0 +1,115 @@ +/* +Пример использования +Ресурса load balancer backend +Ресурс позволяет: +1. Создавать backend +2. Редактировать backend +3. Удалять backend + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_lb_backend" "lb" { + #id балансировщика нагрузок + #обязательный параметр + #тип - число + lb_id = 668 + + #имя бекенда для создания сервера + #обязательный параметр + #тип - строка + name = "testBackend" + + #алгоритм балансировки + #опицональный параметр + #тип - строка + #по умолчанию - "roundrobin" + #доступные значения - "roundrobin", "static-rr", "leastconn" + #algorithm = "roundrobin" + + #------------------- + #настройки для серверов по умолчанию + #------------------- + + #интервал между проверками, в миллисекундах + #опицональный параметр + #тип - число + #по умолчанию - 5000 + #inter = 5000 + + #интервал между проверками доступности сервера после восстановления, в миллисекундах + #опицональный параметр + #тип - число + #по умолчанию - 1000 + #downinter = 1000 + + #кол-во проверок, которые сервер должен успешно пройти + #опицональный параметр + #тип - число + #по умолчанию - 2 + #rise = 2 + + #кол-во проверок, которые сервер может не пройти и после этого получить статус "unavailable" + #опицональный параметр + #тип - число + #по умолчанию - 2 + #fall = 2 + + #кол-во миллисекунд - время между получением сервера статуса "available" и открытием соединений + #опицональный параметр + #тип - число + #по умолчанию - 60000 + #slowstart = 60000 + + #максимальное кол-во соединений сервера, при достижении этого кол-ва, сервер выходит из схемы балансирования + #опицональный параметр + #тип - число + #по умолчанию - 250 + #maxconn = 250 + + #максимальное кол-во соединений в очереди серевера, при достижении этого кол-ва, соединения будут перенаправлены на другой сервер + #опицональный параметр + #тип - число + #по умолчанию - 256 + #maxqueue = 256 + + #вес сервера для балансировки + #опицональный параметр + #тип - число + #мин - 0 + #макс - 255 + #по умолчанию - 100 + #weight = 100 + + timeouts { + create = "5m" + read = "5m" + update = "5m" + delete = "5m" + } +} + +output "test" { + value = decort_lb_backend.lb +} diff --git a/samples/cloudapi/resource_lb_backend_server/main.tf b/samples/cloudapi/resource_lb_backend_server/main.tf new file mode 100644 index 0000000..8102534 --- /dev/null +++ b/samples/cloudapi/resource_lb_backend_server/main.tf @@ -0,0 +1,126 @@ +/* +Пример использования +Ресурса load balancer backend server +Ресурс позволяет: +1. Создавать server +2. Редактировать server +3. Удалять server + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_lb_backend_server" "lb" { + #id балансировщика нагрузок + #обязательный параметр + #тип - число + lb_id = 668 + + #имя бекенда для создания сервера + #обязательный параметр + #тип - строка + backend_name = "testBackend" + + #имя сервера + #обязательный параметр + #тип - строка + name = "testServer" + + #ip адрес сервера + #обязательный параметр + #тип - строка + address = "192.168.5.33" + + #порт сервера + #обязательный параметр + #тип - число + port = 6553 + + #проверка доступности сервера + #опицональный параметр + #тип - строка + #по умолчанию - "enabled" + #доступные значения - "disabled", "enabled" + #check = "enabled" + + #интервал между проверками, в миллисекундах + #опицональный параметр + #тип - число + #по умолчанию - 5000 + #inter = 5000 + + #интервал между проверками доступности сервера после восстановления, в миллисекундах + #опицональный параметр + #тип - число + #по умолчанию - 1000 + #downinter = 1000 + + #кол-во проверок, которые сервер должен успешно пройти + #опицональный параметр + #тип - число + #по умолчанию - 2 + #rise = 2 + + #кол-во проверок, которые сервер может не пройти и после этого получить статус "unavailable" + #опицональный параметр + #тип - число + #по умолчанию - 2 + #fall = 2 + + #кол-во миллисекунд - время между получением сервера статуса "available" и открытием соединений + #опицональный параметр + #тип - число + #по умолчанию - 60000 + #slowstart = 60000 + + #максимальное кол-во соединений сервера, при достижении этого кол-ва, сервер выходит из схемы балансирования + #опицональный параметр + #тип - число + #по умолчанию - 250 + #maxconn = 250 + + #максимальное кол-во соединений в очереди серевера, при достижении этого кол-ва, соединения будут перенаправлены на другой сервер + #опицональный параметр + #тип - число + #по умолчанию - 256 + #maxqueue = 256 + + #вес сервера для балансировки + #опицональный параметр + #тип - число + #мин - 0 + #макс - 255 + #по умолчанию - 100 + #weight = 100 + + timeouts { + create = "5m" + read = "5m" + update = "5m" + delete = "5m" + } +} + +output "test" { + value = decort_lb_backend_server.lb +} diff --git a/samples/cloudapi/resource_lb_frontend/main.tf b/samples/cloudapi/resource_lb_frontend/main.tf new file mode 100644 index 0000000..9c3ccab --- /dev/null +++ b/samples/cloudapi/resource_lb_frontend/main.tf @@ -0,0 +1,58 @@ +/* +Пример использования +Ресурса load balancer frontend +Ресурс позволяет: +1. Создавать frontend +2. Удалять frontend + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_lb_frontend" "lb" { + #id балансировщика нагрузок + #обязательный параметр + #тип - число + lb_id = 668 + + #имя бекенда для создания фронтенда + #обязательный параметр + #тип - строка + backend_name = "testBackend" + + #имя фронтенда + #обязательный параметр + #тип - строка + name = "testFrontend" + + timeouts { + create = "5m" + read = "5m" + update = "5m" + delete = "5m" + } +} + +output "test" { + value = decort_lb_frontend.lb +} diff --git a/samples/cloudapi/resource_lb_frontend_bind/main.tf b/samples/cloudapi/resource_lb_frontend_bind/main.tf new file mode 100644 index 0000000..e669ee3 --- /dev/null +++ b/samples/cloudapi/resource_lb_frontend_bind/main.tf @@ -0,0 +1,69 @@ +/* +Пример использования +Ресурса load balancer frontend bind (привязка фронтенда балансировщика нагрузок) +Ресурс позволяет: +1. Создавать привязку +2. Редактировать привязку +3. Удалять привязку + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_lb_frontend_bind" "lb" { + #id балансировщика нагрузок + #обязательный параметр + #тип - число + lb_id = 668 + + #имя фронтенда для создания привязки + #обязательный параметр + #тип - строка + frontend_name = "testFrontend" + + #наименование привязки + #обязательный параметр + #тип - строка + name = "testBinding" + + #адрес привязки фронтенда + #обязательный параметр + #тип - строка + address = "111.111.111.111" + + #порт для привязки фронтенда + #обязательный параметр + #тип - число + port = 1111 + + timeouts { + create = "5m" + read = "5m" + update = "5m" + delete = "5m" + } +} + +output "test" { + value = decort_lb_frontend_bind.lb +}