diff --git a/CHANGELOG.md b/CHANGELOG.md index d3ffff1..0fe41c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ -## Version 4.6.4 +## Version 4.7.0 -### Bugfix -- Fix bug that network reconnects to the compute if the weight field was not specified +### Feature +- Added decort_dpdknet and decort_dpdknet_list data sources in cloudapi/dpdknet and cloudbroker/dpdknet +- Added decort_dpdknet resource in cloudbroker/dpdknet +- Added decort_audit data source in cloudapi/audit +- Added decort_cb_audits_export_to_file data source in cloudbroker/audit +- Added field uniq_pools in decort_resgroup resource in cloudapi/rg which can be used when updating resource +- Added feature that allows to remove def_net in decort_resgroup(cloudapi/rg) and decort_cb_rg(cloudbroker/rg) +- Added the delete_async_mode field in resources "decort_snapshot" and "kvmvm" +- Added field guid in decort_cb_user_get_audit data source in cloudbroker/user +- Added the pci_devices field in resources cloudbroker/kvmvm, cloudapi/kvmvm, datasources cloudbroker/kvmvm, cloudapi/kvmvm +- Added field enabled in dataSourceImageListSchema in cloudapi/image and cloudbroker/image +- Added fields mtu and libvirt_settings in vnfInterfaceSchema in cloudapi/vins and cloudbroker/vins +- Added libvirt_settings filed in resources "decort_cb_kvmvm", "decort_kvmvm", datasources "decort_cb_kvmvm", "decort_cb_kvmvm_list", "decort_kvmvm", "decort_kvmvm_list" +- Added field enabled in dataSourceImageListSchema in cloudapi/image and cloudbroker/image +- Added fields meta and ckey in "decort_cb_grid" in cloudbroker/grid +- Added field bus_number in data sources "decort_vins", "decort_cb_vins" and resources "decort_vins", "decort_cb_vins" in cloudapi/vins, cloudbroker/vins +- Change drivers field from required to optional in resourceCDROMImageSchema in cloudbroker/image +- Added chipset, bus_number fileds in resources "decort_cb_kvmvm", "decort_kvmvm", datasources "decort_cb_kvmvm", "decort_cb_kvmvm_list", "decort_kvmvm", "decort_kvmvm_list" +- Added stack_id, image_id fileds in decort_cb_kvmvm_list +- Added chipset field in "decort_k8s", "decort_k8s_wg", "decort_cb_k8s_cp", "decort_cb_k8s_wg" +- Change drivers field from required to optional in decort_image_from_platform_disk and decort_cb_image_from_platform_disk +- Change client_ids field from []int to []string in decort_flipgroup_list +- Added feature to change IP network without stopping compute in resources "decort_cb_kvmvm", "decort_kvmvm" in cloudapi/kvmvm, cloudbroker/kvmvm +### Removed +- Remove apitask field in dataSourceAuditSchema in cloudbroker/audit +- The ability to interact with kvmppc has been removed +- Remove permanently field in resourceImageSchema, resourceVirtualImageSchema, resourceImageFromBlankComputeSchema, resourceImageFromPlatformDiskSchema in cloudapi/image and cloudbroker/image +- Remove recursive_delete field in resource decort_cb_account in cloudbroker/account and cloudapi/account +- The reason field has been deleted everywhere +- Remove permanently field in resourceCDROMImageSchema in cloudbroker/image diff --git a/LICENSE b/LICENSE index 261eeb9..36cfecb 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2022 Basis LTD Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Makefile b/Makefile index 3ba87ef..0ffb1cd 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ ZIPDIR = ./zip BINARY=${NAME} WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH} MAINPATH = ./cmd/decort/ -VERSION=4.6.4 +VERSION=4.7.0 OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH) FILES = ${BINARY}_${VERSION}_darwin_amd64\ diff --git a/README.md b/README.md index b32c681..0200736 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration | Версия DECORT API | Версия провайдера Terraform | | ------ | ------ | +| 4.1.0 | 4.7.x | | 4.0.0 | 4.6.x | | 3.8.9 | 4.5.x | | 3.8.8 | 4.4.x | @@ -30,8 +31,10 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Режим пользователя: - Работа с accounts, + - Работа с audit, - Работа с bservice, - Работа с disks, + - Работа с dpdk, - Работа с extnets, - Работа с flipgroups, - Работа с image, @@ -47,8 +50,9 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Режим администратора: - Работа с accounts, - - Работа с audits, + - Работа с audit, - Работа с disks, + - Работа с dpdk, - Работа с extnets, - Работа с flipgroups, - Работа с grids, diff --git a/docs/data-sources/account_flipgroups_list.md b/docs/data-sources/account_flipgroups_list.md index 53284ca..ebf3b14 100644 --- a/docs/data-sources/account_flipgroups_list.md +++ b/docs/data-sources/account_flipgroups_list.md @@ -27,6 +27,7 @@ description: |- - `name` (String) Filter by name - `page` (Number) Page number - `size` (Number) Page size +- `sort_by` (String) sort by one of supported fields, format +|-(field) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `vins_id` (Number) Filter by ViNS ID - `vins_name` (String) Filter by ViNS name diff --git a/docs/data-sources/audit.md b/docs/data-sources/audit.md new file mode 100644 index 0000000..5a00485 --- /dev/null +++ b/docs/data-sources/audit.md @@ -0,0 +1,48 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_audit Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_audit (Data Source) + + + + + + +## Schema + +### Required + +- `audit_guid` (String) audit guid + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `args` (String) +- `call` (String) +- `guid` (String) +- `id` (String) The ID of this resource. +- `kwargs` (String) +- `remote_addr` (String) +- `responsetime` (Number) +- `result` (String) +- `status_code` (Number) +- `tags` (String) +- `timestamp` (Number) +- `timestamp_end` (Number) +- `user` (String) + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) diff --git a/docs/data-sources/cb_audit.md b/docs/data-sources/cb_audit.md index 15af37e..3d93830 100644 --- a/docs/data-sources/cb_audit.md +++ b/docs/data-sources/cb_audit.md @@ -25,7 +25,6 @@ description: |- ### Read-Only -- `apitask` (String) - `args` (String) - `call` (String) - `guid` (String) diff --git a/docs/data-sources/cb_audits_export_to_file.md b/docs/data-sources/cb_audits_export_to_file.md new file mode 100644 index 0000000..4ed2c27 --- /dev/null +++ b/docs/data-sources/cb_audits_export_to_file.md @@ -0,0 +1,33 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_audits_export_to_file Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_audits_export_to_file (Data Source) + + + + + + +## Schema + +### Optional + +- `file_path` (String) file path +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `id` (String) The ID of this resource. + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) diff --git a/docs/data-sources/cb_dpdknet.md b/docs/data-sources/cb_dpdknet.md new file mode 100644 index 0000000..90665e7 --- /dev/null +++ b/docs/data-sources/cb_dpdknet.md @@ -0,0 +1,48 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_dpdknet Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_dpdknet (Data Source) + + + + + + +## Schema + +### Required + +- `dpdk_id` (Number) The unique ID of the subscriber-owner of the DPDK network + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `account_access` (List of Number) List of accounts with access +- `compute_ids` (List of Number) Compute IDs which uses this DPDK network +- `created_time` (Number) Created time +- `desc` (String) Description of DPDK network +- `gid` (Number) ID of the grid (platform) +- `guid` (Number) DPDK network ID on the storage side +- `id` (String) The ID of this resource. +- `name` (String) Name of network +- `ovs_bridge` (String) OVS bridge in which interfaces for computers created +- `rg_access` (List of Number) List of resource groups with access +- `status` (String) DPDK network status +- `updated_time` (Number) Updated time +- `vlan_id` (Number) vlan ID + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) diff --git a/docs/data-sources/cb_dpdknet_list.md b/docs/data-sources/cb_dpdknet_list.md new file mode 100644 index 0000000..be7572d --- /dev/null +++ b/docs/data-sources/cb_dpdknet_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_dpdknet_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_dpdknet_list (Data Source) + + + + + + +## Schema + +### Optional + +- `by_id` (Number) Find by ID +- `compute_ids` (List of Number) Find by compute IDs +- `desc` (String) Find by description +- `gid` (Number) Find by GID +- `name` (String) Find by name +- `page` (Number) Page number +- `size` (Number) Page size +- `sort_by` (String) sort by one of supported fields, format +|-(field) +- `status` (String) Find by status +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `entry_count` (Number) +- `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: + +- `account_access` (List of Number) +- `compute_ids` (List of Number) +- `created_time` (Number) +- `desc` (String) +- `dpdk_id` (Number) +- `gid` (Number) +- `guid` (Number) +- `name` (String) +- `ovs_bridge` (String) +- `rg_access` (List of Number) +- `status` (String) +- `updated_time` (Number) +- `vlan_id` (Number) diff --git a/docs/data-sources/cb_grid.md b/docs/data-sources/cb_grid.md index 09e8b9e..48893c8 100644 --- a/docs/data-sources/cb_grid.md +++ b/docs/data-sources/cb_grid.md @@ -26,11 +26,13 @@ description: |- ### Read-Only - `auth_broker` (List of String) +- `ckey` (String) - `flag` (String) - `gid` (Number) - `guid` (Number) - `id` (Number) The ID of this resource. - `location_code` (String) +- `meta` (List of String) meta - `name` (String) diff --git a/docs/data-sources/cb_grid_get_settings.md b/docs/data-sources/cb_grid_get_settings.md new file mode 100644 index 0000000..824faaf --- /dev/null +++ b/docs/data-sources/cb_grid_get_settings.md @@ -0,0 +1,114 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_grid_get_settings Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_grid_get_settings (Data Source) + + + + + + +## Schema + +### Required + +- `grid_id` (Number) grid (platform) ID + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `allowed_ports` (List of Number) +- `cleanup_retention_period` (Number) +- `docker_registry` (List of Object) (see [below for nested schema](#nestedatt--docker_registry)) +- `enable_uptime_monitor` (Boolean) +- `extnet_max_pre_reservations_num` (Number) +- `healthcheck_notifications` (List of Object) (see [below for nested schema](#nestedatt--healthcheck_notifications)) +- `id` (String) The ID of this resource. +- `k8s_cleanup_enabled` (Boolean) +- `limits` (String) +- `location_url` (String) +- `net_qos` (List of Object) (see [below for nested schema](#nestedatt--net_qos)) +- `networks` (String) +- `prometheus` (List of Object) (see [below for nested schema](#nestedatt--prometheus)) +- `vins_max_pre_reservations_num` (Number) +- `vnfdev_mgmt_net_range` (String) + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `docker_registry` + +Read-Only: + +- `password` (String) +- `server` (String) +- `username` (String) + + + +### Nested Schema for `healthcheck_notifications` + +Read-Only: + +- `emails` (List of Object) (see [below for nested schema](#nestedobjatt--healthcheck_notifications--emails)) + + +### Nested Schema for `healthcheck_notifications.emails` + +Read-Only: + +- `address` (String) +- `enabled` (Boolean) + + + + +### Nested Schema for `net_qos` + +Read-Only: + +- `extnet` (List of Object) (see [below for nested schema](#nestedobjatt--net_qos--extnet)) +- `vins` (List of Object) (see [below for nested schema](#nestedobjatt--net_qos--vins)) + + +### Nested Schema for `net_qos.extnet` + +Read-Only: + +- `e_rate` (Number) +- `in_burst` (Number) +- `in_rate` (Number) + + + +### Nested Schema for `net_qos.vins` + +Read-Only: + +- `e_rate` (Number) +- `in_burst` (Number) +- `in_rate` (Number) + + + + +### Nested Schema for `prometheus` + +Read-Only: + +- `scrape_interval` (Number) diff --git a/docs/data-sources/cb_image.md b/docs/data-sources/cb_image.md index 1fda9eb..8be93ca 100644 --- a/docs/data-sources/cb_image.md +++ b/docs/data-sources/cb_image.md @@ -28,7 +28,7 @@ description: |- - `account_id` (Number) AccountId to make the image exclusive - `acl` (List of Object) (see [below for nested schema](#nestedatt--acl)) -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `boot_type` (String) Boot type of image bios or uefi - `bootable` (Boolean) Does this image boot OS - `cd_presented_to` (String) diff --git a/docs/data-sources/cb_image_list.md b/docs/data-sources/cb_image_list.md index bcee08d..cd26afe 100644 --- a/docs/data-sources/cb_image_list.md +++ b/docs/data-sources/cb_image_list.md @@ -20,6 +20,7 @@ description: |- - `architecture` (String) find by architecture - `bootable` (Boolean) find by bootable True or False - `by_id` (Number) find by ID +- `enabled` (Boolean) find by enabled True or False - `hot_resize` (Boolean) find by hot resize True or False - `image_size` (Number) find by image size - `name` (String) find by name diff --git a/docs/data-sources/cb_kvmvm.md b/docs/data-sources/cb_kvmvm.md index 67d5e8b..a118e19 100644 --- a/docs/data-sources/cb_kvmvm.md +++ b/docs/data-sources/cb_kvmvm.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) reason for action - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only @@ -38,6 +37,7 @@ description: |- - `boot_disk_size` (Number) - `boot_order` (List of String) - `cd_image_id` (Number) +- `chipset` (String) - `clone_reference` (Number) - `clones` (List of Number) - `computeci_id` (Number) @@ -156,6 +156,7 @@ Read-Only: - `account_id` (Number) - `boot_partition` (Number) +- `bus_number` (Number) - `ckey` (String) - `created_time` (Number) - `deleted_time` (Number) @@ -250,6 +251,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -257,8 +259,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -270,6 +274,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `interfaces.qos` diff --git a/docs/data-sources/cb_kvmvm_get_audits.md b/docs/data-sources/cb_kvmvm_get_audits.md index cb66e2c..6e6cfa9 100644 --- a/docs/data-sources/cb_kvmvm_get_audits.md +++ b/docs/data-sources/cb_kvmvm_get_audits.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/cb_kvmvm_list.md b/docs/data-sources/cb_kvmvm_list.md index bddc64a..4f75888 100644 --- a/docs/data-sources/cb_kvmvm_list.md +++ b/docs/data-sources/cb_kvmvm_list.md @@ -22,6 +22,7 @@ description: |- - `extnet_id` (Number) Find by Extnet ID - `extnet_name` (String) Find by Extnet name - `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster +- `image_id` (Number) Find by image ID - `includedeleted` (Boolean) - `ip_address` (String) Find by IP address - `name` (String) Find by name @@ -30,6 +31,7 @@ description: |- - `rg_name` (String) Find by resgroup name - `size` (Number) - `sort_by` (String) sort by one of supported fields, format +|-(field) +- `stack_id` (Number) Find by stack ID - `status` (String) Find by status - `tech_status` (String) Find by tech status - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) @@ -65,6 +67,7 @@ Read-Only: - `boot_order` (List of String) - `bootdisk_size` (Number) - `cd_image_id` (Number) +- `chipset` (String) - `clone_reference` (Number) - `clones` (List of Number) - `compute_id` (Number) @@ -163,6 +166,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `disk_id` (Number) - `pci_slot` (Number) @@ -172,6 +176,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -179,8 +184,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -192,6 +199,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `items.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `items.interfaces.qos` diff --git a/docs/data-sources/cb_kvmvm_pfw_list.md b/docs/data-sources/cb_kvmvm_pfw_list.md index b32a865..e73d39c 100644 --- a/docs/data-sources/cb_kvmvm_pfw_list.md +++ b/docs/data-sources/cb_kvmvm_pfw_list.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/cb_rg.md b/docs/data-sources/cb_rg.md index d03f090..10cc1b7 100644 --- a/docs/data-sources/cb_rg.md +++ b/docs/data-sources/cb_rg.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/cb_rg_usage.md b/docs/data-sources/cb_rg_usage.md index 5109395..33aeb5a 100644 --- a/docs/data-sources/cb_rg_usage.md +++ b/docs/data-sources/cb_rg_usage.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/cb_user_get_audit.md b/docs/data-sources/cb_user_get_audit.md index 77b39c3..7533b4d 100644 --- a/docs/data-sources/cb_user_get_audit.md +++ b/docs/data-sources/cb_user_get_audit.md @@ -47,6 +47,7 @@ Optional: Read-Only: - `call` (String) +- `guid` (String) - `response_time` (Number) - `status_code` (Number) - `time` (Number) diff --git a/docs/data-sources/cb_vins.md b/docs/data-sources/cb_vins.md index 43ad813..bbbe42c 100644 --- a/docs/data-sources/cb_vins.md +++ b/docs/data-sources/cb_vins.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) reason for action - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only @@ -139,6 +138,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -146,8 +146,10 @@ Read-Only: - `flipgroup_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_mask` (Number) @@ -159,6 +161,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `vnf_dev.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `vnf_dev.interfaces.qos` diff --git a/docs/data-sources/cb_vins_list_deleted.md b/docs/data-sources/cb_vins_list_deleted.md index 4a152e4..47a37c7 100644 --- a/docs/data-sources/cb_vins_list_deleted.md +++ b/docs/data-sources/cb_vins_list_deleted.md @@ -26,6 +26,7 @@ description: |- - `size` (Number) Page size - `sort_by` (String) sort by one of supported fields, format +|-(field) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- `vnf_dev_id` (Number) Filter by VNF Device id ### Read-Only diff --git a/docs/data-sources/cb_vins_nat_rule_list.md b/docs/data-sources/cb_vins_nat_rule_list.md index 5da23ed..c803517 100644 --- a/docs/data-sources/cb_vins_nat_rule_list.md +++ b/docs/data-sources/cb_vins_nat_rule_list.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) reason for action - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/dpdknet.md b/docs/data-sources/dpdknet.md new file mode 100644 index 0000000..6e7655f --- /dev/null +++ b/docs/data-sources/dpdknet.md @@ -0,0 +1,48 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_dpdknet Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_dpdknet (Data Source) + + + + + + +## Schema + +### Required + +- `dpdk_id` (Number) The unique ID of the subscriber-owner of the DPDK network + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `account_access` (List of Number) List of accounts with access +- `compute_ids` (List of Number) Compute IDs which uses this DPDK network +- `created_time` (Number) Created time +- `desc` (String) Description of DPDK network +- `gid` (Number) ID of the grid (platform) +- `guid` (Number) DPDK network ID on the storage side +- `id` (String) The ID of this resource. +- `name` (String) Name of network +- `ovs_bridge` (String) OVS bridge in which interfaces for computers created +- `rg_access` (List of Number) List of resource groups with access +- `status` (String) DPDK network status +- `updated_time` (Number) Updated time +- `vlan_id` (Number) vlan ID + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) diff --git a/docs/data-sources/dpdknet_list.md b/docs/data-sources/dpdknet_list.md new file mode 100644 index 0000000..c71c1b6 --- /dev/null +++ b/docs/data-sources/dpdknet_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_dpdknet_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_dpdknet_list (Data Source) + + + + + + +## Schema + +### Optional + +- `by_id` (Number) Find by ID +- `compute_ids` (List of Number) Find by compute IDs +- `desc` (String) Find by description +- `gid` (Number) Find by GID +- `name` (String) Find by name +- `page` (Number) Page number +- `size` (Number) Page size +- `sort_by` (String) sort by one of supported fields, format +|-(field) +- `status` (String) Find by status +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `entry_count` (Number) +- `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: + +- `account_access` (List of Number) +- `compute_ids` (List of Number) +- `created_time` (Number) +- `desc` (String) +- `dpdk_id` (Number) +- `gid` (Number) +- `guid` (Number) +- `name` (String) +- `ovs_bridge` (String) +- `rg_access` (List of Number) +- `status` (String) +- `updated_time` (Number) +- `vlan_id` (Number) diff --git a/docs/data-sources/flipgroup_list.md b/docs/data-sources/flipgroup_list.md index f70e060..82679ed 100644 --- a/docs/data-sources/flipgroup_list.md +++ b/docs/data-sources/flipgroup_list.md @@ -20,7 +20,7 @@ description: |- - `account_id` (Number) Account id - `by_id` (Number) Filter by ID - `by_ip` (String) Filter by IP-address -- `client_ids` (List of Number) client_ids +- `client_ids` (List of String) client_ids - `conn_id` (Number) Conn id - `extnet_id` (Number) Filter by ExtNetID - `name` (String) Filter by Name diff --git a/docs/data-sources/image_list.md b/docs/data-sources/image_list.md index 44f1c0e..2ac1219 100644 --- a/docs/data-sources/image_list.md +++ b/docs/data-sources/image_list.md @@ -20,6 +20,7 @@ description: |- - `architecture` (String) Filter by architecture - `bootable` (Boolean) Find bootable images - `by_id` (Number) Filter by ID +- `enabled` (Boolean) find by enabled True or False - `hot_resize` (Boolean) Find hot resizable images - `image_size` (Number) Filter by image size - `name` (String) Filter by name diff --git a/docs/data-sources/kvmvm.md b/docs/data-sources/kvmvm.md index 73091af..e5fc4bc 100644 --- a/docs/data-sources/kvmvm.md +++ b/docs/data-sources/kvmvm.md @@ -36,6 +36,7 @@ description: |- - `boot_order` (List of String) - `bootdisk_size` (Number) - `cd_image_id` (Number) +- `chipset` (String) - `clone_reference` (Number) - `clones` (List of Number) - `computeci_id` (Number) @@ -187,6 +188,7 @@ Read-Only: - `account_id` (Number) - `acl` (String) - `boot_partition` (Number) +- `bus_number` (Number) - `created_time` (Number) - `deleted_time` (Number) - `description` (String) @@ -278,6 +280,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -285,8 +288,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -298,6 +303,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `interfaces.qos` diff --git a/docs/data-sources/kvmvm_list.md b/docs/data-sources/kvmvm_list.md index 7e600dc..e069365 100644 --- a/docs/data-sources/kvmvm_list.md +++ b/docs/data-sources/kvmvm_list.md @@ -65,6 +65,7 @@ Read-Only: - `boot_order` (List of String) - `bootdisk_size` (Number) - `cd_image_id` (Number) +- `chipset` (String) - `clone_reference` (Number) - `clones` (List of Number) - `compute_id` (Number) @@ -160,6 +161,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `disk_id` (Number) - `pci_slot` (Number) @@ -169,6 +171,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -176,8 +179,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -189,6 +194,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `items.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `items.interfaces.qos` diff --git a/docs/data-sources/kvmvm_list_deleted.md b/docs/data-sources/kvmvm_list_deleted.md index 3fcfb52..984e139 100644 --- a/docs/data-sources/kvmvm_list_deleted.md +++ b/docs/data-sources/kvmvm_list_deleted.md @@ -63,6 +63,7 @@ Read-Only: - `boot_order` (List of String) - `bootdisk_size` (Number) - `cd_image_id` (Number) +- `chipset` (String) - `clone_reference` (Number) - `clones` (List of Number) - `compute_id` (Number) @@ -158,6 +159,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `disk_id` (Number) - `pci_slot` (Number) @@ -167,6 +169,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -174,8 +177,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -187,6 +192,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `items.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `items.interfaces.qos` diff --git a/docs/data-sources/resgroup.md b/docs/data-sources/resgroup.md index 8488a57..8032010 100644 --- a/docs/data-sources/resgroup.md +++ b/docs/data-sources/resgroup.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/rg_usage.md b/docs/data-sources/rg_usage.md index e67a3f2..70a26b0 100644 --- a/docs/data-sources/rg_usage.md +++ b/docs/data-sources/rg_usage.md @@ -21,7 +21,6 @@ description: |- ### Optional -- `reason` (String) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/data-sources/vins.md b/docs/data-sources/vins.md index 5191b2c..8007188 100644 --- a/docs/data-sources/vins.md +++ b/docs/data-sources/vins.md @@ -147,6 +147,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -154,8 +155,10 @@ Read-Only: - `flipgroup_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_mask` (Number) @@ -167,6 +170,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `vnf_dev.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `vnf_dev.interfaces.qos` diff --git a/docs/data-sources/vins_list.md b/docs/data-sources/vins_list.md index 93aee27..08f74b9 100644 --- a/docs/data-sources/vins_list.md +++ b/docs/data-sources/vins_list.md @@ -27,6 +27,7 @@ description: |- - `size` (Number) Page size - `sort_by` (String) sort by one of supported fields, format +|-(field) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- `vnf_dev_id` (Number) Filter by VNF Device id ### Read-Only diff --git a/docs/resources/account.md b/docs/resources/account.md index 3b6d5b3..8158055 100644 --- a/docs/resources/account.md +++ b/docs/resources/account.md @@ -92,10 +92,6 @@ Required: - `access_type` (String) - `user_id` (String) -Optional: - -- `recursive_delete` (Boolean) - ### Nested Schema for `acl` diff --git a/docs/resources/bservice_group.md b/docs/resources/bservice_group.md index 3cad961..6add535 100644 --- a/docs/resources/bservice_group.md +++ b/docs/resources/bservice_group.md @@ -21,7 +21,7 @@ description: |- - `compgroup_name` (String) name of the Compute Group to add - `cpu` (Number) compute CPU number. All computes in the group have the same CPU count - `disk` (Number) compute boot disk size in GB -- `driver` (String) compute driver like a KVM_X86, KVM_PPC, etc. +- `driver` (String) compute driver like a KVM_X86, etc. - `image_id` (Number) OS image ID to create computes from - `ram` (Number) compute RAM volume in MB. All computes in the group have the same RAM volume - `service_id` (Number) ID of the Basic Service to add a group to diff --git a/docs/resources/cb_account.md b/docs/resources/cb_account.md index 2e04df9..6ab77d9 100644 --- a/docs/resources/cb_account.md +++ b/docs/resources/cb_account.md @@ -95,10 +95,6 @@ Required: - `access_type` (String) - `user_id` (String) -Optional: - -- `recursive_delete` (Boolean) - ### Nested Schema for `acl` diff --git a/docs/resources/cb_cdrom_image.md b/docs/resources/cb_cdrom_image.md index 4d4fcb2..10f2ba0 100644 --- a/docs/resources/cb_cdrom_image.md +++ b/docs/resources/cb_cdrom_image.md @@ -17,7 +17,6 @@ description: |- ### Required -- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `gid` (Number) grid (platform) ID where this template should be create in - `name` (String) Name of the rescue disk - `url` (String) URL where to download ISO from @@ -25,14 +24,14 @@ description: |- ### Optional - `account_id` (Number) AccountId to make the image exclusive -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `bootable` (Boolean) Does this image boot OS - `computeci_id` (Number) +- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `enabled` (Boolean) - `enabled_stacks` (List of Number) - `hot_resize` (Boolean) Does this machine supports hot resize - `password_dl` (String) password for upload binary media -- `permanently` (Boolean) Whether to completely delete the image - `pool_name` (String) pool for image create - `sep_id` (Number) storage endpoint provider ID - `shared_with` (List of Number) diff --git a/docs/resources/cb_disk.md b/docs/resources/cb_disk.md index 73232e3..6f1d480 100644 --- a/docs/resources/cb_disk.md +++ b/docs/resources/cb_disk.md @@ -32,7 +32,6 @@ description: |- - `node_ids` (Set of Number) - `permanently` (Boolean) whether to completely delete the disk, works only with non attached disks - `pool` (String) -- `reason` (String) reason for an action - `restore` (Boolean) restore deleting disk - `sep_id` (Number) - `shareable` (Boolean) diff --git a/docs/resources/cb_disk_replication.md b/docs/resources/cb_disk_replication.md deleted file mode 100644 index 90a2332..0000000 --- a/docs/resources/cb_disk_replication.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "decort_cb_disk_replication Resource - terraform-provider-decort" -subcategory: "" -description: |- - ---- - -# decort_cb_disk_replication (Resource) - - - - - - -## Schema - -### Required - -- `disk_id` (Number) Id of primary disk -- `disk_name` (String) Name of disk replica -- `pool_name` (String) Pool for disk location -- `sep_id` (Number) Storage endpoint provider ID to create disk replica - -### Optional - -- `detach` (Boolean) Detach disk from machine first -- `pause` (Boolean) Resume replication -- `permanently` (Boolean) Delete disk permanently -- `reason` (String) Reason for disk deletion -- `reverse` (Boolean) Reverse replication -- `start` (Boolean) Start/Stop replication -- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - -### Read-Only - -- `account_id` (Number) -- `account_name` (String) -- `acl` (String) -- `boot_partition` (Number) -- `computes` (List of Object) (see [below for nested schema](#nestedatt--computes)) -- `created_time` (Number) -- `deleted_time` (Number) -- `desc` (String) -- `destruction_time` (Number) -- `devicename` (String) -- `disk_path` (String) -- `gid` (Number) -- `guid` (Number) -- `id` (String) The ID of this resource. -- `image_id` (Number) -- `images` (List of Number) -- `iotune` (List of Object) (see [below for nested schema](#nestedatt--iotune)) -- `iqn` (String) -- `login` (String) -- `milestones` (Number) -- `order` (Number) -- `params` (String) -- `parent_id` (Number) -- `passwd` (String) -- `pci_slot` (Number) -- `present_to` (List of Number) -- `purge_attempts` (Number) -- `purge_time` (Number) -- `reality_device_number` (Number) -- `reference_id` (String) -- `replica_disk_id` (Number) Id of replica disk -- `replication` (List of Object) Replication status (see [below for nested schema](#nestedatt--replication)) -- `res_id` (String) -- `res_name` (String) -- `role` (String) -- `sep_type` (String) -- `shareable` (Boolean) -- `size_max` (Number) -- `size_used` (Number) -- `snapshots` (List of Object) (see [below for nested schema](#nestedatt--snapshots)) -- `status` (String) -- `status_replication` (String) Status of replication -- `tech_status` (String) -- `type` (String) -- `vmid` (Number) - - -### Nested Schema for `timeouts` - -Optional: - -- `create` (String) -- `default` (String) -- `delete` (String) -- `read` (String) -- `update` (String) - - - -### Nested Schema for `computes` - -Read-Only: - -- `compute_id` (String) -- `compute_name` (String) - - - -### Nested Schema for `iotune` - -Read-Only: - -- `read_bytes_sec` (Number) -- `read_bytes_sec_max` (Number) -- `read_iops_sec` (Number) -- `read_iops_sec_max` (Number) -- `size_iops_sec` (Number) -- `total_bytes_sec` (Number) -- `total_bytes_sec_max` (Number) -- `total_iops_sec` (Number) -- `total_iops_sec_max` (Number) -- `write_bytes_sec` (Number) -- `write_bytes_sec_max` (Number) -- `write_iops_sec` (Number) -- `write_iops_sec_max` (Number) - - - -### Nested Schema for `replication` - -Read-Only: - -- `disk_id` (Number) -- `pool_id` (String) -- `role` (String) -- `self_volume_id` (String) -- `storage_id` (String) -- `volume_id` (String) - - - -### Nested Schema for `snapshots` - -Read-Only: - -- `guid` (String) -- `label` (String) -- `reference_id` (String) -- `res_id` (String) -- `snap_set_guid` (String) -- `snap_set_time` (Number) -- `timestamp` (Number) diff --git a/docs/resources/cb_dpdknet.md b/docs/resources/cb_dpdknet.md new file mode 100644 index 0000000..f3d84c0 --- /dev/null +++ b/docs/resources/cb_dpdknet.md @@ -0,0 +1,52 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_dpdknet Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_dpdknet (Resource) + + + + + + +## Schema + +### Required + +- `gid` (Number) ID of the grid (platform) +- `name` (String) Name of network +- `ovs_bridge` (String) OVS bridge in which interfaces for computers created +- `vlan_id` (Number) vlan ID + +### Optional + +- `account_access` (List of Number) List of accounts with access +- `desc` (String) Description of DPDK network +- `enabled` (Boolean) Enabled or disabled DPDK network +- `rg_access` (List of Number) List of resource groups with access +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `compute_ids` (List of Number) Compute IDs which uses this DPDK network +- `created_time` (Number) Created time +- `dpdk_id` (Number) The unique ID of the subscriber-owner of the DPDK network +- `guid` (Number) DPDK network ID on the storage side +- `id` (String) The ID of this resource. +- `status` (String) DPDK network status +- `updated_time` (Number) Updated time + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) diff --git a/docs/resources/cb_image.md b/docs/resources/cb_image.md index c5829b6..ccc06ad 100644 --- a/docs/resources/cb_image.md +++ b/docs/resources/cb_image.md @@ -26,7 +26,7 @@ description: |- - `account_id` (Number) AccountId to make the image exclusive - `accounts` (List of Number) -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `bootable` (Boolean) Does this image boot OS - `computeci_id` (Number) - `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] @@ -37,9 +37,7 @@ description: |- - `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming - `password` (String) Optional password for the image - `password_dl` (String) password for upload binary media -- `permanently` (Boolean) Whether to completely delete the image - `pool_name` (String) pool for image create -- `reason` (String) - `sep_id` (Number) storage endpoint provider ID - `shared_with` (List of Number) - `sync_mode` (Boolean) Create image from a media identified by URL (in synchronous mode) diff --git a/docs/resources/cb_image_from_blank_compute.md b/docs/resources/cb_image_from_blank_compute.md index a91a79f..42b4628 100644 --- a/docs/resources/cb_image_from_blank_compute.md +++ b/docs/resources/cb_image_from_blank_compute.md @@ -34,9 +34,7 @@ description: |- - `hot_resize` (Boolean) Does this machine supports hot resize - `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming - `password` (String) Optional password for the image -- `permanently` (Boolean) whether to completely delete the image - `pool_name` (String) pool for image create -- `reason` (String) - `sep_id` (Number) storage endpoint provider ID - `shared_with` (List of Number) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/cb_image_from_platform_disk.md b/docs/resources/cb_image_from_platform_disk.md index e70ee6f..bd6ac0f 100644 --- a/docs/resources/cb_image_from_platform_disk.md +++ b/docs/resources/cb_image_from_platform_disk.md @@ -20,6 +20,7 @@ description: |- - `architecture` (String) Image type linux, windows or other - `boot_type` (String) Boot type of image BIOS or UEFI - `disk_id` (Number) Disk Id +- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `image_type` (String) Image type linux, windows or other - `name` (String) Name of the rescue disk @@ -30,15 +31,12 @@ description: |- - `async_mode` (Boolean) create an image in async/sync mode - `bootable` (Boolean) Does this image boot OS - `computeci_id` (Number) -- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `enabled` (Boolean) - `enabled_stacks` (List of Number) - `hot_resize` (Boolean) Does this machine supports hot resize - `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming - `password` (String) Optional password for the image -- `permanently` (Boolean) whether to completely delete the image - `pool_name` (String) pool for image create -- `reason` (String) - `sep_id` (Number) storage endpoint provider ID - `shared_with` (List of Number) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/cb_k8s_cp.md b/docs/resources/cb_k8s_cp.md index 674f5e5..c4664d9 100644 --- a/docs/resources/cb_k8s_cp.md +++ b/docs/resources/cb_k8s_cp.md @@ -25,6 +25,7 @@ description: |- ### Optional - `additional_sans` (List of String) Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names +- `chipset` (String) Type of the emulated system. - `cluster_config` (String) is used to define global settings and configurations for the entire cluster. It includes parameters such as cluster name, DNS settings, authentication methods, and other cluster-wide configurations. insert a valid JSON string with all levels of nesting. - `cpu` (Number) Node CPU count. - `desc` (String) Text description of this instance. diff --git a/docs/resources/cb_k8s_wg.md b/docs/resources/cb_k8s_wg.md index 8ebe078..ebde964 100644 --- a/docs/resources/cb_k8s_wg.md +++ b/docs/resources/cb_k8s_wg.md @@ -23,6 +23,7 @@ description: |- ### Optional - `annotations` (List of String) +- `chipset` (String) Type of the emulated system. - `cloud_init` (String) - `cpu` (Number) Worker node CPU count. - `disk` (Number) Worker node boot disk size. If unspecified or 0, size is defined by OS image size. diff --git a/docs/resources/cb_kvmvm.md b/docs/resources/cb_kvmvm.md index 0dbfdb3..977ce5a 100644 --- a/docs/resources/cb_kvmvm.md +++ b/docs/resources/cb_kvmvm.md @@ -32,6 +32,7 @@ description: |- - `auto_start` (Boolean) Flag for redeploy compute - `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image. - `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd)) +- `chipset` (String) Type of the emulated system. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `custom_fields` (String) @@ -49,6 +50,7 @@ description: |- - `image_id` (Number) ID of the OS image to base this compute instance on. - `ipa_type` (String) compute purpose - `is` (String) system name +- `libvirt_settings` (Block Set) Configure libvirt virtio interface parameters. You can only delete values locally. Data on the platform cannot be deleted. (see [below for nested schema](#nestedblock--libvirt_settings)) - `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)) - `numa_affinity` (String) Rule for VM placement with NUMA affinity. - `pause` (Boolean) @@ -57,7 +59,6 @@ description: |- - `pin_to_stack` (Boolean) - `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system. - `port_forwarding` (Block Set) (see [below for nested schema](#nestedblock--port_forwarding)) -- `reason` (String) reason for action - `reset` (Boolean) - `restore` (Boolean) - `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback)) @@ -87,6 +88,7 @@ description: |- - `computeci_id` (Number) - `created_by` (String) - `created_time` (Number) +- `delete_async_mode` (Boolean) async mode - `deleted_by` (String) - `deleted_time` (Number) - `devices` (String) @@ -164,10 +166,6 @@ Required: - `cdrom_id` (Number) -Optional: - -- `reason` (String) reason for action - ### Nested Schema for `disks` @@ -185,7 +183,6 @@ Optional: - `node_ids` (Set of Number) - `permanently` (Boolean) Disk deletion status - `pool` (String) Pool name; by default will be chosen automatically -- `reason` (String) reason for action - `sep_id` (Number) Storage endpoint provider ID; by default the same with boot disk Read-Only: @@ -196,6 +193,23 @@ Read-Only: - `size_used` (Number) + +### Nested Schema for `libvirt_settings` + +Required: + +- `mac` (String) + +Optional: + +- `event_idx` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `network` @@ -226,7 +240,6 @@ Optional: - `local_port` (Number) - `public_port_end` (Number) -- `reason` (String) reason for action Read-Only: @@ -297,6 +310,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -304,8 +318,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -317,6 +333,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `interfaces.qos` diff --git a/docs/resources/cb_rg.md b/docs/resources/cb_rg.md index 08e8004..0c99ebd 100644 --- a/docs/resources/cb_rg.md +++ b/docs/resources/cb_rg.md @@ -37,7 +37,6 @@ description: |- - `ipcidr` (String) Address of the netowrk inside the private network segment (aka ViNS) if def_net_type=PRIVATE - `owner` (String) username - owner of this RG. Leave blank to set current user as owner - `permanently` (Boolean) flag to permanently delete resource group -- `reason` (String) - `register_computes` (Boolean) Register computes in registration system - `resource_limits` (Block List, Max: 1) (see [below for nested schema](#nestedblock--resource_limits)) - `restore` (Boolean) restore deleted rg @@ -74,10 +73,6 @@ Required: - `right` (String) Access rights to set, one of 'R', 'RCX' or 'ARCXDU' - `user` (String) User or group name to grant access -Optional: - -- `reason` (String) Reason for action - ### Nested Schema for `def_net` @@ -89,7 +84,6 @@ Required: Optional: - `net_id` (Number) Network segment ID. If netType is PUBLIC and netId is 0 then default external network segment will be selected. If netType is PRIVATE and netId=0, the first ViNS defined for this RG will be selected. Otherwise, netId identifies either existing external network segment or ViNS. -- `reason` (String) Reason for action diff --git a/docs/resources/cb_vins.md b/docs/resources/cb_vins.md index c3edd95..de64db8 100644 --- a/docs/resources/cb_vins.md +++ b/docs/resources/cb_vins.md @@ -35,7 +35,6 @@ description: |- - `nat_rule` (Block List) (see [below for nested schema](#nestedblock--nat_rule)) - `permanently` (Boolean) permanently for delete request - `pre_reservations_num` (Number) -- `reason` (String) - `rg_id` (Number) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `vins_id` (Number) vins id @@ -98,7 +97,6 @@ Optional: - `compute_id` (Number) - `ip_addr` (String) - `mac` (String) -- `reason` (String) @@ -206,6 +204,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -213,8 +212,10 @@ Read-Only: - `flipgroup_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_mask` (Number) @@ -226,6 +227,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `vnf_dev.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `vnf_dev.interfaces.qos` diff --git a/docs/resources/cb_virtual_image.md b/docs/resources/cb_virtual_image.md index effce4f..a111057 100644 --- a/docs/resources/cb_virtual_image.md +++ b/docs/resources/cb_virtual_image.md @@ -29,8 +29,6 @@ description: |- - `enabled_stacks` (List of Number) - `hot_resize` (Boolean) Does this machine supports hot resize - `password` (String) Optional password for the image -- `permanently` (Boolean) Whether to completely delete the image -- `reason` (String) - `shared_with` (List of Number) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `username` (String) Optional username for the image @@ -38,7 +36,7 @@ description: |- ### Read-Only - `acl` (List of Object) (see [below for nested schema](#nestedatt--acl)) -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `boot_type` (String) Boot type of image bios or uefi - `ckey` (String) - `deleted_time` (Number) diff --git a/docs/resources/disk.md b/docs/resources/disk.md index 976fc55..ea55a47 100644 --- a/docs/resources/disk.md +++ b/docs/resources/disk.md @@ -29,7 +29,6 @@ description: |- - `iotune` (Block List, Max: 1) (see [below for nested schema](#nestedblock--iotune)) - `permanently` (Boolean) Whether to completely delete the disk, works only with non attached disks - `pool` (String) Pool for disk location -- `reason` (String) Reason for deletion - `sep_id` (Number) Storage endpoint provider ID to create disk - `shareable` (Boolean) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/disk_replication.md b/docs/resources/disk_replication.md deleted file mode 100644 index 502646b..0000000 --- a/docs/resources/disk_replication.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "decort_disk_replication Resource - terraform-provider-decort" -subcategory: "" -description: |- - ---- - -# decort_disk_replication (Resource) - - - - - - -## Schema - -### Required - -- `disk_id` (Number) Id of primary disk -- `disk_name` (String) Name of disk replica -- `pool_name` (String) Pool for disk location -- `sep_id` (Number) Storage endpoint provider ID to create disk replica - -### Optional - -- `detach` (Boolean) Detach disk from machine first -- `pause` (Boolean) Resume replication -- `permanently` (Boolean) Delete disk permanently -- `reason` (String) Reason for disk deletion -- `reverse` (Boolean) Reverse replication -- `start` (Boolean) Start/Stop replication -- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - -### Read-Only - -- `account_id` (Number) The unique ID of the subscriber-owner of the disk -- `account_name` (String) The name of the subscriber '(account') to whom this disk belongs -- `acl` (String) -- `computes` (List of Object) (see [below for nested schema](#nestedatt--computes)) -- `created_time` (Number) Created time -- `deleted_time` (Number) Deleted time -- `desc` (String) Description of disk -- `destruction_time` (Number) Time of final deletion -- `devicename` (String) Name of the device -- `gid` (Number) ID of the grid (platform) -- `id` (String) The ID of this resource. -- `image_id` (Number) Image ID -- `images` (List of String) IDs of images using the disk -- `iotune` (List of Object) (see [below for nested schema](#nestedatt--iotune)) -- `order` (Number) Disk order -- `params` (String) Disk params -- `parent_id` (Number) ID of the parent disk -- `pci_slot` (Number) ID of the pci slot to which the disk is connected -- `present_to` (List of Number) -- `purge_time` (Number) Time of the last deletion attempt -- `replica_disk_id` (Number) Id of replica disk -- `replication` (List of Object) Replication status (see [below for nested schema](#nestedatt--replication)) -- `res_id` (String) Resource ID -- `res_name` (String) Name of the resource -- `role` (String) Disk role -- `sep_type` (String) Type SEP. Defines the type of storage system and contains one of the values set in the cloud platform -- `shareable` (Boolean) -- `size_max` (Number) Size in GB -- `size_used` (Number) Number of used space, in GB -- `snapshots` (List of Object) (see [below for nested schema](#nestedatt--snapshots)) -- `status` (String) Disk status -- `status_replication` (String) Status of replication -- `tech_status` (String) Technical status of the disk -- `type` (String) The type of disk in terms of its role in compute: 'B=Boot, D=Data, T=Temp' -- `vmid` (Number) Virtual Machine ID (Deprecated) - - -### Nested Schema for `timeouts` - -Optional: - -- `create` (String) -- `default` (String) -- `delete` (String) -- `read` (String) -- `update` (String) - - - -### Nested Schema for `computes` - -Read-Only: - -- `compute_id` (String) -- `compute_name` (String) - - - -### Nested Schema for `iotune` - -Read-Only: - -- `read_bytes_sec` (Number) -- `read_bytes_sec_max` (Number) -- `read_iops_sec` (Number) -- `read_iops_sec_max` (Number) -- `size_iops_sec` (Number) -- `total_bytes_sec` (Number) -- `total_bytes_sec_max` (Number) -- `total_iops_sec` (Number) -- `total_iops_sec_max` (Number) -- `write_bytes_sec` (Number) -- `write_bytes_sec_max` (Number) -- `write_iops_sec` (Number) -- `write_iops_sec_max` (Number) - - - -### Nested Schema for `replication` - -Read-Only: - -- `disk_id` (Number) -- `pool_id` (String) -- `role` (String) -- `self_volume_id` (String) -- `storage_id` (String) -- `volume_id` (String) - - - -### Nested Schema for `snapshots` - -Read-Only: - -- `guid` (String) -- `label` (String) -- `res_id` (String) -- `snap_set_guid` (String) -- `snap_set_time` (Number) -- `timestamp` (Number) diff --git a/docs/resources/image.md b/docs/resources/image.md index 46ace49..0c9a596 100644 --- a/docs/resources/image.md +++ b/docs/resources/image.md @@ -26,13 +26,12 @@ description: |- ### Optional -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `hot_resize` (Boolean) Does this machine supports hot resize - `image_id` (Number) image id - `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming - `password` (String) Optional password for the image - `password_dl` (String) password for upload binary media -- `permanently` (Boolean) whether to completely delete the image - `pool_name` (String) pool for image create - `sep_id` (Number) storage endpoint provider ID - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/image_from_blank_compute.md b/docs/resources/image_from_blank_compute.md index 4c17897..4f01965 100644 --- a/docs/resources/image_from_blank_compute.md +++ b/docs/resources/image_from_blank_compute.md @@ -28,7 +28,6 @@ description: |- - `async_mode` (Boolean) create an image in async/sync mode - `hot_resize` (Boolean) Does this machine supports hot resize - `password` (String) Optional password for the image -- `permanently` (Boolean) whether to completely delete the image - `pool_name` (String) pool for image create - `sep_id` (Number) storage endpoint provider ID - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/image_from_platform_disk.md b/docs/resources/image_from_platform_disk.md index 8111cce..c6c63fa 100644 --- a/docs/resources/image_from_platform_disk.md +++ b/docs/resources/image_from_platform_disk.md @@ -17,9 +17,10 @@ description: |- ### Required -- `architecture` (String) binary architecture of this image, one of X86_64 of PPC64_LE +- `architecture` (String) binary architecture of this image, one of X86_64 - `boot_type` (String) Boot type of image BIOS or UEFI - `disk_id` (Number) Disk Id +- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `name` (String) Name of the rescue disk - `type` (String) Image type linux, windows or other @@ -28,10 +29,8 @@ description: |- - `account_id` (Number) AccountId to make the image exclusive - `async_mode` (Boolean) create an image in async/sync mode - `bootable` (Boolean) bootable image -- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ] - `hot_resize` (Boolean) Does this machine supports hot resize - `password` (String) Optional password for the image -- `permanently` (Boolean) whether to completely delete the image - `pool_name` (String) pool for image create - `sep_id` (Number) storage endpoint provider ID - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) diff --git a/docs/resources/image_virtual.md b/docs/resources/image_virtual.md index 5867461..6aff231 100644 --- a/docs/resources/image_virtual.md +++ b/docs/resources/image_virtual.md @@ -22,7 +22,6 @@ description: |- ### Optional -- `permanently` (Boolean) whether to completely delete the image - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/resources/k8s.md b/docs/resources/k8s.md index 7f34bdd..a8f11dd 100644 --- a/docs/resources/k8s.md +++ b/docs/resources/k8s.md @@ -27,6 +27,7 @@ description: |- - `additional_sans` (List of String) Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names - `annotations` (List of String) +- `chipset` (String) Type of the emulated system. - `cloud_init` (String) Meta data for working group computes, format YAML 'user_data': 1111 - `cluster_config` (String) is used to define global settings and configurations for the entire cluster. It includes parameters such as cluster name, DNS settings, authentication methods, and other cluster-wide configurations. insert a valid JSON string with all levels of nesting. - `desc` (String) Text description of this instance. @@ -142,6 +143,7 @@ Required: Optional: - `annotations` (List of String) +- `chipset` (String) Type of the emulated system. - `labels` (List of String) - `sep_id` (Number) - `sep_pool` (String) diff --git a/docs/resources/k8s_cp.md b/docs/resources/k8s_cp.md index 6584463..9567b4b 100644 --- a/docs/resources/k8s_cp.md +++ b/docs/resources/k8s_cp.md @@ -25,6 +25,7 @@ description: |- ### Optional - `additional_sans` (List of String) Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names +- `chipset` (String) Type of the emulated system. - `cluster_config` (String) is used to define global settings and configurations for the entire cluster. It includes parameters such as cluster name, DNS settings, authentication methods, and other cluster-wide configurations. insert a valid JSON string with all levels of nesting. - `cpu` (Number) Node CPU count. - `desc` (String) Text description of this instance. diff --git a/docs/resources/k8s_wg.md b/docs/resources/k8s_wg.md index 5838eea..0edfc26 100644 --- a/docs/resources/k8s_wg.md +++ b/docs/resources/k8s_wg.md @@ -23,6 +23,7 @@ description: |- ### Optional - `annotations` (List of String) +- `chipset` (String) Type of the emulated system. - `cloud_init` (String) - `cpu` (Number) Worker node CPU count. - `disk` (Number) Worker node boot disk size. If unspecified or 0, size is defined by OS image size. diff --git a/docs/resources/kvmvm.md b/docs/resources/kvmvm.md index 9b2e954..d78ea96 100644 --- a/docs/resources/kvmvm.md +++ b/docs/resources/kvmvm.md @@ -31,6 +31,7 @@ description: |- - `auto_start` (Boolean) Flag for redeploy compute - `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image. - `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd)) +- `chipset` (String) Type of the emulated system. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `custom_fields` (String) @@ -59,6 +60,7 @@ description: |- - `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback)) - `sep_id` (Number) ID of SEP to create bootDisk on. Uses image's sepId if not set. - `snapshot` (Block Set) (see [below for nested schema](#nestedblock--snapshot)) +- `snapshot_delete_async` (Boolean) - `started` (Boolean) Is compute started. - `stateless` (Boolean) Compute will be stateless (SVA_KVM_X86) if set to True - `tags` (Block Set) (see [below for nested schema](#nestedblock--tags)) @@ -285,6 +287,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -292,8 +295,10 @@ Read-Only: - `flip_group_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_type` (String) @@ -305,6 +310,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `interfaces.qos` diff --git a/docs/resources/resgroup.md b/docs/resources/resgroup.md index 1f7ac35..4f9c4d0 100644 --- a/docs/resources/resgroup.md +++ b/docs/resources/resgroup.md @@ -35,10 +35,10 @@ description: |- - `owner` (String) - `permanently` (Boolean) Set to True if you want force delete non-empty RG - `quota` (Block List, Max: 1) Quota settings for this resource group. (see [below for nested schema](#nestedblock--quota)) -- `reason` (String) Set to True if you want force delete non-empty RG - `register_computes` (Boolean) Register computes in registration system - `restore` (Boolean) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- `uniq_pools` (List of String) ### Read-Only @@ -59,7 +59,6 @@ description: |- - `rg_id` (Number) - `secret` (String) - `status` (String) Current status of this resource group. -- `uniq_pools` (List of String) - `updated_by` (String) - `updated_time` (Number) - `vins` (List of Number) List of VINs deployed in this resource group. @@ -73,10 +72,6 @@ Required: - `right` (String) Access rights to set, one of 'R', 'RCX' or 'ARCXDU' - `user` (String) User or group name to grant access -Optional: - -- `reason` (String) Reason for action - ### Nested Schema for `def_net` @@ -88,7 +83,6 @@ Required: Optional: - `net_id` (Number) Network segment ID. If netType is PUBLIC and netId is 0 then default external network segment will be selected. If netType is PRIVATE and netId=0, the first ViNS defined for this RG will be selected. Otherwise, netId identifies either existing external network segment or ViNS. -- `reason` (String) Reason for action diff --git a/docs/resources/snapshot.md b/docs/resources/snapshot.md index 3e2f701..cb9be59 100644 --- a/docs/resources/snapshot.md +++ b/docs/resources/snapshot.md @@ -27,6 +27,7 @@ description: |- ### Read-Only +- `delete_async_mode` (Boolean) async mode - `disks` (List of Number) - `guid` (String) guid of the snapshot - `id` (String) The ID of this resource. diff --git a/docs/resources/vins.md b/docs/resources/vins.md index 262ba1e..fc897ef 100644 --- a/docs/resources/vins.md +++ b/docs/resources/vins.md @@ -202,6 +202,7 @@ Read-Only: Read-Only: +- `bus_number` (Number) - `conn_id` (Number) - `conn_type` (String) - `def_gw` (String) @@ -209,8 +210,10 @@ Read-Only: - `flipgroup_id` (Number) - `guid` (String) - `ip_address` (String) +- `libvirt_settings` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--libvirt_settings)) - `listen_ssh` (Boolean) - `mac` (String) +- `mtu` (Number) - `name` (String) - `net_id` (Number) - `net_mask` (Number) @@ -222,6 +225,20 @@ Read-Only: - `type` (String) - `vnfs` (List of Number) + +### Nested Schema for `vnf_dev.interfaces.libvirt_settings` + +Read-Only: + +- `event_idx` (String) +- `guid` (String) +- `ioeventfd` (String) +- `queues` (Number) +- `rx_queue_size` (Number) +- `tx_queue_size` (Number) +- `txmode` (String) + + ### Nested Schema for `vnf_dev.interfaces.qos` diff --git a/go.mod b/go.mod index 4934fac..2f6a7c8 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0 github.com/sirupsen/logrus v1.9.0 golang.org/x/net v0.23.0 - repository.basistech.ru/BASIS/decort-golang-sdk v1.8.3 + repository.basistech.ru/BASIS/decort-golang-sdk v1.9.0 ) require ( @@ -58,7 +58,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mitchellh/cli v1.1.5 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -66,7 +65,6 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/oklog/run v1.1.0 // indirect github.com/posener/complete v1.2.3 // indirect - github.com/russross/blackfriday v1.6.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect diff --git a/go.sum b/go.sum index 365e43f..1142d2e 100644 --- a/go.sum +++ b/go.sum @@ -5,15 +5,11 @@ github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+ github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/ProtonMail/go-crypto v1.1.0-alpha.0 h1:nHGfwXmFvJrSR9xu8qL7BkO4DqTHXE9N5vPhgY2I+j0= -github.com/ProtonMail/go-crypto v1.1.0-alpha.0/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= github.com/ProtonMail/go-crypto v1.1.0-alpha.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= @@ -21,7 +17,6 @@ github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= @@ -36,7 +31,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= @@ -45,7 +39,6 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -69,7 +62,6 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/cli v1.1.6 h1:CMOV+/LJfL1tXCOKrgAX0uRKnzjj/mpmqNXloRSy2K8= @@ -94,28 +86,18 @@ github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hc-install v0.6.3 h1:yE/r1yJvWbtrJ0STwScgEnCanb0U9v7zp0Gbkmcoxqs= -github.com/hashicorp/hc-install v0.6.3/go.mod h1:KamGdbodYzlufbWh4r9NRo8y6GLHWZP2GBtdnms1Ln0= github.com/hashicorp/hc-install v0.7.0 h1:Uu9edVqjKQxxuD28mR5TikkKDd/p55S8vzPC1659aBk= github.com/hashicorp/hc-install v0.7.0/go.mod h1:ELmmzZlGnEcqoUMKUuykHaPCIR1sYLYX+KSggWSKZuA= github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/terraform-exec v0.20.0 h1:DIZnPsqzPGuUnq6cH8jWcPunBfY+C+M8JyYF3vpnuEo= -github.com/hashicorp/terraform-exec v0.20.0/go.mod h1:ckKGkJWbsNqFKV1itgMnE0hY9IYf1HoiekpuN0eWoDw= github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ= github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= -github.com/hashicorp/terraform-json v0.21.0 h1:9NQxbLNqPbEMze+S6+YluEdXgJmhQykRyRNd+zTI05U= -github.com/hashicorp/terraform-json v0.21.0/go.mod h1:qdeBs11ovMzo5puhrRibdD6d2Dq6TyE/28JiU4tIQxk= github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= -github.com/hashicorp/terraform-plugin-docs v0.13.0 h1:6e+VIWsVGb6jYJewfzq2ok2smPzZrt1Wlm9koLeKazY= -github.com/hashicorp/terraform-plugin-docs v0.13.0/go.mod h1:W0oCmHAjIlTHBbvtppWHe8fLfZ2BznQbuv8+UD8OucQ= github.com/hashicorp/terraform-plugin-docs v0.19.4 h1:G3Bgo7J22OMtegIgn8Cd/CaSeyEljqjH3G39w28JK4c= github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:4pLASsatTmRynVzsjEhbXZ6s7xBlUw/2Kt0zfrq8HxA= github.com/hashicorp/terraform-plugin-go v0.22.0 h1:1OS1Jk5mO0f5hrziWJGXXIxBrMe2j/B8E+DVGw43Xmc= @@ -130,8 +112,6 @@ github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -149,12 +129,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -162,8 +140,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= -github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -181,21 +157,15 @@ github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -206,7 +176,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -226,26 +195,18 @@ github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= -github.com/zclconf/go-cty v1.14.2 h1:kTG7lqmBou0Zkx35r6HJHUQTvaRPr5bIAf3AoHS0izI= -github.com/zclconf/go-cty v1.14.2/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw= go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -253,15 +214,12 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -275,8 +233,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -288,8 +244,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -319,5 +273,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -repository.basistech.ru/BASIS/decort-golang-sdk v1.8.3 h1:fCwFvZR+HID7ie4Aap7cJd6SbuJ+4gBWysKaMQDCPgc= -repository.basistech.ru/BASIS/decort-golang-sdk v1.8.3/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo= +repository.basistech.ru/BASIS/decort-golang-sdk v1.9.0 h1:RLOWSc7EJ6O37aPHQI9gkJ2JfuZMzGonF2PKeWN6sXw= +repository.basistech.ru/BASIS/decort-golang-sdk v1.9.0/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo= diff --git a/internal/provider/data_sources_map.go b/internal/provider/data_sources_map.go index 353db7d..de5e343 100644 --- a/internal/provider/data_sources_map.go +++ b/internal/provider/data_sources_map.go @@ -23,8 +23,10 @@ package provider import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/account" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/audit" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/bservice" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/disks" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/dpdknet" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/extnet" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/flipgroup" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/image" @@ -41,6 +43,7 @@ import ( cb_account "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/account" cb_audit "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/audit" cb_disks "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/disks" + cb_dpdknet "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/dpdknet" cb_extnet "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/extnet" cb_flipgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/flipgroup" cb_grid "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/grid" @@ -63,6 +66,7 @@ import ( func newDataSourcesMap() map[string]*schema.Resource { return map[string]*schema.Resource{ "decort_account": account.DataSourceAccount(), + "decort_audit": audit.DataSourceAudit(), "decort_resgroup": rg.DataSourceResgroup(), "decort_kvmvm": kvmvm.DataSourceCompute(), "decort_kvmvm_list": kvmvm.DataSourceComputeList(), @@ -127,6 +131,8 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_bservice_snapshot_list": bservice.DataSourceBasicServiceSnapshotList(), "decort_bservice_group": bservice.DataSourceBasicServiceGroup(), "decort_bservice_deleted_list": bservice.DataSourceBasicServiceDeletedList(), + "decort_dpdknet": dpdknet.DataSourceDPDKNet(), + "decort_dpdknet_list": dpdknet.DataSourceDPDKNetList(), "decort_extnet_list": extnet.DataSourceExtnetList(), "decort_extnet_computes_list": extnet.DataSourceExtnetComputesList(), "decort_extnet": extnet.DataSourceExtnet(), @@ -168,6 +174,9 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_cb_audit": cb_audit.DataSourceAudit(), "decort_cb_audit_list": cb_audit.DataSourceAuditList(), "decort_cb_audit_linked_jobs": cb_audit.DataSourceAuditLinkedJobs(), + "decort_cb_audits_export_to_file": cb_audit.DataSourceAuditsToFile(), + "decort_cb_dpdknet": cb_dpdknet.DataSourceDPDKNet(), + "decort_cb_dpdknet_list": cb_dpdknet.DataSourceDPDKNetList(), "decort_cb_extnet": cb_extnet.DataSourceExtnetCB(), "decort_cb_extnet_list": cb_extnet.DataSourceExtnetListCB(), "decort_cb_extnet_default": cb_extnet.DataSourceExtnetDefaultCB(), @@ -179,6 +188,7 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_cb_grid_post_status": cb_grid.DataSourceGridPostStatus(), "decort_cb_grid_get_diagnosis": cb_grid.DataSourceGridGetDiagnosis(), "decort_cb_grid_post_diagnosis": cb_grid.DataSourceGridPostDiagnosis(), + "decort_cb_grid_get_settings": cb_grid.DataSourceGridGetSettings(), "decort_cb_grid_list": cb_grid.DataSourceGridList(), "decort_cb_grid_list_emails": cb_grid.DataSourceGridListEmails(), "decort_cb_grid_list_consumption": cb_grid.DataSourceGridListConsumption(), diff --git a/internal/provider/resource_map.go b/internal/provider/resource_map.go index 0858cb3..efb1113 100644 --- a/internal/provider/resource_map.go +++ b/internal/provider/resource_map.go @@ -37,6 +37,7 @@ import ( cb_account "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/account" cb_disks "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/disks" + cb_dpdknet "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/dpdknet" cb_extnet "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/extnet" cb_flipgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/flipgroup" cb_image "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/image" @@ -54,11 +55,11 @@ import ( func newResourcesMap() map[string]*schema.Resource { return map[string]*schema.Resource{ - "decort_resgroup": rg.ResourceResgroup(), - "decort_kvmvm": kvmvm.ResourceCompute(), - "decort_disk": disks.ResourceDisk(), - "decort_disk_snapshot": disks.ResourceDiskSnapshot(), - "decort_disk_replication": disks.ResourceDiskReplication(), + "decort_resgroup": rg.ResourceResgroup(), + "decort_kvmvm": kvmvm.ResourceCompute(), + "decort_disk": disks.ResourceDisk(), + "decort_disk_snapshot": disks.ResourceDiskSnapshot(), + //"decort_disk_replication": disks.ResourceDiskReplication(), "decort_vins": vins.ResourceVins(), "decort_pfw": pfw.ResourcePfw(), "decort_k8s": k8s.ResourceK8s(), @@ -80,12 +81,13 @@ func newResourcesMap() map[string]*schema.Resource { "decort_flipgroup": flipgroup.ResourceFlipgroup(), "decort_vins_static_route": vins.ResourceStaticRoute(), - "decort_cb_account": cb_account.ResourceAccount(), - "decort_cb_extnet": cb_extnet.ResourceExtnetCB(), - "decort_cb_extnet_static_route": cb_extnet.ResourceStaticRoute(), - "decort_cb_disk": cb_disks.ResourceDisk(), - "decort_cb_disk_snapshot": cb_disks.ResourceDiskSnapshot(), - "decort_cb_disk_replication": cb_disks.ResourceDiskReplication(), + "decort_cb_account": cb_account.ResourceAccount(), + "decort_cb_dpdknet": cb_dpdknet.ResourceDPDKNet(), + "decort_cb_extnet": cb_extnet.ResourceExtnetCB(), + "decort_cb_extnet_static_route": cb_extnet.ResourceStaticRoute(), + "decort_cb_disk": cb_disks.ResourceDisk(), + "decort_cb_disk_snapshot": cb_disks.ResourceDiskSnapshot(), + //"decort_cb_disk_replication": cb_disks.ResourceDiskReplication(), "decort_cb_image": cb_image.ResourceImage(), "decort_cb_image_from_blank_compute": cb_image.ResourceImageFromBlankCompute(), "decort_cb_image_from_platform_disk": cb_image.ResourceImageFromPlatformDisk(), diff --git a/internal/service/cloudapi/account/data_source_account_flipgroups_list.go b/internal/service/cloudapi/account/data_source_account_flipgroups_list.go index 282ae4c..5fdc224 100644 --- a/internal/service/cloudapi/account/data_source_account_flipgroups_list.go +++ b/internal/service/cloudapi/account/data_source_account_flipgroups_list.go @@ -126,6 +126,11 @@ func dataSourceAccountFlipGroupsListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Filter by flipgroup ID", }, + "sort_by": { + Type: schema.TypeString, + Optional: true, + Description: "sort by one of supported fields, format +|-(field)", + }, "page": { Type: schema.TypeInt, Optional: true, diff --git a/internal/service/cloudapi/account/resource_account.go b/internal/service/cloudapi/account/resource_account.go index c867f9f..5a4fa07 100644 --- a/internal/service/cloudapi/account/resource_account.go +++ b/internal/service/cloudapi/account/resource_account.go @@ -315,9 +315,8 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf userConv := user.(map[string]interface{}) req := account.DeleteUserRequest{ - AccountID: accountId, - UserID: userConv["user_id"].(string), - RecursiveDelete: userConv["recursive_delete"].(bool), + AccountID: accountId, + UserID: userConv["user_id"].(string), } _, err := c.CloudAPI().Account().DeleteUser(ctx, req) if err != nil { @@ -381,8 +380,7 @@ func isChangedUser(els []interface{}, el interface{}) bool { elOldConv := elOld.(map[string]interface{}) elConv := el.(map[string]interface{}) if elOldConv["user_id"].(string) == elConv["user_id"].(string) && - (!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string)) || - elOldConv["recursive_delete"].(bool) != elConv["recursive_delete"].(bool)) { + (!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string))) { return true } } @@ -424,11 +422,6 @@ func resourceAccountSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Required: true, }, - "recursive_delete": { - Type: schema.TypeBool, - Optional: true, - Default: false, - }, }, }, }, diff --git a/internal/service/cloudapi/account/utility_account_flip_groups.go b/internal/service/cloudapi/account/utility_account_flip_groups.go index aa30fdc..ea30177 100644 --- a/internal/service/cloudapi/account/utility_account_flip_groups.go +++ b/internal/service/cloudapi/account/utility_account_flip_groups.go @@ -72,6 +72,10 @@ func utilityAccountFlipGroupsListCheckPresence(ctx context.Context, d *schema.Re req.ByIP = by_ip.(string) } + if sortBy, ok := d.GetOk("sort_by"); ok { + req.SortBy = sortBy.(string) + } + if flipgroup_id, ok := d.GetOk("flipgroup_id"); ok { req.FLIPGroupID = uint64(flipgroup_id.(int)) } diff --git a/internal/service/cloudapi/audit/data_source_audit.go b/internal/service/cloudapi/audit/data_source_audit.go new file mode 100644 index 0000000..bc31a4d --- /dev/null +++ b/internal/service/cloudapi/audit/data_source_audit.go @@ -0,0 +1,128 @@ +/* +Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Sergey Kisil, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package audit + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceAuditRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + auditRec, err := utilityAuditCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") // ensure ID is empty in this case + return diag.FromErr(err) + } + + flattenAudit(d, auditRec) + d.SetId(d.Get("audit_guid").(string)) + + return nil +} + +func DataSourceAudit() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceAuditRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceAuditSchemaMake(), + } +} + +func dataSourceAuditSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "audit_guid": { + Type: schema.TypeString, + Required: true, + Description: "audit guid", + }, + + "args": { + Type: schema.TypeString, + Computed: true, + }, + "call": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "kwargs": { + Type: schema.TypeString, + Computed: true, + }, + "remote_addr": { + Type: schema.TypeString, + Computed: true, + }, + "responsetime": { + Type: schema.TypeFloat, + Computed: true, + }, + "result": { + Type: schema.TypeString, + Computed: true, + }, + "status_code": { + Type: schema.TypeInt, + Computed: true, + }, + "tags": { + Type: schema.TypeString, + Computed: true, + }, + "timestamp": { + Type: schema.TypeFloat, + Computed: true, + }, + "timestamp_end": { + Type: schema.TypeFloat, + Computed: true, + }, + "user": { + Type: schema.TypeString, + Computed: true, + }, + } +} diff --git a/internal/service/cloudapi/audit/flattens.go b/internal/service/cloudapi/audit/flattens.go new file mode 100644 index 0000000..fd2117c --- /dev/null +++ b/internal/service/cloudapi/audit/flattens.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Sergey Kisil, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package audit + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/audit" +) + +func flattenAudit(d *schema.ResourceData, au *audit.RecordAudit) { + log.Debugf("flattenAudit: decoded audit guid %s", d.Get("audit_guid").(string)) + + d.Set("args", au.Arguments) + d.Set("call", au.Call) + d.Set("guid", au.GUID) + d.Set("kwargs", au.Kwargs) + d.Set("remote_addr", au.RemoteAddr) + d.Set("responsetime", au.ResponseTime) + d.Set("result", au.Result) + d.Set("status_code", au.StatusCode) + d.Set("tags", au.Tags) + d.Set("timestamp", au.Timestamp) + d.Set("timestamp_end", au.TimestampEnd) + d.Set("user", au.User) +} diff --git a/internal/service/cloudapi/audit/utility_audit.go b/internal/service/cloudapi/audit/utility_audit.go new file mode 100644 index 0000000..b0d3931 --- /dev/null +++ b/internal/service/cloudapi/audit/utility_audit.go @@ -0,0 +1,62 @@ +/* +Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Sergey Kisil, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package audit + +import ( + "context" + + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/audit" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityAuditCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*audit.RecordAudit, error) { + c := m.(*controller.ControllerCfg) + req := audit.GetRequest{} + + if d.Id() != "" { + req.AuditGuid = d.Id() + } else { + req.AuditGuid = d.Get("audit_guid").(string) + } + + log.Debugf("utilityStackCheckPresence: load audit") + auditInfo, err := c.CloudAPI().Audit().Get(ctx, req) + if err != nil { + return nil, err + } + + return auditInfo, nil +} diff --git a/internal/service/cloudapi/bservice/resource_bservice_group.go b/internal/service/cloudapi/bservice/resource_bservice_group.go index 27b73e5..280a8d5 100644 --- a/internal/service/cloudapi/bservice/resource_bservice_group.go +++ b/internal/service/cloudapi/bservice/resource_bservice_group.go @@ -394,7 +394,7 @@ func resourceBasicServiceGroupSchemaMake() map[string]*schema.Schema { "driver": { Type: schema.TypeString, Required: true, - Description: "compute driver like a KVM_X86, KVM_PPC, etc.", + Description: "compute driver like a KVM_X86, etc.", }, ///4.4.0 "sep_id": { diff --git a/internal/service/cloudapi/disks/resource_disk.go b/internal/service/cloudapi/disks/resource_disk.go index acc9be0..a73a329 100644 --- a/internal/service/cloudapi/disks/resource_disk.go +++ b/internal/service/cloudapi/disks/resource_disk.go @@ -238,12 +238,6 @@ func resourceDiskUpdate(ctx context.Context, d *schema.ResourceData, m interface DiskID: disk.ID, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } else { - req.Reason = "Terraform automatic restore" - } - _, err := c.CloudAPI().Disks().Restore(ctx, req) if err != nil { warnings.Add(err) @@ -362,7 +356,6 @@ func resourceDiskDelete(ctx context.Context, d *schema.ResourceData, m interface DiskID: disk.ID, Detach: d.Get("detach").(bool), Permanently: d.Get("permanently").(bool), - Reason: d.Get("reason").(string), } c := m.(*controller.ControllerCfg) @@ -437,12 +430,6 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { Default: false, Description: "Whether to completely delete the disk, works only with non attached disks", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Default: "", - Description: "Reason for deletion", - }, "shareable": { Type: schema.TypeBool, Optional: true, @@ -677,27 +664,27 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, diff --git a/internal/service/cloudapi/disks/resource_disk_replication.go b/internal/service/cloudapi/disks/resource_disk_replication.go index 6cca162..5e3700a 100644 --- a/internal/service/cloudapi/disks/resource_disk_replication.go +++ b/internal/service/cloudapi/disks/resource_disk_replication.go @@ -177,7 +177,6 @@ func resourceDiskReplicationDelete(ctx context.Context, d *schema.ResourceData, DiskID: disk.ID, Detach: d.Get("detach").(bool), Permanently: d.Get("permanently").(bool), - Reason: d.Get("reason").(string), } log.Debugf("resourceDiskReplicationDelete: delete disk replica for disk with ID: %d", diskId) @@ -243,11 +242,6 @@ func resourceDiskReplicationSchemaMake() map[string]*schema.Schema { Default: false, Description: "Delete disk permanently", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for disk deletion", - }, "replica_disk_id": { Type: schema.TypeInt, Computed: true, diff --git a/internal/service/cloudapi/dpdknet/data_source_dpdk.go b/internal/service/cloudapi/dpdknet/data_source_dpdk.go new file mode 100644 index 0000000..7add04a --- /dev/null +++ b/internal/service/cloudapi/dpdknet/data_source_dpdk.go @@ -0,0 +1,153 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceDPDKNetRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + dpdk, err := utilityDPDKNetCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + + flattenDPDKNet(d, dpdk) + + return nil +} + +func dataSourceDPDKNetSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "dpdk_id": { + Type: schema.TypeInt, + Required: true, + Description: "The unique ID of the subscriber-owner of the DPDK network", + }, + "account_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of accounts with access", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Created time", + }, + "desc": { + Type: schema.TypeString, + Computed: true, + Description: "Description of DPDK network", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the grid (platform)", + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + Description: "DPDK network ID on the storage side", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of network", + }, + "rg_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of resource groups with access", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "DPDK network status", + }, + "ovs_bridge": { + Type: schema.TypeString, + Computed: true, + Description: "OVS bridge in which interfaces for computers created", + }, + "vlan_id": { + Type: schema.TypeInt, + Computed: true, + Description: "vlan ID", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Compute IDs which uses this DPDK network", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Updated time", + }, + } + + return res +} + +func DataSourceDPDKNet() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceDPDKNetRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceDPDKNetSchemaMake(), + } +} diff --git a/internal/service/cloudapi/dpdknet/data_source_dpdk_list.go b/internal/service/cloudapi/dpdknet/data_source_dpdk_list.go new file mode 100644 index 0000000..35c5dd1 --- /dev/null +++ b/internal/service/cloudapi/dpdknet/data_source_dpdk_list.go @@ -0,0 +1,212 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceDPDKNetListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + dpdkList, err := utilityDPDKNetListCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenDPDKNetList(dpdkList)) + d.Set("entry_count", dpdkList.EntryCount) + + return nil +} + +func dataSourceDPDKNetListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "by_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by ID", + }, + "gid": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by GID", + }, + "name": { + Type: schema.TypeString, + Optional: true, + Description: "Find by name", + }, + "desc": { + Type: schema.TypeString, + Optional: true, + Description: "Find by description", + }, + "status": { + Type: schema.TypeString, + Optional: true, + Description: "Find by status", + }, + "compute_ids": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Find by compute IDs", + }, + "sort_by": { + Type: schema.TypeString, + Optional: true, + Description: "sort by one of supported fields, format +|-(field)", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dpdk_id": { + Type: schema.TypeInt, + Required: true, + Description: "The unique ID of the subscriber-owner of the DPDK network", + }, + "account_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of accounts with access", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Created time", + }, + "desc": { + Type: schema.TypeString, + Computed: true, + Description: "Description of DPDK network", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the grid (platform)", + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + Description: "DPDK network ID on the storage side", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of network", + }, + "rg_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of resource groups with access", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "DPDK network status", + }, + "ovs_bridge": { + Type: schema.TypeString, + Computed: true, + Description: "OVS bridge in which interfaces for computers created", + }, + "vlan_id": { + Type: schema.TypeInt, + Computed: true, + Description: "vlan ID", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Compute IDs which uses this DPDK network", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Updated time", + }, + }, + }, + }, + "entry_count": { + Type: schema.TypeInt, + Computed: true, + }, + } + return res +} + +func DataSourceDPDKNetList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceDPDKNetListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceDPDKNetListSchemaMake(), + } +} diff --git a/internal/service/cloudapi/dpdknet/flattens.go b/internal/service/cloudapi/dpdknet/flattens.go new file mode 100644 index 0000000..062002b --- /dev/null +++ b/internal/service/cloudapi/dpdknet/flattens.go @@ -0,0 +1,44 @@ +package dpdknet + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/dpdknet" +) + +func flattenDPDKNet(d *schema.ResourceData, dpdk *dpdk.RecordDPDKNet) { + d.Set("dpdk_id", dpdk.ID) + d.Set("account_access", dpdk.AccountAccess) + d.Set("created_time", dpdk.CreatedTime) + d.Set("desc", dpdk.Description) + d.Set("gid", dpdk.GID) + d.Set("guid", dpdk.GUID) + d.Set("name", dpdk.Name) + d.Set("rg_access", dpdk.RGAccess) + d.Set("status", dpdk.Status) + d.Set("ovs_bridge", dpdk.OVSBridge) + d.Set("vlan_id", dpdk.VlanID) + d.Set("compute_ids", dpdk.ComputeIDs) + d.Set("updated_time", dpdk.UpdatedTime) +} + +func flattenDPDKNetList(list *dpdk.ListDPDKNet) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(list.Data)) + for _, dpdk := range list.Data { + temp := map[string]interface{}{ + "dpdk_id": dpdk.ID, + "account_access": dpdk.AccountAccess, + "desc": dpdk.Description, + "gid": dpdk.GID, + "guid": dpdk.GUID, + "name": dpdk.Name, + "rg_access": dpdk.RGAccess, + "status": dpdk.Status, + "ovs_bridge": dpdk.OVSBridge, + "vlan_id": dpdk.VlanID, + "compute_ids": dpdk.ComputeIDs, + "updated_time": dpdk.UpdatedTime, + } + res = append(res, temp) + } + return res +} diff --git a/internal/service/cloudapi/dpdknet/utility_dpdk.go b/internal/service/cloudapi/dpdknet/utility_dpdk.go new file mode 100644 index 0000000..f284998 --- /dev/null +++ b/internal/service/cloudapi/dpdknet/utility_dpdk.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/dpdknet" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityDPDKNetCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*dpdk.RecordDPDKNet, error) { + c := m.(*controller.ControllerCfg) + req := dpdk.GetRequest{} + + if d.Get("dpdk_id") != nil { + if d.Get("dpdk_id").(int) == 0 { + id, _ := strconv.ParseUint(d.Id(), 10, 64) + req.DPDKID = id + } else { + req.DPDKID = uint64(d.Get("dpdk_id").(int)) + } + } else { + id, _ := strconv.ParseUint(d.Id(), 10, 64) + req.DPDKID = id + } + + log.Debugf("utilityDPDKCheckPresence: get DPDK network") + dpdk, err := c.CloudAPI().DPDKNet().Get(ctx, req) + if err != nil { + return nil, err + } + + return dpdk, nil +} diff --git a/internal/service/cloudapi/dpdknet/utility_dpdk_list.go b/internal/service/cloudapi/dpdknet/utility_dpdk_list.go new file mode 100644 index 0000000..a38c2c2 --- /dev/null +++ b/internal/service/cloudapi/dpdknet/utility_dpdk_list.go @@ -0,0 +1,87 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + log "github.com/sirupsen/logrus" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/dpdknet" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityDPDKNetListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*dpdk.ListDPDKNet, error) { + c := m.(*controller.ControllerCfg) + req := dpdk.ListRequest{} + + if byID, ok := d.GetOk("by_id"); ok { + req.ByID = uint64(byID.(int)) + } + if GID, ok := d.GetOk("gid"); ok { + req.GID = uint64(GID.(int)) + } + if name, ok := d.GetOk("name"); ok { + req.Name = name.(string) + } + if desc, ok := d.GetOk("description"); ok { + req.Description = desc.(string) + } + if status, ok := d.GetOk("status"); ok { + req.Status = status.(string) + } + if computeIDs, ok := d.GetOk("compute_ids"); ok { + IDs := computeIDs.([]interface{}) + for _, ID := range IDs { + req.ComputeIDs = append(req.ComputeIDs, uint64(ID.(int))) + } + } + if sortBy, ok := d.GetOk("sort_by"); ok { + req.SortBy = sortBy.(string) + } + if page, ok := d.GetOk("page"); ok { + req.Page = uint64(page.(int)) + } + if size, ok := d.GetOk("size"); ok { + req.Size = uint64(size.(int)) + } + + log.Debugf("utilityDPDKListCheckPresence: load DPDK network list") + dpdkList, err := c.CloudAPI().DPDKNet().List(ctx, req) + if err != nil { + return nil, err + } + + return dpdkList, nil +} diff --git a/internal/service/cloudapi/flipgroup/data_source_flipgroup_list.go b/internal/service/cloudapi/flipgroup/data_source_flipgroup_list.go index 90aa3a7..fc38333 100644 --- a/internal/service/cloudapi/flipgroup/data_source_flipgroup_list.go +++ b/internal/service/cloudapi/flipgroup/data_source_flipgroup_list.go @@ -124,7 +124,7 @@ func dataSourceFlipgroupListSchemaMake() map[string]*schema.Schema { Type: schema.TypeList, Optional: true, Elem: &schema.Schema{ - Type: schema.TypeInt, + Type: schema.TypeString, }, Description: "client_ids", }, diff --git a/internal/service/cloudapi/flipgroup/utility_flipgroup.go b/internal/service/cloudapi/flipgroup/utility_flipgroup.go index c423f9f..2cf4c6c 100644 --- a/internal/service/cloudapi/flipgroup/utility_flipgroup.go +++ b/internal/service/cloudapi/flipgroup/utility_flipgroup.go @@ -189,7 +189,7 @@ func utilityFlipgroupListCheckPresence(ctx context.Context, d *schema.ResourceDa if cliensId, ok := d.GetOk("client_ids"); ok { cliensIds := cliensId.([]interface{}) for _, elem := range cliensIds { - req.ClientIDs = append(req.ClientIDs, uint64(elem.(int))) + req.ClientIDs = append(req.ClientIDs, (elem.(string))) } } if status, ok := d.GetOk("status"); ok { diff --git a/internal/service/cloudapi/image/data_source_image_list.go b/internal/service/cloudapi/image/data_source_image_list.go index 4ad5494..025f5cb 100644 --- a/internal/service/cloudapi/image/data_source_image_list.go +++ b/internal/service/cloudapi/image/data_source_image_list.go @@ -132,6 +132,11 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "page size", }, + "enabled": { + Type: schema.TypeBool, + Optional: true, + Description: "find by enabled True or False", + }, "items": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/image/image_rs_subresource.go b/internal/service/cloudapi/image/image_rs_subresource.go index 14f277f..4653ac1 100644 --- a/internal/service/cloudapi/image/image_rs_subresource.go +++ b/internal/service/cloudapi/image/image_rs_subresource.go @@ -129,8 +129,8 @@ func resourceImageSchemaMake(sch map[string]*schema.Schema) map[string]*schema.S Type: schema.TypeString, Optional: true, Computed: true, - ValidateFunc: validation.StringInSlice([]string{"X86_64", "PPC64_LE"}, true), - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", + ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true), + Description: "binary architecture of this image, one of X86_64", } sch["drivers"] = &schema.Schema{ @@ -141,13 +141,6 @@ func resourceImageSchemaMake(sch map[string]*schema.Schema) map[string]*schema.S }, } - sch["permanently"] = &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - } - sch["network_interface_naming"] = &schema.Schema{ Type: schema.TypeString, Optional: true, diff --git a/internal/service/cloudapi/image/image_virtual_rs_subresource.go b/internal/service/cloudapi/image/image_virtual_rs_subresource.go index fb481ab..e565407 100644 --- a/internal/service/cloudapi/image/image_virtual_rs_subresource.go +++ b/internal/service/cloudapi/image/image_virtual_rs_subresource.go @@ -1,67 +1,60 @@ -/* -Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Authors: -Petr Krutov, -Stanislav Solovev, -Kasim Baybikov, - -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://repository.basistech.ru/BASIS/terraform-provider-decort - -Please see README.md to learn where to place source code so that it -builds seamlessly. - -Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki -*/ - -package image - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -) - -func resourceImageVirtualSchemaMake(sch map[string]*schema.Schema) map[string]*schema.Schema { - delete(sch, "show_all") - sch["name"] = &schema.Schema{ - Type: schema.TypeString, - Required: true, - Description: "Name of the rescue disk", - } - - sch["link_to"] = &schema.Schema{ - Type: schema.TypeInt, - Required: true, - Description: "ID of real image to link this virtual image to upon creation", - } - - sch["permanently"] = &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - } - - sch["image_id"] = &schema.Schema{ - Type: schema.TypeInt, - Computed: true, - Description: "Image id", - } - - return sch -} +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package image + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func resourceImageVirtualSchemaMake(sch map[string]*schema.Schema) map[string]*schema.Schema { + delete(sch, "show_all") + sch["name"] = &schema.Schema{ + Type: schema.TypeString, + Required: true, + Description: "Name of the rescue disk", + } + + sch["link_to"] = &schema.Schema{ + Type: schema.TypeInt, + Required: true, + Description: "ID of real image to link this virtual image to upon creation", + } + + sch["image_id"] = &schema.Schema{ + Type: schema.TypeInt, + Computed: true, + Description: "Image id", + } + + return sch +} diff --git a/internal/service/cloudapi/image/resource_image.go b/internal/service/cloudapi/image/resource_image.go index 1452fa4..6a8bb29 100644 --- a/internal/service/cloudapi/image/resource_image.go +++ b/internal/service/cloudapi/image/resource_image.go @@ -157,10 +157,6 @@ func resourceImageDelete(ctx context.Context, d *schema.ResourceData, m interfac ImageID: uint64(d.Get("image_id").(int)), } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudAPI().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudapi/image/resource_image_from_blank_compute.go b/internal/service/cloudapi/image/resource_image_from_blank_compute.go index c5e42c0..64e242f 100644 --- a/internal/service/cloudapi/image/resource_image_from_blank_compute.go +++ b/internal/service/cloudapi/image/resource_image_from_blank_compute.go @@ -194,10 +194,6 @@ func resourceImageFromBlankComputeDelete(ctx context.Context, d *schema.Resource ImageID: uint64(d.Get("image_id").(int)), } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudAPI().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) @@ -352,12 +348,6 @@ func resourceImageFromBlankComputeSchemaMake() map[string]*schema.Schema { Default: false, Description: "create an image in async/sync mode", }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - }, "image_id": { Type: schema.TypeInt, diff --git a/internal/service/cloudapi/image/resource_image_from_platform_disk.go b/internal/service/cloudapi/image/resource_image_from_platform_disk.go index 787a7ec..594feb2 100644 --- a/internal/service/cloudapi/image/resource_image_from_platform_disk.go +++ b/internal/service/cloudapi/image/resource_image_from_platform_disk.go @@ -201,10 +201,6 @@ func resourceImageFromPlatformDiskDelete(ctx context.Context, d *schema.Resource ImageID: uint64(d.Get("image_id").(int)), } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudAPI().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) @@ -302,8 +298,8 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { "architecture": { Type: schema.TypeString, Required: true, - ValidateFunc: validation.StringInSlice([]string{"X86_64", "PPC64_LE"}, true), - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", + ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true), + Description: "binary architecture of this image, one of X86_64", }, "username": { @@ -338,11 +334,10 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { }, "drivers": { Type: schema.TypeList, - Optional: true, - Computed: true, + Required: true, Elem: &schema.Schema{ StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Type: schema.TypeString, }, Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]", @@ -365,12 +360,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { Default: false, Description: "create an image in async/sync mode", }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - }, "image_id": { Type: schema.TypeInt, diff --git a/internal/service/cloudapi/image/utility_image_list.go b/internal/service/cloudapi/image/utility_image_list.go index b7f73a6..6f9a6ee 100644 --- a/internal/service/cloudapi/image/utility_image_list.go +++ b/internal/service/cloudapi/image/utility_image_list.go @@ -46,12 +46,12 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData, c := m.(*controller.ControllerCfg) req := image.ListRequest{} - if sep_id, ok := d.GetOk("sep_id"); ok { - req.SEPID = uint64(sep_id.(int)) + if sepID, ok := d.GetOk("sep_id"); ok { + req.SEPID = uint64(sepID.(int)) } - if by_id, ok := d.GetOk("by_id"); ok { - req.ByID = uint64(by_id.(int)) + if byID, ok := d.GetOk("by_id"); ok { + req.ByID = uint64(byID.(int)) } if name, ok := d.GetOk("name"); ok { @@ -66,31 +66,31 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData, req.Architecture = architecture.(string) } - if type_image, ok := d.GetOk("type_image"); ok { - req.TypeImage = type_image.(string) + if typeImage, ok := d.GetOk("type_image"); ok { + req.TypeImage = typeImage.(string) } - if image_size, ok := d.GetOk("image_size"); ok { - req.ImageSize = uint64(image_size.(int)) + if imageSize, ok := d.GetOk("image_size"); ok { + req.ImageSize = uint64(imageSize.(int)) } - if sep_name, ok := d.GetOk("sep_name"); ok { - req.SEPName = sep_name.(string) + if sepName, ok := d.GetOk("sep_name"); ok { + req.SEPName = sepName.(string) } if pool, ok := d.GetOk("pool"); ok { req.Pool = pool.(string) } - if public, ok := d.GetOk("public"); ok { + if public, ok := d.GetOkExists("public"); ok { req.Public = public.(bool) } - if hot_resize, ok := d.GetOk("hot_resize"); ok { - req.HotResize = hot_resize.(bool) + if hotResize, ok := d.GetOkExists("hot_resize"); ok { + req.HotResize = hotResize.(bool) } - if bootable, ok := d.GetOk("bootable"); ok { + if bootable, ok := d.GetOkExists("bootable"); ok { req.Bootable = bootable.(bool) } @@ -104,6 +104,9 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData, if size, ok := d.GetOk("size"); ok { req.Size = uint64(size.(int)) } + if enabled, ok := d.GetOkExists("enabled"); ok { + req.Enabled = enabled.(bool) + } log.Debugf("utilityImageListCheckPresence: load image list") imageList, err := c.CloudAPI().Image().List(ctx, req) diff --git a/internal/service/cloudapi/k8s/data_source_k8s.go b/internal/service/cloudapi/k8s/data_source_k8s.go index 3bdd006..565383b 100644 --- a/internal/service/cloudapi/k8s/data_source_k8s.go +++ b/internal/service/cloudapi/k8s/data_source_k8s.go @@ -103,16 +103,17 @@ func dataSourceK8sRead(ctx context.Context, d *schema.ResourceData, m interface{ } d.Set("kubeconfig", kubeconfig) + if cluster.LBID != 0 { + getLbReq := lb.GetRequest{LBID: cluster.LBID} + lb, err := c.CloudAPI().LB().Get(ctx, getLbReq) + if err != nil { + return diag.FromErr(err) + } - getLbReq := lb.GetRequest{LBID: cluster.LBID} - lb, err := c.CloudAPI().LB().Get(ctx, getLbReq) - if err != nil { - return diag.FromErr(err) + d.Set("extnet_id", lb.ExtNetID) + d.Set("lb_ip", lb.PrimaryNode.FrontendIP) } - d.Set("extnet_id", lb.ExtNetID) - d.Set("lb_ip", lb.PrimaryNode.FrontendIP) - flattenK8sData(d, *cluster, masterComputeList, workersComputeList) return nil } diff --git a/internal/service/cloudapi/k8s/flattens.go b/internal/service/cloudapi/k8s/flattens.go index 5700660..2ab76b8 100644 --- a/internal/service/cloudapi/k8s/flattens.go +++ b/internal/service/cloudapi/k8s/flattens.go @@ -254,6 +254,20 @@ func flattenK8sData(d *schema.ResourceData, cluster k8s.RecordK8S, masters []com d.Set("tech_status", cluster.TechStatus) d.Set("updated_by", cluster.UpdatedBy) d.Set("updated_time", cluster.UpdatedTime) + d.Set("highly_available_lb", cluster.HighlyAvailableLB) + d.Set("address_vip", flattenAddressVIP(cluster.AddressVIP)) + d.Set("extnet_only", cluster.ExtnetOnly) + d.Set("with_lb", cluster.WithLB) +} + +func flattenAddressVIP(addressVIP k8s.K8SAddressVIP) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "backend_ip": addressVIP.BackendIP, + "frontend_ip": addressVIP.FrontendIP, + } + res = append(res, temp) + return res } func flattenServiceAccount(serviceAccount k8s.RecordServiceAccount) []map[string]interface{} { diff --git a/internal/service/cloudapi/k8s/node_subresource.go b/internal/service/cloudapi/k8s/node_subresource.go index c448d34..8790bcd 100644 --- a/internal/service/cloudapi/k8s/node_subresource.go +++ b/internal/service/cloudapi/k8s/node_subresource.go @@ -153,6 +153,11 @@ func workersSchemaMake() map[string]*schema.Schema { Schema: detailedInfoSchemaMake(), }, }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, "guid": { Type: schema.TypeString, Computed: true, diff --git a/internal/service/cloudapi/k8s/resource_k8s.go b/internal/service/cloudapi/k8s/resource_k8s.go index 0ab2217..aee87cc 100644 --- a/internal/service/cloudapi/k8s/resource_k8s.go +++ b/internal/service/cloudapi/k8s/resource_k8s.go @@ -202,8 +202,13 @@ func resourceK8sCreate(ctx context.Context, d *schema.ResourceData, m interface{ if oidcCertificate, ok := d.GetOk("oidc_cert"); ok { createReq.OidcCertificate = oidcCertificate.(string) } + /// + if chipset, ok := d.GetOk("chipset"); ok { + createReq.Chipset = chipset.(string) + } + createReq.ExtNetOnly = d.Get("extnet_only").(bool) if extNet, ok := d.GetOk("extnet_id"); ok { @@ -745,6 +750,12 @@ func resourceK8sSchemaMake() map[string]*schema.Schema { Description: "insert ssl certificate in x509 pem format", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, + "desc": { Type: schema.TypeString, Optional: true, diff --git a/internal/service/cloudapi/k8s/resource_k8s_cp.go b/internal/service/cloudapi/k8s/resource_k8s_cp.go index 4f059cb..646b39c 100644 --- a/internal/service/cloudapi/k8s/resource_k8s_cp.go +++ b/internal/service/cloudapi/k8s/resource_k8s_cp.go @@ -124,6 +124,10 @@ func resourceK8sCPCreate(ctx context.Context, d *schema.ResourceData, m interfac createReq.MasterSEPID = uint64(sepId.(int)) } + if chipset, ok := d.GetOk("chipset"); ok { + createReq.Chipset = chipset.(string) + } + if sepPool, ok := d.GetOk("sep_pool"); ok { createReq.MasterSEPPool = sepPool.(string) } @@ -532,10 +536,10 @@ func resourceK8sCPUpdate(ctx context.Context, d *schema.ResourceData, m interfac oldVal, newVal := d.GetChange("num") if oldVal.(int) > newVal.(int) { - ids := make([]string, 0) + ids := make([]uint64, 0) for i := oldVal.(int) - 1; i >= newVal.(int); i-- { id := cluster.K8SGroups.Masters.DetailedInfo[i].ID - ids = append(ids, strconv.FormatUint(id, 10)) + ids = append(ids, id) } req := k8s.DeleteMasterFromGroupRequest{ @@ -656,6 +660,11 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema { ), Description: "Node RAM in MB.", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, "disk": { Type: schema.TypeInt, Optional: true, diff --git a/internal/service/cloudapi/k8s/resource_k8s_wg.go b/internal/service/cloudapi/k8s/resource_k8s_wg.go index b5213b1..d850b2a 100644 --- a/internal/service/cloudapi/k8s/resource_k8s_wg.go +++ b/internal/service/cloudapi/k8s/resource_k8s_wg.go @@ -70,6 +70,7 @@ func resourceK8sWgCreate(ctx context.Context, d *schema.ResourceData, m interfac WorkerRAM: uint64(d.Get("ram").(int)), WorkerSEPID: uint64(d.Get("worker_sep_id").(int)), WorkerSEPPool: d.Get("worker_sep_pool").(string), + Chipset: d.Get("chipset").(string), } labels, _ := d.Get("labels").([]interface{}) @@ -168,6 +169,7 @@ func resourceK8sWgUpdate(ctx context.Context, d *schema.ResourceData, m interfac K8SID: uint64(d.Get("k8s_id").(int)), WorkersGroupID: wg.ID, Num: uint64(newNum) - wg.Num, + Chipset: d.Get("chipset").(string), } _, err := c.CloudAPI().K8S().WorkerAdd(ctx, req) @@ -253,6 +255,12 @@ func resourceK8sWgSchemaMake() map[string]*schema.Schema { Description: "Number of worker nodes to create.", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, + "cpu": { Type: schema.TypeInt, Optional: true, diff --git a/internal/service/cloudapi/k8s/utility_k8s.go b/internal/service/cloudapi/k8s/utility_k8s.go index 239cffb..b537245 100644 --- a/internal/service/cloudapi/k8s/utility_k8s.go +++ b/internal/service/cloudapi/k8s/utility_k8s.go @@ -84,6 +84,7 @@ func updateNum(ctx context.Context, c *controller.ControllerCfg, cluster *k8s.Re K8SID: cluster.ID, WorkersGroupID: uint64(wgNew["id"].(int)), Num: uint64(newNum - oldNum), + Chipset: wgNew["chipset"].(string), } _, err := c.CloudAPI().K8S().WorkerAdd(ctx, req) @@ -145,6 +146,7 @@ func addWGs(ctx context.Context, c *controller.ControllerCfg, cluster *k8s.Recor WorkerCPU: uint64(found_wg["cpu"].(int)), WorkerRAM: uint64(found_wg["ram"].(int)), WorkerDisk: uint64(found_wg["disk"].(int)), + Chipset: found_wg["chipset"].(string), } labels, _ := found_wg["labels"].([]interface{}) diff --git a/internal/service/cloudapi/kvmvm/data_source_compute.go b/internal/service/cloudapi/kvmvm/data_source_compute.go index fcf5065..8585925 100644 --- a/internal/service/cloudapi/kvmvm/data_source_compute.go +++ b/internal/service/cloudapi/kvmvm/data_source_compute.go @@ -260,6 +260,10 @@ func computeListDisksSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "created_time": { Type: schema.TypeInt, Computed: true, @@ -475,6 +479,10 @@ func computeQOSSchemaMake() map[string]*schema.Schema { func computeInterfacesSchemaMake() map[string]*schema.Schema { return map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "conn_id": { Type: schema.TypeInt, Computed: true, @@ -511,6 +519,10 @@ func computeInterfacesSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + }, "name": { Type: schema.TypeString, Computed: true, @@ -542,6 +554,13 @@ func computeInterfacesSchemaMake() map[string]*schema.Schema { Schema: computeQOSSchemaMake(), }, }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: computeLibvirtSettingsSchemaMake(), + }, + }, "target": { Type: schema.TypeString, Computed: true, @@ -559,6 +578,40 @@ func computeInterfacesSchemaMake() map[string]*schema.Schema { }, } } + +func computeLibvirtSettingsSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + func computeOsUsersSchemaMake() map[string]*schema.Schema { return map[string]*schema.Schema{ "guid": { @@ -650,6 +703,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "chipset": { + Type: schema.TypeString, + Computed: true, + }, "boot_order": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/kvmvm/data_source_compute_list.go b/internal/service/cloudapi/kvmvm/data_source_compute_list.go index cf4786f..d3f48d5 100644 --- a/internal/service/cloudapi/kvmvm/data_source_compute_list.go +++ b/internal/service/cloudapi/kvmvm/data_source_compute_list.go @@ -64,6 +64,10 @@ func dataSourceComputeListRead(ctx context.Context, d *schema.ResourceData, m in func computeDisksSchemaMake() map[string]*schema.Schema { return map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "disk_id": { Type: schema.TypeInt, Computed: true, @@ -136,6 +140,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "chipset": { + Type: schema.TypeString, + Computed: true, + }, "clones": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/kvmvm/flattens.go b/internal/service/cloudapi/kvmvm/flattens.go index fc2d680..2ce2e3f 100644 --- a/internal/service/cloudapi/kvmvm/flattens.go +++ b/internal/service/cloudapi/kvmvm/flattens.go @@ -47,8 +47,9 @@ func flattenDisks(disks []compute.InfoDisk) []map[string]interface{} { res := make([]map[string]interface{}, 0) for _, disk := range disks { temp := map[string]interface{}{ - "disk_id": disk.ID, - "pci_slot": disk.PCISlot, + "bus_number": disk.BusNumber, + "disk_id": disk.ID, + "pci_slot": disk.PCISlot, } res = append(res, temp) } @@ -69,30 +70,49 @@ func flattenInterfaces(interfaces compute.ListInterfaces) []map[string]interface res := make([]map[string]interface{}, 0, len(interfaces)) for _, interfaceItem := range interfaces { temp := map[string]interface{}{ - "conn_id": interfaceItem.ConnID, - "conn_type": interfaceItem.ConnType, - "def_gw": interfaceItem.DefGW, - "enabled": interfaceItem.Enabled, - "flip_group_id": interfaceItem.FLIPGroupID, - "guid": interfaceItem.GUID, - "ip_address": interfaceItem.IPAddress, - "listen_ssh": interfaceItem.ListenSSH, - "mac": interfaceItem.MAC, - "name": interfaceItem.Name, - "net_id": interfaceItem.NetID, - "netmask": interfaceItem.NetMask, - "net_type": interfaceItem.NetType, - "node_id": interfaceItem.NodeID, - "pci_slot": interfaceItem.PCISlot, - "qos": flattenQOS(interfaceItem.QOS), - "target": interfaceItem.Target, - "type": interfaceItem.Type, - "vnfs": interfaceItem.VNFs, + "bus_number": interfaceItem.BusNumber, + "conn_id": interfaceItem.ConnID, + "conn_type": interfaceItem.ConnType, + "def_gw": interfaceItem.DefGW, + "enabled": interfaceItem.Enabled, + "flip_group_id": interfaceItem.FLIPGroupID, + "guid": interfaceItem.GUID, + "ip_address": interfaceItem.IPAddress, + "listen_ssh": interfaceItem.ListenSSH, + "mac": interfaceItem.MAC, + "mtu": interfaceItem.MTU, + "name": interfaceItem.Name, + "net_id": interfaceItem.NetID, + "netmask": interfaceItem.NetMask, + "net_type": interfaceItem.NetType, + "node_id": interfaceItem.NodeID, + "pci_slot": interfaceItem.PCISlot, + "qos": flattenQOS(interfaceItem.QOS), + "target": interfaceItem.Target, + "type": interfaceItem.Type, + "vnfs": interfaceItem.VNFs, + "libvirt_settings": flattenLibvirtSettings(interfaceItem.LibvirtSettings), } res = append(res, temp) } return res } + +func flattenLibvirtSettings(libvirtSettings compute.LibvirtSettings) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "guid": libvirtSettings.GUID, + "txmode": libvirtSettings.TXMode, + "ioeventfd": libvirtSettings.IOEventFD, + "event_idx": libvirtSettings.EventIDx, + "queues": libvirtSettings.Queues, + "rx_queue_size": libvirtSettings.RXQueueSize, + "tx_queue_size": libvirtSettings.TXQueueSize, + } + res = append(res, temp) + return res +} + func flattenSnapSets(snapSets compute.ListSnapSets) []map[string]interface{} { res := make([]map[string]interface{}, 0, len(snapSets)) for _, snapSet := range snapSets { @@ -165,6 +185,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} "arch": compute.Architecture, "boot_order": compute.BootOrder, "bootdisk_size": compute.BootDiskSize, + "chipset": compute.Chipset, "cd_image_id": compute.CdImageId, "clone_reference": compute.CloneReference, "clones": compute.Clones, @@ -348,6 +369,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc d.Set("cd_image_id", computeRec.CdImageId) d.Set("sep_id", bootDisk.SepID) d.Set("pool", bootDisk.Pool) + d.Set("chipset", computeRec.Chipset) d.Set("clone_reference", computeRec.CloneReference) d.Set("clones", computeRec.Clones) d.Set("computeci_id", computeRec.ComputeCIID) @@ -503,6 +525,7 @@ func flattenListComputeDisks(disks compute.ListComputeDisks) []map[string]interf "acl": string(acl), "account_id": disk.AccountID, "boot_partition": disk.BootPartition, + "bus_number": disk.BusNumber, "created_time": disk.CreatedTime, "deleted_time": disk.DeletedTime, "description": disk.Description, @@ -590,6 +613,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute d.Set("affinity_weight", computeRec.AffinityWeight) d.Set("anti_affinity_rules", flattenListRules(computeRec.AntiAffinityRules)) d.Set("arch", computeRec.Architecture) + d.Set("chipset", computeRec.Chipset) d.Set("boot_order", computeRec.BootOrder) d.Set("bootdisk_size", computeRec.BootDiskSize) d.Set("cd_image_id", computeRec.CdImageId) diff --git a/internal/service/cloudapi/kvmvm/network_subresource.go b/internal/service/cloudapi/kvmvm/network_subresource.go index 4071e55..b6f7df2 100644 --- a/internal/service/cloudapi/kvmvm/network_subresource.go +++ b/internal/service/cloudapi/kvmvm/network_subresource.go @@ -128,7 +128,7 @@ func networkSubresourceSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Required: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK"}, false), // observe case while validating Description: "Type of the network for this connection, either EXTNET or VINS.", }, diff --git a/internal/service/cloudapi/kvmvm/old_schemas.go b/internal/service/cloudapi/kvmvm/old_schemas.go index 07d0c8a..c56c389 100644 --- a/internal/service/cloudapi/kvmvm/old_schemas.go +++ b/internal/service/cloudapi/kvmvm/old_schemas.go @@ -27,7 +27,7 @@ func resourceComputeResourceV1() *schema.Resource { Required: true, ForceNew: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Description: "Hardware architecture of this compute instance.", }, "cpu": { @@ -569,7 +569,7 @@ func resourceComputeResourceV2() *schema.Resource { Required: true, ForceNew: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Description: "Hardware architecture of this compute instance.", }, "cpu": { diff --git a/internal/service/cloudapi/kvmvm/resource_check_input_values.go b/internal/service/cloudapi/kvmvm/resource_check_input_values.go index c5ab3ad..fcec08e 100644 --- a/internal/service/cloudapi/kvmvm/resource_check_input_values.go +++ b/internal/service/cloudapi/kvmvm/resource_check_input_values.go @@ -38,6 +38,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/dpdknet" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/extnet" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/image" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg" @@ -147,6 +148,23 @@ func existVFPoolId(ctx context.Context, m interface{}, id int) (int, bool) { return id, false } +func existDPDKNetId(ctx context.Context, m interface{}, id int) (int, bool) { + c := m.(*controller.ControllerCfg) + req := dpdknet.ListRequest{ByID: uint64(id)} + + dpdkList, err := c.CloudAPI().DPDKNet().List(ctx, req) + if err != nil { + log.Debugf("Unable to retrieve vfpool list, %s", err) + return id, false + } + + if len(dpdkList.Data) == 1 { + return 0, true + } + + return id, false +} + func isMoreThanOneDisksTypeB(ctx context.Context, disks interface{}) bool { count := 0 diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go index 42191fc..e45d335 100644 --- a/internal/service/cloudapi/kvmvm/resource_compute.go +++ b/internal/service/cloudapi/kvmvm/resource_compute.go @@ -42,7 +42,6 @@ import ( log "github.com/sirupsen/logrus" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/disks" - "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/kvmppc" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/kvmx86" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" @@ -60,7 +59,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf log.Debugf("resourceComputeCreate: called for Compute name %q, RG ID %d", d.Get("name").(string), d.Get("rg_id").(int)) c := m.(*controller.ControllerCfg) createReqX86 := kvmx86.CreateRequest{} - createReqPPC := kvmppc.CreateRequest{} hasRG, err := existRgID(ctx, d, m) if err != nil { @@ -101,12 +99,13 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf return diag.Errorf("resourceComputeCreate: can't create compute because extnet ID %d is not allowed or does not exist", extNetId) } case "VFNIC": - if d.Get("driver").(string) == "KVM_PPC" { - return diag.Errorf("resourceComputeCreate: can't create compute because 'VFNIC' net_type is not allowed for driver 'KVM_PPC'") - } if vfpoolId, ok := existVFPoolId(ctx, m, networkData["net_id"].(int)); !ok { return diag.Errorf("resourceComputeCreate: can't create compute because vfpool ID %d is not allowed or does not exist", vfpoolId) } + case "DPDK": + if dpdkId, ok := existDPDKNetId(ctx, m, networkData["net_id"].(int)); !ok { + return diag.Errorf("resourceComputeCreate: can't create compute because DPDK ID %d is not allowed or does not exist", dpdkId) + } default: continue } @@ -115,32 +114,26 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf argVal, ok := d.GetOk("description") if ok { - createReqPPC.Description = argVal.(string) createReqX86.Description = argVal.(string) } if sepID, ok := d.GetOk("sep_id"); ok { - createReqPPC.SEPID = uint64(sepID.(int)) createReqX86.SepID = uint64(sepID.(int)) } if pool, ok := d.GetOk("pool"); ok { - createReqPPC.Pool = pool.(string) createReqX86.Pool = pool.(string) } if ipaType, ok := d.GetOk("ipa_type"); ok { - createReqPPC.IPAType = ipaType.(string) createReqX86.IPAType = ipaType.(string) } if bootSize, ok := d.GetOk("boot_disk_size"); ok { - createReqPPC.BootDisk = uint64(bootSize.(int)) createReqX86.BootDisk = uint64(bootSize.(int)) } if IS, ok := d.GetOk("is"); ok { - createReqPPC.IS = IS.(string) createReqX86.IS = IS.(string) } @@ -181,45 +174,8 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf } } - createReqPPC.Interfaces = make([]kvmppc.Interface, 0) - - if networks, ok := d.GetOk("network"); ok { - if networks.(*schema.Set).Len() > 0 { - ns := networks.(*schema.Set).List() - sort.Slice(ns, func(i, j int) bool { - weightI := ns[i].(map[string]interface{})["weight"].(int) - weightJ := ns[j].(map[string]interface{})["weight"].(int) - if weightI == 0 { - return false - } - if weightJ == 0 { - return true - } - return weightI < weightJ - }) - interfaces := make([]kvmppc.Interface, 0) - for _, elem := range ns { - netInterfaceVal := elem.(map[string]interface{}) - reqInterface := kvmppc.Interface{ - NetType: netInterfaceVal["net_type"].(string), - NetID: uint64(netInterfaceVal["net_id"].(int)), - } - - ipaddr, ipSet := netInterfaceVal["ip_address"] - if ipSet { - reqInterface.IPAddr = ipaddr.(string) - } - - interfaces = append(interfaces, reqInterface) - } - - createReqPPC.Interfaces = interfaces - } - } - if disks, ok := d.GetOk("disks"); ok { disksX86 := make([]kvmx86.DataDisk, 0) - disksPPC := make([]kvmppc.DataDisk, 0) for _, elem := range disks.([]interface{}) { diskVal := elem.(map[string]interface{}) @@ -244,97 +200,59 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf createReqX86.DataDisks = disksX86 - for _, elem := range disks.([]interface{}) { - diskVal := elem.(map[string]interface{}) - reqDataDisk := kvmppc.DataDisk{ - DiskName: diskVal["disk_name"].(string), - Size: uint64(diskVal["size"].(int)), - } - if sepId, ok := diskVal["sep_id"]; ok { - reqDataDisk.SepID = uint64(sepId.(int)) - } - if pool, ok := diskVal["pool"]; ok { - reqDataDisk.Pool = pool.(string) - } - if desc, ok := diskVal["desc"]; ok { - reqDataDisk.Description = desc.(string) - } - if imageID, ok := diskVal["image_id"]; ok { - reqDataDisk.ImageID = uint64(imageID.(int)) - } - disksPPC = append(disksPPC, reqDataDisk) - } - - createReqPPC.DataDisks = disksPPC } argVal, ok = d.GetOk("cloud_init") if ok { userdata := argVal.(string) if userdata != "" && userdata != "applied" { - createReqPPC.Userdata = strings.TrimSpace(userdata) createReqX86.Userdata = strings.TrimSpace(userdata) } } var computeId uint64 driver := d.Get("driver").(string) - if driver == "KVM_PPC" { - createReqPPC.RGID = uint64(d.Get("rg_id").(int)) - createReqPPC.Name = d.Get("name").(string) - createReqPPC.CPU = uint64(d.Get("cpu").(int)) - createReqPPC.RAM = uint64(d.Get("ram").(int)) - createReqPPC.ImageID = uint64(d.Get("image_id").(int)) - - log.Debugf("resourceComputeCreate: creating Compute of type KVM VM PowerPC") - apiResp, err := c.CloudAPI().KVMPPC().Create(ctx, createReqPPC) - if err != nil { - return diag.FromErr(err) - } - - d.SetId(strconv.FormatUint(apiResp, 10)) - computeId = apiResp - } else { - createReqX86.RGID = uint64(d.Get("rg_id").(int)) - createReqX86.Name = d.Get("name").(string) - createReqX86.CPU = uint64(d.Get("cpu").(int)) - createReqX86.RAM = uint64(d.Get("ram").(int)) - createReqX86.Driver = driver + createReqX86.RGID = uint64(d.Get("rg_id").(int)) + createReqX86.Name = d.Get("name").(string) + createReqX86.CPU = uint64(d.Get("cpu").(int)) + createReqX86.RAM = uint64(d.Get("ram").(int)) - if image, ok := d.GetOk("image_id"); ok { - createReqX86.ImageID = uint64(image.(int)) - } - if withoutBootDisk, ok := d.GetOk("without_boot_disk"); ok { - createReqX86.WithoutBootDisk = withoutBootDisk.(bool) - } + createReqX86.Driver = driver - if custom_fields, ok := d.GetOk("custom_fields"); ok { - val := custom_fields.(string) - val = strings.ReplaceAll(val, "\\", "") - val = strings.ReplaceAll(val, "\n", "") - val = strings.ReplaceAll(val, "\t", "") - val = strings.TrimSpace(val) + if image, ok := d.GetOk("image_id"); ok { + createReqX86.ImageID = uint64(image.(int)) + } + if withoutBootDisk, ok := d.GetOk("without_boot_disk"); ok { + createReqX86.WithoutBootDisk = withoutBootDisk.(bool) + } - createReqX86.CustomFields = val - } + if custom_fields, ok := d.GetOk("custom_fields"); ok { + val := custom_fields.(string) + val = strings.ReplaceAll(val, "\\", "") + val = strings.ReplaceAll(val, "\n", "") + val = strings.ReplaceAll(val, "\t", "") + val = strings.TrimSpace(val) - if numaAffinity, ok := d.GetOk("numa_affinity"); ok { - createReqX86.NumaAffinity = numaAffinity.(string) - } - createReqX86.CPUPin = d.Get("cpu_pin").(bool) - createReqX86.HPBacked = d.Get("hp_backed").(bool) + createReqX86.CustomFields = val + } - log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") - apiResp, err := c.CloudAPI().KVMX86().Create(ctx, createReqX86) - if err != nil { - return diag.FromErr(err) - } + if numaAffinity, ok := d.GetOk("numa_affinity"); ok { + createReqX86.NumaAffinity = numaAffinity.(string) + } + createReqX86.CPUPin = d.Get("cpu_pin").(bool) + createReqX86.HPBacked = d.Get("hp_backed").(bool) + createReqX86.Chipset = d.Get("chipset").(string) - d.SetId(strconv.FormatUint(apiResp, 10)) - computeId = apiResp + log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") + apiResp, err := c.CloudAPI().KVMX86().Create(ctx, createReqX86) + if err != nil { + return diag.FromErr(err) } + d.SetId(strconv.FormatUint(apiResp, 10)) + computeId = apiResp + warnings := dc.Warnings{} cleanup := false @@ -730,12 +648,13 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf return diag.Errorf("resourceComputeUpdate: can't update compute because extnet ID %d is not allowed or does not exist", extNetId) } case "VFNIC": - if d.Get("driver").(string) == "KVM_PPC" { - return diag.Errorf("resourceComputeUpdate: can't create compute because 'VFNIC' net_type is not allowed for driver 'KVM_PPC'") - } if vfpoolId, ok := existVFPoolId(ctx, m, networkData["net_id"].(int)); !ok { return diag.Errorf("resourceComputeUpdate: can't create compute because vfpool ID %d is not allowed or does not exist", vfpoolId) } + case "DPDK": + if dpdkId, ok := existDPDKNetId(ctx, m, networkData["net_id"].(int)); !ok { + return diag.Errorf("resourceComputeCreate: can't create compute because DPDK ID %d is not allowed or does not exist", dpdkId) + } default: continue } @@ -960,6 +879,10 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf req.HPBacked = d.Get("hp_backed").(bool) } + if d.HasChange("chipset") { + req.Chipset = d.Get("chipset").(string) + } + // Note bene: numa_affinity, cpu_pin and hp_backed are not allowed to be changed for compute in STARTED tech status. // If STARTED, we need to stop it before update var isStopRequired bool @@ -1449,10 +1372,19 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf Label: snapshotItem["label"].(string), } - _, err := c.CloudAPI().Compute().SnapshotDelete(ctx, req) - if err != nil { - return diag.FromErr(err) + asyncMode, ok := d.GetOk("snapshot_delete_async") + if ok && asyncMode.(bool) { + _, err := c.CloudAPI().Compute().SnapshotDeleteAsync(ctx, req) + if err != nil { + return diag.FromErr(err) + } + } else { + _, err := c.CloudAPI().Compute().SnapshotDelete(ctx, req) + if err != nil { + return diag.FromErr(err) + } } + } } @@ -1924,7 +1856,7 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema { Required: true, // ForceNew: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Description: "Hardware architecture of this compute instance.", }, "cpu": { @@ -1948,6 +1880,12 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema { //ForceNew: true, //REDEPLOY Description: "ID of the OS image to base this compute instance on.", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Type of the emulated system.", + }, "without_boot_disk": { Type: schema.TypeBool, Optional: true, @@ -2124,6 +2062,10 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema { Schema: snapshotSubresourceSchemaMake(), }, }, + "snapshot_delete_async": { + Type: schema.TypeBool, + Optional: true, + }, "rollback": { Type: schema.TypeSet, MaxItems: 1, diff --git a/internal/service/cloudapi/kvmvm/utility_compute.go b/internal/service/cloudapi/kvmvm/utility_compute.go index a3869b2..ded1fa7 100644 --- a/internal/service/cloudapi/kvmvm/utility_compute.go +++ b/internal/service/cloudapi/kvmvm/utility_compute.go @@ -177,13 +177,16 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData oldSet, newSet := d.GetChange("network") + oldList := oldSet.(*schema.Set).List() + newList := newSet.(*schema.Set).List() + + detachMap, changeIpMap, attachMap := differenceNetwork(oldList, newList) + apiErrCount := 0 var lastSavedError error - detachSet := oldSet.(*schema.Set).Difference(newSet.(*schema.Set)) - log.Debugf("utilityComputeNetworksConfigure: detach set has %d items for Compute ID %s", detachSet.Len(), d.Id()) - for _, runner := range detachSet.List() { - netData := runner.(map[string]interface{}) + log.Debugf("utilityComputeNetworksConfigure: detach set has %d items for Compute ID %s", len(detachMap), d.Id()) + for _, netData := range detachMap { computeId, _ := strconv.ParseUint(d.Id(), 10, 64) req := compute.NetDetachRequest{ ComputeID: computeId, @@ -200,22 +203,41 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData } } + log.Debugf("utilityComputeNetworksConfigure: changeIp set has %d items for Compute ID %s", len(changeIpMap), d.Id()) + for _, netData := range changeIpMap { + computeId, _ := strconv.ParseUint(d.Id(), 10, 64) + req := compute.ChangeIPRequest{ + ComputeID: computeId, + NetType: netData["net_type"].(string), + NetID: uint64(netData["net_id"].(int)), + IPAddr: netData["ip_address"].(string), + } + + _, err := c.CloudAPI().Compute().ChangeIP(ctx, req) + if err != nil { + log.Errorf("utilityComputeNetworksConfigure: failed to change net ID %d of type %s from Compute ID %s: %s", + netData["net_id"].(int), netData["net_type"].(string), d.Id(), err) + apiErrCount++ + lastSavedError = err + } + } + needStart := false - if d.Get("network").(*schema.Set).Len() == 1 || oldSet.(*schema.Set).Len() < 1 { + if oldSet.(*schema.Set).Len() == len(detachMap) || oldSet.(*schema.Set).Len() == 0 { computeId, _ := strconv.ParseUint(d.Id(), 10, 64) if err := utilityComputeStop(ctx, computeId, m); err != nil { apiErrCount++ lastSavedError = err } - needStart = true + if start := d.Get("started"); start.(bool) { + needStart = true + } } - attachSet := newSet.(*schema.Set).Difference(oldSet.(*schema.Set)) - attachList := attachSet.List() - sort.Slice(attachList, func(i, j int) bool { - weightI := attachList[i].(map[string]interface{})["weight"].(int) - weightJ := attachList[j].(map[string]interface{})["weight"].(int) + sort.Slice(attachMap, func(i, j int) bool { + weightI := attachMap[i]["weight"].(int) + weightJ := attachMap[j]["weight"].(int) if weightI == 0 { return false } @@ -224,9 +246,8 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData } return weightI < weightJ }) - log.Debugf("utilityComputeNetworksConfigure: attach set has %d items for Compute ID %s", attachSet.Len(), d.Id()) - for _, runner := range attachList { - netData := runner.(map[string]interface{}) + log.Debugf("utilityComputeNetworksConfigure: attach set has %d items for Compute ID %s", len(attachMap), d.Id()) + for _, netData := range attachMap { computeId, _ := strconv.ParseUint(d.Id(), 10, 64) req := compute.NetAttachRequest{ ComputeID: computeId, @@ -343,3 +364,50 @@ func utilityComputeUpdatePciDevices(ctx context.Context, d *schema.ResourceData, return nil } + +func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, attachMap []map[string]interface{}) { + attachMap = make([]map[string]interface{}, 0) + changeIpMap = make([]map[string]interface{}, 0) + detachMap = make([]map[string]interface{}, 0) + for _, oldNetwork := range oldList { + oldMap := oldNetwork.(map[string]interface{}) + found := false + for _, newNetwork := range newList { + newMap := newNetwork.(map[string]interface{}) + if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] { + if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && newMap["ip_address"] != oldMap["ip_address"] { + changeIpMap = append(changeIpMap, newMap) + found = true + break + } else if newMap["ip_address"] == oldMap["ip_address"] { + found = true + break + } + } + } + if found { + continue + } + detachMap = append(detachMap, oldMap) + } + + for _, newNetwork := range newList { + newMap := newNetwork.(map[string]interface{}) + found := false + for _, oldNetwork := range oldList { + oldMap := oldNetwork.(map[string]interface{}) + if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] { + if newMap["ip_address"] == oldMap["ip_address"] || ((newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && newMap["ip_address"] != oldMap["ip_address"]) { + found = true + break + } + } + } + if found { + continue + } + attachMap = append(attachMap, newMap) + } + + return +} diff --git a/internal/service/cloudapi/rg/data_source_rg.go b/internal/service/cloudapi/rg/data_source_rg.go index 2dc46d1..f42df3c 100644 --- a/internal/service/cloudapi/rg/data_source_rg.go +++ b/internal/service/cloudapi/rg/data_source_rg.go @@ -280,10 +280,7 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "account_id": { Type: schema.TypeInt, Computed: true, diff --git a/internal/service/cloudapi/rg/data_source_rg_usage.go b/internal/service/cloudapi/rg/data_source_rg_usage.go index 9b49b61..2cc5f4b 100644 --- a/internal/service/cloudapi/rg/data_source_rg_usage.go +++ b/internal/service/cloudapi/rg/data_source_rg_usage.go @@ -59,10 +59,6 @@ func dataSourceRgUsageSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, "cpu": { Type: schema.TypeInt, diff --git a/internal/service/cloudapi/rg/flattens.go b/internal/service/cloudapi/rg/flattens.go index 0f20842..86485d7 100644 --- a/internal/service/cloudapi/rg/flattens.go +++ b/internal/service/cloudapi/rg/flattens.go @@ -89,7 +89,6 @@ func flattenResgroup(d *schema.ResourceData, details rg.RecordResourceGroup) err d.Set("account_id", details.AccountID) d.Set("gid", details.GID) - d.Set("def_net_type", details.DefNetType) d.Set("name", details.Name) d.Set("quota", flattenQuota(details.ResourceLimits)) d.Set("account_name", details.AccountName) diff --git a/internal/service/cloudapi/rg/resource_rg.go b/internal/service/cloudapi/rg/resource_rg.go index 2fa6dff..4f78481 100644 --- a/internal/service/cloudapi/rg/resource_rg.go +++ b/internal/service/cloudapi/rg/resource_rg.go @@ -45,7 +45,6 @@ import ( "repository.basistech.ru/BASIS/terraform-provider-decort/internal/status" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) @@ -139,8 +138,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter } if defNetType, ok := d.GetOk("def_net_type"); ok { req.DefNet = defNetType.(string) // NOTE: in API default network type is set by "def_net" parameter - } else { - d.Set("def_net_type", "PRIVATE") } if owner, ok := d.GetOk("owner"); ok { @@ -155,10 +152,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter req.Description = description.(string) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if extNetId, ok := d.GetOk("ext_net_id"); ok { req.ExtNetID = uint64(extNetId.(int)) } @@ -195,10 +188,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter Right: right, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - _, err := c.CloudAPI().RG().AccessGrant(ctx, req) if err != nil { w.Add(err) @@ -222,16 +211,12 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter if netID, ok := defNetItem["net_id"]; ok { req.NetID = uint64(netID.(int)) } - if reason, ok := defNetItem["reason"]; ok { - req.Reason = reason.(string) - } _, err := c.CloudAPI().RG().SetDefNet(ctx, req) if err != nil { w.Add(err) } - d.Set("def_net_type", netType) } } @@ -242,10 +227,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter RGID: apiResp, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - _, err := c.CloudAPI().RG().Enable(ctx, req) if err != nil { w.Add(err) @@ -255,10 +236,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter RGID: apiResp, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - _, err := c.CloudAPI().RG().Disable(ctx, req) if err != nil { w.Add(err) @@ -287,7 +264,6 @@ func resourceResgroupRead(ctx context.Context, d *schema.ResourceData, m interfa case status.Modeled: return diag.Errorf("The resource group is in status: %s, please, contact support for more information", rgData.Status) case status.Created: - case status.Enabled: case status.Deleted: // restoreReq := rg.RestoreRequest{RGID: rgData.ID} // enableReq := rg.EnableRequest{RGID: rgData.ID} @@ -374,10 +350,6 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter if restore, ok := d.GetOk("restore"); ok && restore.(bool) { restoreReq := rg.RestoreRequest{RGID: rgData.ID} - if reason, ok := d.GetOk("reason"); ok { - restoreReq.Reason = reason.(string) - } - _, err := c.CloudAPI().RG().Restore(ctx, restoreReq) if err != nil { return diag.FromErr(err) @@ -386,9 +358,6 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter if enable, ok := d.GetOk("enable"); ok && enable.(bool) { enableReq := rg.EnableRequest{RGID: rgData.ID} - if reason, ok := d.GetOk("reason"); ok { - enableReq.Reason = reason.(string) - } _, err = c.CloudAPI().RG().Enable(ctx, enableReq) if err != nil { return diag.FromErr(err) @@ -423,26 +392,19 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter The following code fragment checks if any of these have been changed and generates error. */ - if d.HasChange("def_net") { - _, newDefNet := d.GetChange("def_net") - if newDefNet.(*schema.Set).Len() == 0 { - return diag.Errorf("resourceResgroupUpdate: block def_net must not be empty") - } - } for _, attr := range []string{"def_net_type", "ipcidr", "ext_ip"} { - attr_new, attr_old := d.GetChange("def_net_type") - if attr_new.(string) != attr_old.(string) { + attrNew, attrOld := d.GetChange(attr) + if attrNew.(string) != attrOld.(string) { return diag.FromErr(fmt.Errorf("resourceResgroupUpdate: RG ID %s: changing %s for existing RG is not allowed", d.Id(), attr)) } } - attrNew, attrOld := d.GetChange("ext_net_id") - if attrNew.(int) != attrOld.(int) { + if d.HasChange("ext_net_id") { return diag.FromErr(fmt.Errorf("resourceResgroupUpdate: RG ID %s: changing ext_net_id for existing RG is not allowed", d.Id())) } - if d.HasChanges("name", "quota", "description", "register_computes") { + if d.HasChanges("name", "quota", "description", "register_computes", "uniq_pools") { if err := utilityUpdateRG(ctx, d, m, rgData.ID); err != nil { return diag.FromErr(err) } @@ -477,9 +439,6 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter RGID: rgData.ID, User: user, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudAPI().RG().AccessRevoke(ctx, req) if err != nil { @@ -499,10 +458,6 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter Right: right, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - _, err := c.CloudAPI().RG().AccessGrant(ctx, req) if err != nil { return diag.FromErr(err) @@ -511,30 +466,31 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter } if d.HasChange("def_net") { - if ok := d.HasChange("def_net"); ok { - oldDefNet, newDefNet := d.GetChange("def_net") - if newDefNet.(*schema.Set).Len() > 0 { - changedDefNet := (newDefNet.(*schema.Set).Difference(oldDefNet.(*schema.Set))).List() - for _, changedDefNetInterface := range changedDefNet { - defNetItem := changedDefNetInterface.(map[string]interface{}) - netType := defNetItem["net_type"].(string) - - req := rg.SetDefNetRequest{ - RGID: rgData.ID, - NetType: netType, - } - - if netID, ok := defNetItem["net_id"]; ok { - req.NetID = uint64(netID.(int)) - } - if reason, ok := defNetItem["reason"]; ok { - req.Reason = reason.(string) - } - - _, err := c.CloudAPI().RG().SetDefNet(ctx, req) - if err != nil { - return diag.FromErr(err) - } + oldDefNet, newDefNet := d.GetChange("def_net") + if oldDefNet.(*schema.Set).Len() > 0 { + _, err := c.CloudAPI().RG().RemoveDefNet(ctx, rg.RemoveDefNetRequest{RGID: rgData.ID}) + if err != nil { + return diag.FromErr(err) + } + } + if newDefNet.(*schema.Set).Len() > 0 { + changedDefNet := (newDefNet.(*schema.Set).Difference(oldDefNet.(*schema.Set))).List() + for _, changedDefNetInterface := range changedDefNet { + defNetItem := changedDefNetInterface.(map[string]interface{}) + netType := defNetItem["net_type"].(string) + + req := rg.SetDefNetRequest{ + RGID: rgData.ID, + NetType: netType, + } + + if netID, ok := defNetItem["net_id"]; ok { + req.NetID = uint64(netID.(int)) + } + + _, err := c.CloudAPI().RG().SetDefNet(ctx, req) + if err != nil { + return diag.FromErr(err) } } } @@ -559,9 +515,6 @@ func resourceResgroupDelete(ctx context.Context, d *schema.ResourceData, m inter if permanently, ok := d.GetOk("permanently"); ok { req.Permanently = permanently.(bool) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudAPI().RG().Delete(ctx, req) if err != nil { @@ -598,7 +551,6 @@ func ResourceRgSchemaMake() map[string]*schema.Schema { "def_net_type": { Type: schema.TypeString, Optional: true, - Computed: true, ValidateFunc: validation.StringInSlice([]string{"PRIVATE", "PUBLIC", "NONE"}, false), Description: "Type of the network, which this resource group will use as default for its computes - PRIVATE or PUBLIC or NONE.", }, @@ -700,11 +652,6 @@ func ResourceRgSchemaMake() map[string]*schema.Schema { Required: true, Description: "Access rights to set, one of 'R', 'RCX' or 'ARCXDU'", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for action", - }, }, }, }, @@ -727,11 +674,6 @@ func ResourceRgSchemaMake() map[string]*schema.Schema { Default: 0, Description: "Network segment ID. If netType is PUBLIC and netId is 0 then default external network segment will be selected. If netType is PRIVATE and netId=0, the first ViNS defined for this RG will be selected. Otherwise, netId identifies either existing external network segment or ViNS.", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for action", - }, }, }, }, @@ -754,11 +696,6 @@ func ResourceRgSchemaMake() map[string]*schema.Schema { Default: false, Description: "Set to True if you want force delete non-empty RG", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Set to True if you want force delete non-empty RG", - }, "register_computes": { Type: schema.TypeBool, Optional: true, @@ -876,6 +813,7 @@ func ResourceRgSchemaMake() map[string]*schema.Schema { }, "uniq_pools": { Type: schema.TypeList, + Optional: true, Computed: true, Elem: &schema.Schema{ Type: schema.TypeString, @@ -913,25 +851,18 @@ func ResourceResgroup() *schema.Resource { Default: &constants.Timeout300s, }, - Schema: ResourceRgSchemaMake(), - CustomizeDiff: customdiff.All( - customdiff.IfValueChange("def_net", - func(ctx context.Context, oldValue, newValue, meta interface{}) bool { - return true - }, - func(ctx context.Context, d *schema.ResourceDiff, m interface{}) error { - oldValue, newValue := d.GetChange("def_net") - - old := len(oldValue.(*schema.Set).List()) - new_ := len(newValue.(*schema.Set).List()) + CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { + if diff.HasChange("def_net") { + diff.SetNewComputed("def_net_id") + } + if diff.HasChanges() { + diff.SetNewComputed("updated_by") + diff.SetNewComputed("updated_time") + } + return nil + }, - if old == 1 && new_ == 0 { - return fmt.Errorf("CustomizeDiff: block def_net must not be empty") - } - return nil - }, - ), - ), + Schema: ResourceRgSchemaMake(), StateUpgraders: []schema.StateUpgrader{ { Type: resourceRGResourceV1().CoreConfigSchema().ImpliedType(), diff --git a/internal/service/cloudapi/rg/utility_rg.go b/internal/service/cloudapi/rg/utility_rg.go index 01247c5..ed31dd6 100644 --- a/internal/service/cloudapi/rg/utility_rg.go +++ b/internal/service/cloudapi/rg/utility_rg.go @@ -52,9 +52,6 @@ func utilityResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m } else { req.RGID = uint64(d.Get("rg_id").(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } rgData, err := c.CloudAPI().RG().Get(ctx, req) if err != nil { @@ -137,8 +134,14 @@ func utilityUpdateRG(ctx context.Context, d *schema.ResourceData, m interface{}, req.RegisterComputes = d.Get("register_computes").(bool) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) + if d.HasChange("uniq_pools") { + uniqPools := d.Get("uniq_pools").([]interface{}) + if len(uniqPools) == 0 { + req.ClearUniqPools = true + } + for _, pool := range uniqPools { + req.UniqPools = append(req.UniqPools, pool.(string)) + } } _, err := c.CloudAPI().RG().Update(ctx, req) diff --git a/internal/service/cloudapi/rg/utility_rg_usage.go b/internal/service/cloudapi/rg/utility_rg_usage.go index e51d24e..6b664b9 100644 --- a/internal/service/cloudapi/rg/utility_rg_usage.go +++ b/internal/service/cloudapi/rg/utility_rg_usage.go @@ -46,10 +46,6 @@ func utilityDataRgUsageCheckPresence(ctx context.Context, d *schema.ResourceData RGID: uint64(d.Get("rg_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - usage, err := c.CloudAPI().RG().Usage(ctx, req) if err != nil { return nil, err diff --git a/internal/service/cloudapi/snapshot/resource_snapshot.go b/internal/service/cloudapi/snapshot/resource_snapshot.go index 6f236f8..0b14f6a 100644 --- a/internal/service/cloudapi/snapshot/resource_snapshot.go +++ b/internal/service/cloudapi/snapshot/resource_snapshot.go @@ -86,9 +86,17 @@ func resourceSnapshotDelete(ctx context.Context, d *schema.ResourceData, m inter Label: d.Get("label").(string), } - _, err := c.CloudAPI().Compute().SnapshotDelete(ctx, req) - if err != nil { - return diag.FromErr(err) + asyncMode, ok := d.GetOk("delete_async_mode") + if ok && asyncMode.(bool) { + _, err := c.CloudAPI().Compute().SnapshotDeleteAsync(ctx, req) + if err != nil { + return diag.FromErr(err) + } + } else { + _, err := c.CloudAPI().Compute().SnapshotDelete(ctx, req) + if err != nil { + return diag.FromErr(err) + } } d.SetId("") @@ -160,6 +168,11 @@ func resourceSnapshotSchemaMake() map[string]*schema.Schema { Computed: true, Description: "timestamp", }, + "delete_async_mode": { + Type: schema.TypeBool, + Computed: true, + Description: "async mode", + }, } } diff --git a/internal/service/cloudapi/vins/data_source_vins.go b/internal/service/cloudapi/vins/data_source_vins.go index 3664d88..8bb1bff 100644 --- a/internal/service/cloudapi/vins/data_source_vins.go +++ b/internal/service/cloudapi/vins/data_source_vins.go @@ -154,6 +154,47 @@ func vnfInterfaceSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + Description: "mtu", + }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "name": { Type: schema.TypeString, Computed: true, @@ -170,7 +211,7 @@ func vnfInterfaceSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, - "node_id" : { + "node_id": { Type: schema.TypeInt, Computed: true, }, @@ -178,6 +219,10 @@ func vnfInterfaceSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "qos": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/vins/data_source_vins_list.go b/internal/service/cloudapi/vins/data_source_vins_list.go index 62c16a5..5fb8f33 100644 --- a/internal/service/cloudapi/vins/data_source_vins_list.go +++ b/internal/service/cloudapi/vins/data_source_vins_list.go @@ -83,6 +83,11 @@ func dataSourceVinsListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Filter by external IP address", }, + "vnf_dev_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Filter by VNF Device id", + }, "include_deleted": { Type: schema.TypeBool, Optional: true, diff --git a/internal/service/cloudapi/vins/flattens.go b/internal/service/cloudapi/vins/flattens.go index e74792d..ce2483b 100644 --- a/internal/service/cloudapi/vins/flattens.go +++ b/internal/service/cloudapi/vins/flattens.go @@ -87,25 +87,28 @@ func flattenInterfaces(interfaces []vins.ItemVNFInterface) []map[string]interfac res := make([]map[string]interface{}, 0, len(interfaces)) for _, vnfInterface := range interfaces { temp := map[string]interface{}{ - "conn_id": vnfInterface.ConnID, - "conn_type": vnfInterface.ConnType, - "def_gw": vnfInterface.DefGW, - "enabled": vnfInterface.Enabled, - "flipgroup_id": vnfInterface.FLIPGroupID, - "guid": vnfInterface.GUID, - "ip_address": vnfInterface.IPAddress, - "listen_ssh": vnfInterface.ListenSSH, - "mac": vnfInterface.MAC, - "name": vnfInterface.Name, - "net_id": vnfInterface.NetID, - "net_mask": vnfInterface.NetMask, - "net_type": vnfInterface.NetType, - "node_id": vnfInterface.NodeID, - "pci_slot": vnfInterface.PCISlot, - "qos": flattenQOS(vnfInterface.QOS), - "target": vnfInterface.Target, - "type": vnfInterface.Type, - "vnfs": vnfInterface.VNFs, + "conn_id": vnfInterface.ConnID, + "conn_type": vnfInterface.ConnType, + "def_gw": vnfInterface.DefGW, + "enabled": vnfInterface.Enabled, + "flipgroup_id": vnfInterface.FLIPGroupID, + "guid": vnfInterface.GUID, + "ip_address": vnfInterface.IPAddress, + "listen_ssh": vnfInterface.ListenSSH, + "mac": vnfInterface.MAC, + "mtu": vnfInterface.MTU, + "name": vnfInterface.Name, + "net_id": vnfInterface.NetID, + "net_mask": vnfInterface.NetMask, + "net_type": vnfInterface.NetType, + "node_id": vnfInterface.NodeID, + "pci_slot": vnfInterface.PCISlot, + "bus_number": vnfInterface.BusNumber, + "qos": flattenQOS(vnfInterface.QOS), + "target": vnfInterface.Target, + "type": vnfInterface.Type, + "vnfs": vnfInterface.VNFs, + "libvirt_settings": flattenLibvirtSettings(vnfInterface.LibvirtSettings), } res = append(res, temp) } @@ -113,6 +116,21 @@ func flattenInterfaces(interfaces []vins.ItemVNFInterface) []map[string]interfac return res } +func flattenLibvirtSettings(libvirtSettings vins.LibvirtSettings) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "guid": libvirtSettings.GUID, + "txmode": libvirtSettings.TXMode, + "ioeventfd": libvirtSettings.IOEventFD, + "event_idx": libvirtSettings.EventIDx, + "queues": libvirtSettings.Queues, + "rx_queue_size": libvirtSettings.RXQueueSize, + "tx_queue_size": libvirtSettings.TXQueueSize, + } + res = append(res, temp) + return res +} + func flattenVNFDev(vnfDev vins.RecordVNFDev) []map[string]interface{} { res := make([]map[string]interface{}, 0) temp := map[string]interface{}{ diff --git a/internal/service/cloudapi/vins/utility_vins_list.go b/internal/service/cloudapi/vins/utility_vins_list.go index 320328b..8b682b9 100644 --- a/internal/service/cloudapi/vins/utility_vins_list.go +++ b/internal/service/cloudapi/vins/utility_vins_list.go @@ -66,6 +66,10 @@ func utilityVinsListCheckPresence(ctx context.Context, d *schema.ResourceData, m req.ExtIP = ext_ip.(string) } + if VNFDevId, ok := d.GetOk("vnfdev_id"); ok { + req.VNFDevId = uint64(VNFDevId.(int)) + } + if includeDeleted, ok := d.GetOk("include_deleted"); ok { req.IncludeDeleted = includeDeleted.(bool) } diff --git a/internal/service/cloudbroker/account/schema.go b/internal/service/cloudbroker/account/schema.go index 8ac0fc6..b2e9cbf 100644 --- a/internal/service/cloudbroker/account/schema.go +++ b/internal/service/cloudbroker/account/schema.go @@ -49,11 +49,6 @@ func resourceAccountSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Required: true, }, - "recursive_delete": { - Type: schema.TypeBool, - Optional: true, - Default: false, - }, }, }, }, diff --git a/internal/service/cloudbroker/account/utility_account.go b/internal/service/cloudbroker/account/utility_account.go index b9c2e55..e108b25 100644 --- a/internal/service/cloudbroker/account/utility_account.go +++ b/internal/service/cloudbroker/account/utility_account.go @@ -165,9 +165,8 @@ func utilityAccountUsersUpdate(ctx context.Context, d *schema.ResourceData, m in userConv := user.(map[string]interface{}) _, err := c.CloudBroker().Account().DeleteUser(ctx, account.DeleteUserRequest{ - AccountID: acc.ID, - UserName: userConv["user_id"].(string), - RecursiveDelete: userConv["recursive_delete"].(bool), + AccountID: acc.ID, + UserName: userConv["user_id"].(string), }) if err != nil { @@ -414,8 +413,7 @@ func isChangedUser(els []interface{}, el interface{}) bool { elOldConv := elOld.(map[string]interface{}) elConv := el.(map[string]interface{}) if elOldConv["user_id"].(string) == elConv["user_id"].(string) && - (!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string)) || - elOldConv["recursive_delete"].(bool) != elConv["recursive_delete"].(bool)) { + (!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string))) { return true } } diff --git a/internal/service/cloudbroker/audit/data_source_audit_export_to_file.go b/internal/service/cloudbroker/audit/data_source_audit_export_to_file.go new file mode 100644 index 0000000..029f8e2 --- /dev/null +++ b/internal/service/cloudbroker/audit/data_source_audit_export_to_file.go @@ -0,0 +1,92 @@ +/* +Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Sergey Kisil, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package audit + +import ( + "context" + "os" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceAuditsToFileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + filePath := "audits.tar.gz" + if userPath, ok := d.GetOk("file_path"); ok { + filePath = userPath.(string) + } + + log.Debugf("dataSourceAuditsToFileRead: create file with name: %s", filePath) + file, err := os.Create(filePath) + defer file.Close() + if err != nil { + d.SetId("") // ensure ID is empty in this case + return diag.FromErr(err) + } + + data, err := utilityAuditsToFileCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") // ensure ID is empty in this case + return diag.FromErr(err) + } + + log.Debugf("dataSourceAuditsToFileRead: write data to file with name: %s", filePath) + _, err = file.Write(data) + if err != nil { + d.SetId("") // ensure ID is empty in this case + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + + return nil +} + +func DataSourceAuditsToFile() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceAuditsToFileRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceAuditToFileSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/audit/flattens.go b/internal/service/cloudbroker/audit/flattens.go index 85164fd..493de04 100644 --- a/internal/service/cloudbroker/audit/flattens.go +++ b/internal/service/cloudbroker/audit/flattens.go @@ -41,7 +41,6 @@ import ( func flattenAudit(d *schema.ResourceData, au *audit.RecordAudit) { log.Debugf("flattenAudit: decoded audit guid %s", d.Get("audit_guid").(string)) - d.Set("apitask", au.Apitask) d.Set("args", au.Arguments) d.Set("call", au.Call) d.Set("guid", au.GUID) diff --git a/internal/service/cloudbroker/audit/schema.go b/internal/service/cloudbroker/audit/schema.go index 49a4c51..229b4fb 100644 --- a/internal/service/cloudbroker/audit/schema.go +++ b/internal/service/cloudbroker/audit/schema.go @@ -10,10 +10,6 @@ func dataSourceAuditSchemaMake() map[string]*schema.Schema { Description: "audit guid", }, - "apitask": { - Type: schema.TypeString, - Computed: true, - }, "args": { Type: schema.TypeString, Computed: true, @@ -211,3 +207,13 @@ func dataSourceLinkedJobsSchemaMake() map[string]*schema.Schema { }, } } + +func dataSourceAuditToFileSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "file_path": { + Type: schema.TypeString, + Optional: true, + Description: "file path", + }, + } +} diff --git a/internal/service/cloudbroker/audit/utility_audit_export_to_file.go b/internal/service/cloudbroker/audit/utility_audit_export_to_file.go new file mode 100644 index 0000000..7aa9697 --- /dev/null +++ b/internal/service/cloudbroker/audit/utility_audit_export_to_file.go @@ -0,0 +1,54 @@ +/* +Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Sergey Kisil, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package audit + +import ( + "context" + + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityAuditsToFileCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) ([]byte, error) { + c := m.(*controller.ControllerCfg) + + log.Debugf("utilityAuditToFileCheckPresence: load audit file") + auditTar, err := c.CloudBroker().Audit().ExportAuditsToFile(ctx) + if err != nil { + return nil, err + } + + return auditTar, nil +} diff --git a/internal/service/cloudbroker/disks/resource_disk.go b/internal/service/cloudbroker/disks/resource_disk.go index 12111fd..3d6ac94 100644 --- a/internal/service/cloudbroker/disks/resource_disk.go +++ b/internal/service/cloudbroker/disks/resource_disk.go @@ -264,7 +264,6 @@ func resourceDiskDelete(ctx context.Context, d *schema.ResourceData, m interface DiskID: disk.ID, Detach: d.Get("detach").(bool), Permanently: d.Get("permanently").(bool), - Reason: d.Get("reason").(string), } _, err = c.CloudBroker().Disks().Delete(ctx, req) @@ -334,12 +333,6 @@ func resourceDiskRestore(ctx context.Context, d *schema.ResourceData, m interfac DiskID: uint64(d.Get("disk_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } else { - req.Reason = "Terraform automatic restore" - } - _, err := c.CloudBroker().Disks().Restore(ctx, req) return err } diff --git a/internal/service/cloudbroker/disks/resource_disk_replication.go b/internal/service/cloudbroker/disks/resource_disk_replication.go index 27298fa..223edd5 100644 --- a/internal/service/cloudbroker/disks/resource_disk_replication.go +++ b/internal/service/cloudbroker/disks/resource_disk_replication.go @@ -177,7 +177,6 @@ func resourceDiskReplicationDelete(ctx context.Context, d *schema.ResourceData, DiskID: disk.ID, Detach: d.Get("detach").(bool), Permanently: d.Get("permanently").(bool), - Reason: d.Get("reason").(string), } log.Debugf("resourceDiskReplicationDelete: delete disk replica for disk with ID: %d", diskId) diff --git a/internal/service/cloudbroker/disks/schema.go b/internal/service/cloudbroker/disks/schema.go index 6d4b265..c73eaf8 100644 --- a/internal/service/cloudbroker/disks/schema.go +++ b/internal/service/cloudbroker/disks/schema.go @@ -207,27 +207,27 @@ func dataSourceDiskSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -611,27 +611,27 @@ func dataSourceDiskListSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -1006,27 +1006,27 @@ func dataSourceDiskListDeletedSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -1859,12 +1859,6 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { Default: false, Description: "whether to completely delete the disk, works only with non attached disks", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Default: "", - Description: "reason for an action", - }, "shareable": { Type: schema.TypeBool, Optional: true, @@ -2072,27 +2066,27 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -2393,27 +2387,27 @@ func dataSourceDiskReplicationSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -2568,11 +2562,7 @@ func resourceDiskReplicationSchemaMake() map[string]*schema.Schema { Default: false, Description: "Delete disk permanently", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for disk deletion", - }, + "replica_disk_id": { Type: schema.TypeInt, Computed: true, @@ -2771,27 +2761,27 @@ func resourceDiskReplicationSchemaMake() map[string]*schema.Schema { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "disk_id": { - Type: schema.TypeInt, + Type: schema.TypeInt, Computed: true, }, "pool_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "role": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "self_volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "storage_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, "volume_id": { - Type: schema.TypeString, + Type: schema.TypeString, Computed: true, }, }, @@ -2889,4 +2879,4 @@ func resourceDiskReplicationSchemaMake() map[string]*schema.Schema { } return rets -} \ No newline at end of file +} diff --git a/internal/service/cloudbroker/dpdknet/data_source_dpdk.go b/internal/service/cloudbroker/dpdknet/data_source_dpdk.go new file mode 100644 index 0000000..6b88eed --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/data_source_dpdk.go @@ -0,0 +1,72 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceDPDKNetRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + dpdk, err := utilityDPDKNetCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + + flattenDPDKNet(d, dpdk) + + return nil +} + +func DataSourceDPDKNet() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceDPDKNetRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceDPDKNetSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/dpdknet/data_source_dpdk_list.go b/internal/service/cloudbroker/dpdknet/data_source_dpdk_list.go new file mode 100644 index 0000000..ef067e7 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/data_source_dpdk_list.go @@ -0,0 +1,72 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceDPDKNetListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + dpdkList, err := utilityDPDKNetListCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenDPDKNetList(dpdkList)) + d.Set("entry_count", dpdkList.EntryCount) + + return nil +} + +func DataSourceDPDKNetList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceDPDKNetListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceDPDKNetListSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/dpdknet/flattens.go b/internal/service/cloudbroker/dpdknet/flattens.go new file mode 100644 index 0000000..49f6003 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/flattens.go @@ -0,0 +1,44 @@ +package dpdknet + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/dpdknet" +) + +func flattenDPDKNet(d *schema.ResourceData, dpdk *dpdk.RecordDPDKNet) { + d.Set("dpdk_id", dpdk.ID) + d.Set("account_access", dpdk.AccountAccess) + d.Set("created_time", dpdk.CreatedTime) + d.Set("desc", dpdk.Description) + d.Set("gid", dpdk.GID) + d.Set("guid", dpdk.GUID) + d.Set("name", dpdk.Name) + d.Set("rg_access", dpdk.RGAccess) + d.Set("status", dpdk.Status) + d.Set("ovs_bridge", dpdk.OVSBridge) + d.Set("vlan_id", dpdk.VlanID) + d.Set("compute_ids", dpdk.ComputeIDs) + d.Set("updated_time", dpdk.UpdatedTime) +} + +func flattenDPDKNetList(list *dpdk.ListDPDKNet) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(list.Data)) + for _, dpdk := range list.Data { + temp := map[string]interface{}{ + "dpdk_id": dpdk.ID, + "account_access": dpdk.AccountAccess, + "desc": dpdk.Description, + "gid": dpdk.GID, + "guid": dpdk.GUID, + "name": dpdk.Name, + "rg_access": dpdk.RGAccess, + "status": dpdk.Status, + "ovs_bridge": dpdk.OVSBridge, + "vlan_id": dpdk.VlanID, + "compute_ids": dpdk.ComputeIDs, + "updated_time": dpdk.UpdatedTime, + } + res = append(res, temp) + } + return res +} diff --git a/internal/service/cloudbroker/dpdknet/resource_check_input_values.go b/internal/service/cloudbroker/dpdknet/resource_check_input_values.go new file mode 100644 index 0000000..19db0b6 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/resource_check_input_values.go @@ -0,0 +1,24 @@ +package dpdknet + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/ic" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func checkParamsExistence(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) diag.Diagnostics { + var errs []error + + gid := uint64(d.Get("gid").(int)) + + if err := ic.ExistGID(ctx, gid, c); err != nil { + errs = append(errs, err) + } + + return dc.ErrorsToDiagnostics(errs) +} diff --git a/internal/service/cloudbroker/dpdknet/resource_dpdk.go b/internal/service/cloudbroker/dpdknet/resource_dpdk.go new file mode 100644 index 0000000..05adf30 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/resource_dpdk.go @@ -0,0 +1,246 @@ +/* +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + "strconv" + + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/dpdknet" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/status" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" +) + +func resourceDPDKNetCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceDPDKNetCreate: called for DPDK network %s", d.Get("name").(string)) + c := m.(*controller.ControllerCfg) + + if diags := checkParamsExistence(ctx, d, c); diags != nil { + return diags + } + + req := dpdk.CreateRequest{ + Name: d.Get("name").(string), + GID: uint64(d.Get("gid").(int)), + VlanID: uint64(d.Get("vlan_id").(int)), + OVSBridge: d.Get("ovs_bridge").(string), + } + + if desc, ok := d.GetOk("desc"); ok { + req.Description = desc.(string) + } + + if accountAccess, ok := d.GetOk("account_access"); ok { + IDs := accountAccess.([]interface{}) + for _, ID := range IDs { + req.AccountAccess = append(req.AccountAccess, uint64(ID.(int))) + } + } + if rgAccess, ok := d.GetOk("rg_access"); ok { + IDs := rgAccess.([]interface{}) + for _, ID := range IDs { + req.RGAccess = append(req.RGAccess, uint64(ID.(int))) + } + } + + dpdkID, err := c.CloudBroker().DPDKNet().Create(ctx, req) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + d.SetId(strconv.FormatUint(dpdkID, 10)) + d.Set("dpdk_id", dpdkID) + + warnings := dc.Warnings{} + + if err = utilityDPDKNetEnabled(ctx, d, m); err != nil { + warnings.Add(err) + } + + return append(warnings.Get(), resourceDPDKNetRead(ctx, d, m)...) +} + +func resourceDPDKNetRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceDPDKNetRead: called for pdpk_id %d", d.Get("dpdk_id").(int)) + w := dc.Warnings{} + + dpdkItem, err := utilityDPDKNetCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + log.Debugf("status: %s", dpdkItem.Status) + + switch dpdkItem.Status { + case status.Destroyed, status.Purged: + d.Set("dpdk_id", 0) + d.SetId("") + return diag.Errorf("The resource cannot be read because it has been destroyed") + case status.Deleted: + case status.Assigned: + case status.Modeled: + return diag.Errorf("The DPDK network is in status: %s, please, contact support for more information", dpdkItem.Status) + case status.Creating: + case status.Created: + case status.Allocated: + case status.Unallocated: + } + + flattenDPDKNet(d, dpdkItem) + + return w.Get() +} + +func resourceDPDKNetUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceDPDKNetUpdate: called for dpdk_id %d", d.Get("dpdk_id").(int)) + c := m.(*controller.ControllerCfg) + w := dc.Warnings{} + + if diags := checkParamsExistence(ctx, d, c); diags != nil { + return diags + } + + dpdkItem, err := utilityDPDKNetCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + switch dpdkItem.Status { + case status.Destroyed, status.Purged: + d.Set("dpdk_id", 0) + d.SetId("") + return diag.Errorf("The resource cannot be updated because it has been destroyed") + case status.Deleted: + d.Set("dpdk_id", 0) + d.SetId("") + return diag.Errorf("The resource cannot be updated because it has been deleted") + case status.Assigned: + case status.Modeled: + return diag.Errorf("The DPDK network is in status: %s, please, contact support for more information", dpdkItem.Status) + case status.Creating: + case status.Created: + case status.Allocated: + case status.Unallocated: + } + + if d.HasChange("enabled") { + if err := utilityDPDKNetEnabled(ctx, d, m); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChanges("name", "desc", "vlan_id", "ovs_bridge", "account_access", "rg_access") { + if err := utilityDPDKNetUpdate(ctx, d, m); err != nil { + return diag.FromErr(err) + } + } + + return append(w.Get(), resourceDPDKNetRead(ctx, d, m)...) +} + +func resourceDPDKNetDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceDPDKNetDelete: called for dpdk_id %d", d.Get("dpdk_id").(int)) + c := m.(*controller.ControllerCfg) + + dpdkItem, err := utilityDPDKNetCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + req := dpdk.DeleteRequest{ + DPDKID: dpdkItem.ID, + } + + if d.Get("enabled") == true { + req := dpdk.DisableRequest{ + DPDKID: dpdkItem.ID, + } + + if _, err := c.CloudBroker().DPDKNet().Disable(ctx, req); err != nil { + return diag.FromErr(err) + } + } + + _, err = c.CloudBroker().DPDKNet().Delete(ctx, req) + if err != nil { + return diag.FromErr(err) + } + + d.SetId("") + + return nil +} + +func ResourceDPDKNet() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CreateContext: resourceDPDKNetCreate, + ReadContext: resourceDPDKNetRead, + UpdateContext: resourceDPDKNetUpdate, + DeleteContext: resourceDPDKNetDelete, + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { + if diff.HasChange("enable") { + diff.SetNewComputed("status") + } + if diff.HasChanges() { + diff.SetNewComputed("updated_time") + } + return nil + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &constants.Timeout600s, + Read: &constants.Timeout300s, + Update: &constants.Timeout300s, + Delete: &constants.Timeout300s, + Default: &constants.Timeout300s, + }, + + Schema: resourceDPDKNetSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/dpdknet/schema.go b/internal/service/cloudbroker/dpdknet/schema.go new file mode 100644 index 0000000..a2d3860 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/schema.go @@ -0,0 +1,312 @@ +package dpdknet + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +func dataSourceDPDKNetSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "dpdk_id": { + Type: schema.TypeInt, + Required: true, + Description: "The unique ID of the subscriber-owner of the DPDK network", + }, + "account_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of accounts with access", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Created time", + }, + "desc": { + Type: schema.TypeString, + Computed: true, + Description: "Description of DPDK network", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the grid (platform)", + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + Description: "DPDK network ID on the storage side", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of network", + }, + "rg_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of resource groups with access", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "DPDK network status", + }, + "ovs_bridge": { + Type: schema.TypeString, + Computed: true, + Description: "OVS bridge in which interfaces for computers created", + }, + "vlan_id": { + Type: schema.TypeInt, + Computed: true, + Description: "vlan ID", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Compute IDs which uses this DPDK network", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Updated time", + }, + } + + return res +} + +func dataSourceDPDKNetListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "by_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by ID", + }, + "gid": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by GID", + }, + "name": { + Type: schema.TypeString, + Optional: true, + Description: "Find by name", + }, + "desc": { + Type: schema.TypeString, + Optional: true, + Description: "Find by description", + }, + "status": { + Type: schema.TypeString, + Optional: true, + Description: "Find by status", + }, + "compute_ids": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Find by compute IDs", + }, + "sort_by": { + Type: schema.TypeString, + Optional: true, + Description: "sort by one of supported fields, format +|-(field)", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dpdk_id": { + Type: schema.TypeInt, + Required: true, + Description: "The unique ID of the subscriber-owner of the DPDK network", + }, + "account_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of accounts with access", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Created time", + }, + "desc": { + Type: schema.TypeString, + Computed: true, + Description: "Description of DPDK network", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the grid (platform)", + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + Description: "DPDK network ID on the storage side", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of network", + }, + "rg_access": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of resource groups with access", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "DPDK network status", + }, + "ovs_bridge": { + Type: schema.TypeString, + Computed: true, + Description: "OVS bridge in which interfaces for computers created", + }, + "vlan_id": { + Type: schema.TypeInt, + Computed: true, + Description: "vlan ID", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Compute IDs which uses this DPDK network", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Updated time", + }, + }, + }, + }, + "entry_count": { + Type: schema.TypeInt, + Computed: true, + }, + } + return res +} + +func resourceDPDKNetSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "gid": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the grid (platform)", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name of network", + }, + "ovs_bridge": { + Type: schema.TypeString, + Required: true, + Description: "OVS bridge in which interfaces for computers created", + }, + "vlan_id": { + Type: schema.TypeInt, + Required: true, + Description: "vlan ID", + }, + "dpdk_id": { + Type: schema.TypeInt, + Computed: true, + Description: "The unique ID of the subscriber-owner of the DPDK network", + }, + "account_access": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of accounts with access", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Created time", + }, + "desc": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Description of DPDK network", + }, + "enabled": { + Type: schema.TypeBool, + Optional: true, + Description: "Enabled or disabled DPDK network", + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + Description: "DPDK network ID on the storage side", + }, + "rg_access": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "List of resource groups with access", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "DPDK network status", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "Compute IDs which uses this DPDK network", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Updated time", + }, + } + return res +} diff --git a/internal/service/cloudbroker/dpdknet/utility_dpdk.go b/internal/service/cloudbroker/dpdknet/utility_dpdk.go new file mode 100644 index 0000000..0b9ee10 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/utility_dpdk.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/dpdknet" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityDPDKNetCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*dpdk.RecordDPDKNet, error) { + c := m.(*controller.ControllerCfg) + req := dpdk.GetRequest{} + + if d.Get("dpdk_id") != nil { + if d.Get("dpdk_id").(int) == 0 { + id, _ := strconv.ParseUint(d.Id(), 10, 64) + req.DPDKID = id + } else { + req.DPDKID = uint64(d.Get("dpdk_id").(int)) + } + } else { + id, _ := strconv.ParseUint(d.Id(), 10, 64) + req.DPDKID = id + } + + log.Debugf("utilityDPDKCheckPresence: get DPDK network") + dpdk, err := c.CloudBroker().DPDKNet().Get(ctx, req) + if err != nil { + return nil, err + } + + return dpdk, nil +} + +func utilityDPDKNetEnabled(ctx context.Context, d *schema.ResourceData, m interface{}) error { + c := m.(*controller.ControllerCfg) + + dpdkID, _ := strconv.ParseUint(d.Id(), 10, 64) + enabled := d.Get("enabled").(bool) + + if enabled { + req := dpdk.EnableRequest{ + DPDKID: dpdkID, + } + + if _, err := c.CloudBroker().DPDKNet().Enable(ctx, req); err != nil { + return err + } + } else { + req := dpdk.DisableRequest{ + DPDKID: dpdkID, + } + + if _, err := c.CloudBroker().DPDKNet().Disable(ctx, req); err != nil { + return err + } + } + log.Debugf("resourceDPDKNetUpdate: enable=%v DPDK Network ID %s after completing its resource configuration", enabled, d.Id()) + + return nil +} + +func utilityDPDKNetUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) error { + c := m.(*controller.ControllerCfg) + + dpdkID, _ := strconv.ParseUint(d.Id(), 10, 64) + + req := dpdk.UpdateRequest{ + DPDKID: dpdkID, + } + + if d.HasChange("name") { + req.Name = d.Get("name").(string) + } + + if d.HasChange("desc") { + req.Description = d.Get("desc").(string) + } + + if d.HasChange("vlan_id") { + req.VlanID = uint64(d.Get("vlan_id").(int)) + } + + if d.HasChange("ovs_bridge") { + req.OVSBridge = d.Get("ovs_bridge").(string) + } + + if d.HasChange("account_access") { + if accountAccess, ok := d.GetOk("account_access"); ok { + IDs := accountAccess.([]interface{}) + for _, ID := range IDs { + req.AccountAccess = append(req.AccountAccess, uint64(ID.(int))) + } + } + } + + if d.HasChange("rg_access") { + if rgAccess, ok := d.GetOk("rg_access"); ok { + IDs := rgAccess.([]interface{}) + for _, ID := range IDs { + req.RGAccess = append(req.RGAccess, uint64(ID.(int))) + } + } + } + + if d.Get("enabled") == true { + req := dpdk.DisableRequest{ + DPDKID: dpdkID, + } + + if _, err := c.CloudBroker().DPDKNet().Disable(ctx, req); err != nil { + return err + } + } + + if _, err := c.CloudBroker().DPDKNet().Update(ctx, req); err != nil { + return err + } + + if d.Get("enabled") == true { + req := dpdk.EnableRequest{ + DPDKID: dpdkID, + } + + if _, err := c.CloudBroker().DPDKNet().Enable(ctx, req); err != nil { + return err + } + } + + return nil +} diff --git a/internal/service/cloudbroker/dpdknet/utility_dpdk_list.go b/internal/service/cloudbroker/dpdknet/utility_dpdk_list.go new file mode 100644 index 0000000..a1b5a40 --- /dev/null +++ b/internal/service/cloudbroker/dpdknet/utility_dpdk_list.go @@ -0,0 +1,108 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Authors: +Petr Krutov, +Stanislav Solovev, +Kasim Baybikov, + +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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package dpdknet + +import ( + "context" + + log "github.com/sirupsen/logrus" + dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/dpdknet" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityDPDKNetListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*dpdk.ListDPDKNet, error) { + c := m.(*controller.ControllerCfg) + req := dpdk.ListRequest{} + + if byID, ok := d.GetOk("by_id"); ok { + req.ByID = uint64(byID.(int)) + } + if GID, ok := d.GetOk("gid"); ok { + req.GID = uint64(GID.(int)) + } + if name, ok := d.GetOk("name"); ok { + req.Name = name.(string) + } + if desc, ok := d.GetOk("description"); ok { + req.Description = desc.(string) + } + if status, ok := d.GetOk("status"); ok { + req.Status = status.(string) + } + if vlanID, ok := d.GetOk("vlan_id"); ok { + req.VlanID = uint64(vlanID.(int)) + } + if computeIDs, ok := d.GetOk("compute_ids"); ok { + IDs := computeIDs.([]interface{}) + for _, ID := range IDs { + req.ComputeIDs = append(req.ComputeIDs, uint64(ID.(int))) + } + } + if computeIDs, ok := d.GetOk("compute_ids"); ok { + IDs := computeIDs.([]interface{}) + for _, ID := range IDs { + req.ComputeIDs = append(req.ComputeIDs, uint64(ID.(int))) + } + } + if accountAccess, ok := d.GetOk("account_access"); ok { + IDs := accountAccess.([]interface{}) + for _, ID := range IDs { + req.AccountAccess = append(req.AccountAccess, uint64(ID.(int))) + } + } + if rgAccess, ok := d.GetOk("rg_access"); ok { + IDs := rgAccess.([]interface{}) + for _, ID := range IDs { + req.RGAccess = append(req.RGAccess, uint64(ID.(int))) + } + } + if sortBy, ok := d.GetOk("sort_by"); ok { + req.SortBy = sortBy.(string) + } + if page, ok := d.GetOk("page"); ok { + req.Page = uint64(page.(int)) + } + if size, ok := d.GetOk("size"); ok { + req.Size = uint64(size.(int)) + } + + log.Debugf("utilityDPDKListCheckPresence: load DPDK network list") + dpdkList, err := c.CloudBroker().DPDKNet().List(ctx, req) + if err != nil { + return nil, err + } + + return dpdkList, nil +} diff --git a/internal/service/cloudbroker/grid/data_source_grid_get_settings.go b/internal/service/cloudbroker/grid/data_source_grid_get_settings.go new file mode 100644 index 0000000..3491a7b --- /dev/null +++ b/internal/service/cloudbroker/grid/data_source_grid_get_settings.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2019-2023 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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package grid + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceGridGetSettingsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + gridSettings, err := utilityGridGetSettingsCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + id := uuid.New() + d.SetId(id.String()) + flattenGridSettings(d, gridSettings) + + return nil +} + +func DataSourceGridGetSettings() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceGridGetSettingsRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceGridGetSettingsSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/grid/flattens.go b/internal/service/cloudbroker/grid/flattens.go index cac0817..4e28336 100644 --- a/internal/service/cloudbroker/grid/flattens.go +++ b/internal/service/cloudbroker/grid/flattens.go @@ -1,12 +1,16 @@ package grid import ( + "encoding/json" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/grid" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/flattens" ) func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) { + d.Set("ckey", grid.CKey) + d.Set("meta", flattens.FlattenMeta(grid.Meta)) d.Set("auth_broker", flattens.FlattenMeta(grid.AuthBroker)) d.Set("name", grid.Name) d.Set("flag", grid.Flag) @@ -88,3 +92,83 @@ func flattenGridSeps(seps map[string]map[string]grid.DiskUsage) []map[string]int } return res } + +func flattenGridSettings(d *schema.ResourceData, gridSettings *grid.RecordSettingsGrid) { + limits, _ := json.Marshal(gridSettings.Limits) + d.Set("allowed_ports", gridSettings.Allowedports) + d.Set("cleanup_retention_period", gridSettings.CleanupRetentionPeriod) + d.Set("docker_registry", flattenDockerRegistry(gridSettings.DockerRegistry)) + d.Set("enable_uptime_monitor", gridSettings.EnableUptimeMonitor) + d.Set("extnet_max_pre_reservations_num", gridSettings.ExtnetMaxPreReservationsNum) + d.Set("healthcheck_notifications", flattenHealthcheckNotifications(gridSettings.HealthcheckNotifications)) + d.Set("k8s_cleanup_enabled", gridSettings.K8sCleanupEnabled) + d.Set("limits", string(limits)) + d.Set("location_url", gridSettings.LocationURL) + d.Set("net_qos", flattenNetQOS(gridSettings.NetQOS)) + d.Set("networks", gridSettings.Networks) + d.Set("prometheus", flattenPrometheus(gridSettings.Prometheus)) + d.Set("vins_max_pre_reservations_num", gridSettings.VinsMaxPreReservationsNum) + d.Set("vnfdev_mgmt_net_range", gridSettings.VnfdevMgmtNetRange) +} + +func flattenDockerRegistry(dr grid.DockerRegistry) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "password": dr.Password, + "server": dr.Server, + "username": dr.Username, + } + res = append(res, temp) + return res +} + +func flattenHealthcheckNotifications(hn grid.HealthcheckNotifications) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "emails": flattenEmails(hn.Emails), + } + res = append(res, temp) + return res +} + +func flattenEmails(emails []grid.Emails) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(emails)) + for _, email := range emails { + temp := map[string]interface{}{ + "address": email.Address, + "enabled": email.Enabled, + } + res = append(res, temp) + } + return res +} + +func flattenNetQOS(netQOS grid.NetQOS) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "extnet": flattenSettingsNetQOS(netQOS.ExtNet), + "vins": flattenSettingsNetQOS(netQOS.VINS), + } + res = append(res, temp) + return res +} + +func flattenSettingsNetQOS(qos grid.SettingsNetQOS) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "e_rate": qos.ERate, + "in_burst": qos.InBurst, + "in_rate": qos.InRate, + } + res = append(res, temp) + return res +} + +func flattenPrometheus(pr grid.Prometheus) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "scrape_interval": pr.ScrapeInterval, + } + res = append(res, temp) + return res +} diff --git a/internal/service/cloudbroker/grid/schema.go b/internal/service/cloudbroker/grid/schema.go index f21b9a2..693bc1a 100644 --- a/internal/service/cloudbroker/grid/schema.go +++ b/internal/service/cloudbroker/grid/schema.go @@ -8,6 +8,18 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, + "ckey": { + Type: schema.TypeString, + Computed: true, + }, + "meta": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + Description: "meta", + }, "auth_broker": { Type: schema.TypeList, Computed: true, @@ -593,3 +605,160 @@ func dataSourceGridPostDiagnosisSchemaMake() map[string]*schema.Schema { }, } } + +func dataSourceGridGetSettingsSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "grid_id": { + Type: schema.TypeInt, + Description: "grid (platform) ID", + Required: true, + }, + "allowed_ports": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "cleanup_retention_period": { + Type: schema.TypeInt, + Computed: true, + }, + "docker_registry": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "password": { + Type: schema.TypeString, + Computed: true, + }, + "server": { + Type: schema.TypeString, + Computed: true, + }, + "username": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "enable_uptime_monitor": { + Type: schema.TypeBool, + Computed: true, + }, + "extnet_max_pre_reservations_num": { + Type: schema.TypeInt, + Computed: true, + }, + "healthcheck_notifications": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "emails": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Computed: true, + }, + "enabled": { + Type: schema.TypeBool, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "k8s_cleanup_enabled": { + Type: schema.TypeBool, + Computed: true, + }, + "limits": { + Type: schema.TypeString, + Computed: true, + }, + "location_url": { + Type: schema.TypeString, + Computed: true, + }, + "net_qos": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "extnet": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "e_rate": { + Type: schema.TypeInt, + Computed: true, + }, + "in_burst": { + Type: schema.TypeInt, + Computed: true, + }, + "in_rate": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "vins": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "e_rate": { + Type: schema.TypeInt, + Computed: true, + }, + "in_burst": { + Type: schema.TypeInt, + Computed: true, + }, + "in_rate": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "networks": { + Type: schema.TypeString, + Computed: true, + }, + "prometheus": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "scrape_interval": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "vins_max_pre_reservations_num": { + Type: schema.TypeInt, + Computed: true, + }, + "vnfdev_mgmt_net_range": { + Type: schema.TypeString, + Computed: true, + }, + } +} diff --git a/internal/service/cloudbroker/grid/utility_grid_get_settings.go b/internal/service/cloudbroker/grid/utility_grid_get_settings.go new file mode 100644 index 0000000..ea70a4c --- /dev/null +++ b/internal/service/cloudbroker/grid/utility_grid_get_settings.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2019-2023 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://repository.basistech.ru/BASIS/terraform-provider-decort + +Please see README.md to learn where to place source code so that it +builds seamlessly. + +Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki +*/ + +package grid + +import ( + "context" + "strconv" + + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/grid" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func utilityGridGetSettingsCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*grid.RecordSettingsGrid, error) { + c := m.(*controller.ControllerCfg) + req := grid.GetSettingsRequest{} + + if d.Id() != "" { + id, _ := strconv.ParseUint(d.Id(), 10, 64) + req.GID = id + } else { + req.GID = uint64(d.Get("grid_id").(int)) + } + + log.Debugf("utilityGridutilityGridGetSettingsCheckPresenceCheckPresence: load grid settings") + gridSettingsRec, err := c.CloudBroker().Grid().GetSettings(ctx, req) + if err != nil { + return nil, err + } + + return gridSettingsRec, nil +} diff --git a/internal/service/cloudbroker/ic/input_checks.go b/internal/service/cloudbroker/ic/input_checks.go index 1b56891..4ccc77b 100644 --- a/internal/service/cloudbroker/ic/input_checks.go +++ b/internal/service/cloudbroker/ic/input_checks.go @@ -8,6 +8,7 @@ import ( cb_account "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account" cb_compute "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute" cb_disks "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/disks" + cb_dpdk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/dpdknet" cb_extnet "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/extnet" cb_gid "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/grid" cb_image "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/image" @@ -284,6 +285,39 @@ func ExistVFPools(ctx context.Context, vfpoolIds []uint64, c *controller.Control return errs } +func ExistDPDKNet(ctx context.Context, dpdkIds []uint64, c *controller.ControllerCfg) []error { + var errs []error + + if len(dpdkIds) == 0 { + return errs + } + + req := cb_dpdk.ListRequest{} + + dpdkList, err := c.CloudBroker().DPDKNet().List(ctx, req) + if err != nil { + errs = append(errs, err) + return errs + } + + for _, dpdkId := range dpdkIds { + found := false + + for _, dpdk := range dpdkList.Data { + if dpdkId == dpdk.ID { + found = true + break + } + } + + if !found { + errs = append(errs, fmt.Errorf("DPDKNet with ID %v not found", dpdkId)) + } + } + + return errs +} + func ExistExtNetInLb(ctx context.Context, extNetId uint64, c *controller.ControllerCfg) error { if extNetId == 0 { return nil diff --git a/internal/service/cloudbroker/image/resource_cdrom_image.go b/internal/service/cloudbroker/image/resource_cdrom_image.go index b21f8f1..f265e77 100644 --- a/internal/service/cloudbroker/image/resource_cdrom_image.go +++ b/internal/service/cloudbroker/image/resource_cdrom_image.go @@ -130,10 +130,6 @@ func resourceCDROMImageDelete(ctx context.Context, d *schema.ResourceData, m int ImageID: imageData.ID, } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudBroker().Image().DeleteCDROMImage(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudbroker/image/resource_image.go b/internal/service/cloudbroker/image/resource_image.go index 364367a..aca6c55 100644 --- a/internal/service/cloudbroker/image/resource_image.go +++ b/internal/service/cloudbroker/image/resource_image.go @@ -141,13 +141,6 @@ func resourceImageDelete(ctx context.Context, d *schema.ResourceData, m interfac ImageID: uint64(d.Get("image_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudBroker().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudbroker/image/resource_image_from_blank_compute.go b/internal/service/cloudbroker/image/resource_image_from_blank_compute.go index 05c8598..61afb9a 100644 --- a/internal/service/cloudbroker/image/resource_image_from_blank_compute.go +++ b/internal/service/cloudbroker/image/resource_image_from_blank_compute.go @@ -179,13 +179,6 @@ func resourceImageFromBlankComputeDelete(ctx context.Context, d *schema.Resource ImageID: uint64(d.Get("image_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudBroker().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudbroker/image/resource_image_from_platform_disk.go b/internal/service/cloudbroker/image/resource_image_from_platform_disk.go index 1762834..6bbb038 100644 --- a/internal/service/cloudbroker/image/resource_image_from_platform_disk.go +++ b/internal/service/cloudbroker/image/resource_image_from_platform_disk.go @@ -186,13 +186,6 @@ func resourceImageFromPlatformDiskDelete(ctx context.Context, d *schema.Resource ImageID: uint64(d.Get("image_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudBroker().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudbroker/image/resource_virtual_image.go b/internal/service/cloudbroker/image/resource_virtual_image.go index facda76..9ebc244 100644 --- a/internal/service/cloudbroker/image/resource_virtual_image.go +++ b/internal/service/cloudbroker/image/resource_virtual_image.go @@ -99,13 +99,6 @@ func resourceVirtualImageDelete(ctx context.Context, d *schema.ResourceData, m i ImageID: uint64(d.Get("image_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if permanently, ok := d.GetOk("permanently"); ok { - req.Permanently = permanently.(bool) - } - _, err = c.CloudBroker().Image().Delete(ctx, req) if err != nil { return diag.FromErr(err) diff --git a/internal/service/cloudbroker/image/schema.go b/internal/service/cloudbroker/image/schema.go index 7077693..849f299 100644 --- a/internal/service/cloudbroker/image/schema.go +++ b/internal/service/cloudbroker/image/schema.go @@ -407,6 +407,11 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "page size", }, + "enabled": { + Type: schema.TypeBool, + Optional: true, + Description: "find by enabled True or False", + }, "items": { Type: schema.TypeList, Computed: true, @@ -458,7 +463,7 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema { "architecture": { Type: schema.TypeString, Computed: true, - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", + Description: "binary architecture of this image, one of X86_64", }, "boot_type": { Type: schema.TypeString, @@ -716,7 +721,7 @@ func dataSourceImageSchemaMake() map[string]*schema.Schema { "architecture": { Type: schema.TypeString, Computed: true, - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", + Description: "binary architecture of this image, one of X86_64", }, "boot_type": { Type: schema.TypeString, @@ -922,7 +927,7 @@ func resourceCDROMImageSchemaMake() map[string]*schema.Schema { }, "drivers": { Type: schema.TypeList, - Required: true, + Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, }, @@ -968,13 +973,7 @@ func resourceCDROMImageSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Optional: true, Computed: true, - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", - }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - Description: "Whether to completely delete the image", + Description: "binary architecture of this image, one of X86_64", }, "bootable": { Type: schema.TypeBool, @@ -1269,12 +1268,7 @@ func resourceImageSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Optional: true, Computed: true, - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", - }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Description: "Whether to completely delete the image", + Description: "binary architecture of this image, one of X86_64", }, "bootable": { Type: schema.TypeBool, @@ -1313,10 +1307,7 @@ func resourceImageSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, }, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "accounts": { Type: schema.TypeList, Optional: true, @@ -1534,15 +1525,7 @@ func resourceVirtualImageSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, }, }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Description: "Whether to completely delete the image", - }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "unc_path": { Type: schema.TypeString, Computed: true, @@ -1595,7 +1578,7 @@ func resourceVirtualImageSchemaMake() map[string]*schema.Schema { "architecture": { Type: schema.TypeString, Computed: true, - Description: "binary architecture of this image, one of X86_64 of PPC64_LE", + Description: "binary architecture of this image, one of X86_64", }, "boot_type": { Type: schema.TypeString, @@ -1801,12 +1784,6 @@ func resourceImageFromBlankComputeSchemaMake() map[string]*schema.Schema { Default: false, Description: "create an image in async/sync mode", }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - }, "bootable": { Type: schema.TypeBool, Optional: true, @@ -1838,10 +1815,7 @@ func resourceImageFromBlankComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, }, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "accounts": { Type: schema.TypeList, Optional: true, @@ -2039,7 +2013,7 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { "architecture": { Type: schema.TypeString, Required: true, - ValidateFunc: validation.StringInSlice([]string{"X86_64", "PPC64_LE"}, true), + ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true), Description: "Image type linux, windows or other", }, @@ -2069,11 +2043,10 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { }, "drivers": { Type: schema.TypeList, - Optional: true, - Computed: true, + Required: true, Elem: &schema.Schema{ StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Type: schema.TypeString, }, Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]", @@ -2096,12 +2069,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { Default: false, Description: "create an image in async/sync mode", }, - "permanently": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "whether to completely delete the image", - }, "bootable": { Type: schema.TypeBool, Optional: true, @@ -2133,10 +2100,7 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, }, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "accounts": { Type: schema.TypeList, Optional: true, diff --git a/internal/service/cloudbroker/image/utility_image_list.go b/internal/service/cloudbroker/image/utility_image_list.go index 44d97ee..ed17f60 100644 --- a/internal/service/cloudbroker/image/utility_image_list.go +++ b/internal/service/cloudbroker/image/utility_image_list.go @@ -72,13 +72,13 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData, if pool, ok := d.GetOk("pool"); ok { req.Pool = pool.(string) } - if public, ok := d.GetOk("public"); ok { + if public, ok := d.GetOkExists("public"); ok { req.Public = public.(bool) } - if hotResize, ok := d.GetOk("hot_resize"); ok { + if hotResize, ok := d.GetOkExists("hot_resize"); ok { req.HotResize = hotResize.(bool) } - if bootable, ok := d.GetOk("bootable"); ok { + if bootable, ok := d.GetOkExists("bootable"); ok { req.Bootable = bootable.(bool) } if sortBy, ok := d.GetOk("sort_by"); ok { @@ -90,7 +90,9 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData, if size, ok := d.GetOk("size"); ok { req.Size = uint64(size.(int)) } - + if enabled, ok := d.GetOkExists("enabled"); ok { + req.Enabled = enabled.(bool) + } log.Debugf("utilityImageListCheckPresence: load image list") imageList, err := c.CloudBroker().Image().List(ctx, req) if err != nil { diff --git a/internal/service/cloudbroker/image/utility_resource_create.go b/internal/service/cloudbroker/image/utility_resource_create.go index adeb99e..9c229e1 100644 --- a/internal/service/cloudbroker/image/utility_resource_create.go +++ b/internal/service/cloudbroker/image/utility_resource_create.go @@ -48,14 +48,6 @@ func SyncCreateRequest(ctx context.Context, d *schema.ResourceData, m interface{ ImageType: d.Get("image_type").(string), } - c := m.(*controller.ControllerCfg) - - if err := ic.ExistGID(ctx, uint64(d.Get("gid").(int)), c); err != nil { - return req, err - } - - req.GID = uint64(d.Get("gid").(int)) - if _, ok := d.GetOk("drivers"); ok { drivers := []string{} for _, driver := range d.Get("drivers").([]interface{}) { diff --git a/internal/service/cloudbroker/k8s/data_source_k8s.go b/internal/service/cloudbroker/k8s/data_source_k8s.go index 4b1ec0b..537d1d4 100644 --- a/internal/service/cloudbroker/k8s/data_source_k8s.go +++ b/internal/service/cloudbroker/k8s/data_source_k8s.go @@ -111,14 +111,16 @@ func dataSourceK8sRead(ctx context.Context, d *schema.ResourceData, m interface{ d.Set("kubeconfig", kubeconfig) - getLbReq := lb.GetRequest{LBID: cluster.LBID} - lb, err := c.CloudBroker().LB().Get(ctx, getLbReq) - if err != nil { - return diag.FromErr(err) - } + if cluster.LBID != 0 { + getLbReq := lb.GetRequest{LBID: cluster.LBID} + lb, err := c.CloudBroker().LB().Get(ctx, getLbReq) + if err != nil { + return diag.FromErr(err) + } - d.Set("extnet_id", lb.ExtNetID) - d.Set("lb_ip", lb.PrimaryNode.FrontendIP) + d.Set("extnet_id", lb.ExtNetID) + d.Set("lb_ip", lb.PrimaryNode.FrontendIP) + } flattenK8sData(d, cluster, masterComputeList, workersComputeList) return nil diff --git a/internal/service/cloudbroker/k8s/flattens.go b/internal/service/cloudbroker/k8s/flattens.go index f3794d6..64fc176 100644 --- a/internal/service/cloudbroker/k8s/flattens.go +++ b/internal/service/cloudbroker/k8s/flattens.go @@ -64,6 +64,9 @@ func flattenResourceK8sCP(d *schema.ResourceData, k8s k8s.RecordK8S, masters []c d.Set("updated_by", k8s.UpdatedBy) d.Set("updated_time", k8s.UpdatedTime) d.Set("network_plugin", k8s.NetworkPlugin) + d.Set("highly_available_lb", k8s.HighlyAvailableLB) + d.Set("address_vip", flattenAddressVIP(k8s.AddressVIP)) + d.Set("extnet_only", k8s.ExtnetOnly) flattenCPParams(d, k8s.K8SGroups.Masters, masters) } @@ -100,6 +103,20 @@ func flattenK8sData(d *schema.ResourceData, cluster *k8s.RecordK8S, masters []co d.Set("tech_status", cluster.TechStatus) d.Set("updated_by", cluster.UpdatedBy) d.Set("updated_time", cluster.UpdatedTime) + d.Set("highly_available_lb", cluster.HighlyAvailableLB) + d.Set("address_vip", flattenAddressVIP(cluster.AddressVIP)) + d.Set("extnet_only", cluster.ExtnetOnly) + d.Set("with_lb", cluster.WithLB) +} + +func flattenAddressVIP(addressVIP k8s.K8SAddressVIP) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "backend_ip": addressVIP.BackendIP, + "frontend_ip": addressVIP.FrontendIP, + } + res = append(res, temp) + return res } func flattenAcl(acl k8s.RecordACLGroup) []map[string]interface{} { diff --git a/internal/service/cloudbroker/k8s/resource_k8s_cp.go b/internal/service/cloudbroker/k8s/resource_k8s_cp.go index f947300..3c91239 100644 --- a/internal/service/cloudbroker/k8s/resource_k8s_cp.go +++ b/internal/service/cloudbroker/k8s/resource_k8s_cp.go @@ -158,6 +158,10 @@ func resourceK8sCPCreate(ctx context.Context, d *schema.ResourceData, m interfac createReq.OidcCertificate = oidcCertificate.(string) } + if chipset, ok := d.GetOk("chipset"); ok { + createReq.Chipset = chipset.(string) + } + if extNetOnly, ok := d.GetOk("extnet_only"); ok { createReq.ExtNetOnly = extNetOnly.(bool) } @@ -475,10 +479,10 @@ func handleUpdateNum(ctx context.Context, d *schema.ResourceData, c *controller. oldVal, newVal := d.GetChange("num") if oldVal.(int) > newVal.(int) { - ids := make([]string, 0) + ids := make([]uint64, 0) for i := oldVal.(int) - 1; i >= newVal.(int); i-- { id := k8sData.K8SGroups.Masters.DetailedInfo[i].ID - ids = append(ids, strconv.FormatUint(id, 10)) + ids = append(ids, id) } req := k8s.DeleteMasterFromGroupRequest{ diff --git a/internal/service/cloudbroker/k8s/resource_k8s_wg.go b/internal/service/cloudbroker/k8s/resource_k8s_wg.go index 07963ef..30734af 100644 --- a/internal/service/cloudbroker/k8s/resource_k8s_wg.go +++ b/internal/service/cloudbroker/k8s/resource_k8s_wg.go @@ -65,6 +65,7 @@ func resourceK8sWgCreate(ctx context.Context, d *schema.ResourceData, m interfac WorkerRAM: uint64(d.Get("ram").(int)), WorkerSEPID: uint64(d.Get("worker_sep_id").(int)), WorkerSEPPool: d.Get("worker_sep_pool").(string), + Chipset: d.Get("chipset").(string), } if d.Get("disk") == nil { @@ -187,6 +188,7 @@ func resourceK8sWgUpdate(ctx context.Context, d *schema.ResourceData, m interfac K8SID: uint64(d.Get("k8s_id").(int)), WorkersGroupID: wg.ID, Num: uint64(newNum) - wg.Num, + Chipset: d.Get("chipset").(string), } _, err := c.CloudBroker().K8S().WorkerAdd(ctx, req) diff --git a/internal/service/cloudbroker/k8s/schema.go b/internal/service/cloudbroker/k8s/schema.go index 6c31296..ce9c1be 100644 --- a/internal/service/cloudbroker/k8s/schema.go +++ b/internal/service/cloudbroker/k8s/schema.go @@ -1439,6 +1439,11 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema { Optional: true, Description: "insert ssl certificate in x509 pem format", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, "lb_sysctl_params": { Type: schema.TypeList, Optional: true, @@ -1771,6 +1776,11 @@ func resourceK8sWgSchemaMake() map[string]*schema.Schema { ), Description: "Node RAM in MB.", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Description: "Type of the emulated system.", + }, "disk": { Type: schema.TypeInt, Optional: true, diff --git a/internal/service/cloudbroker/kvmvm/data_source_compute.go b/internal/service/cloudbroker/kvmvm/data_source_compute.go index 05cb415..1e74118 100644 --- a/internal/service/cloudbroker/kvmvm/data_source_compute.go +++ b/internal/service/cloudbroker/kvmvm/data_source_compute.go @@ -39,7 +39,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) func dataSourceComputeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { diff --git a/internal/service/cloudbroker/kvmvm/flattens.go b/internal/service/cloudbroker/kvmvm/flattens.go index 39a5aea..b28e385 100644 --- a/internal/service/cloudbroker/kvmvm/flattens.go +++ b/internal/service/cloudbroker/kvmvm/flattens.go @@ -38,6 +38,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p d.Set("boot_disk_id", bootDisk.ID) // we intentionally use the SizeMax field, do not change it until the BootDiskSize field is fixed on the platform d.Set("boot_disk_size", bootDisk.SizeMax) + d.Set("chipset", computeRec.Chipset) d.Set("cd_image_id", computeRec.CdImageId) d.Set("clone_reference", computeRec.CloneReference) d.Set("clones", computeRec.Clones) @@ -156,31 +157,49 @@ func flattenInterfaces(ifaces compute.ListInterfaces) []map[string]interface{} { for _, iface := range ifaces { res = append(res, map[string]interface{}{ - "conn_id": iface.ConnID, - "conn_type": iface.ConnType, - "def_gw": iface.DefGW, - "enabled": iface.Enabled, - "flip_group_id": iface.FLIPGroupID, - "guid": iface.GUID, - "ip_address": iface.IPAddress, - "listen_ssh": iface.ListenSSH, - "mac": iface.MAC, - "name": iface.Name, - "net_id": iface.NetID, - "netmask": iface.NetMask, - "net_type": iface.NetType, - "node_id": iface.NodeID, - "pci_slot": iface.PCISlot, - "qos": flattenQOS(iface.QOS), - "target": iface.Target, - "type": iface.Type, - "vnfs": iface.VNFs, + "bus_number": iface.BusNumber, + "conn_id": iface.ConnID, + "conn_type": iface.ConnType, + "def_gw": iface.DefGW, + "enabled": iface.Enabled, + "flip_group_id": iface.FLIPGroupID, + "guid": iface.GUID, + "ip_address": iface.IPAddress, + "listen_ssh": iface.ListenSSH, + "mac": iface.MAC, + "mtu": iface.MTU, + "name": iface.Name, + "net_id": iface.NetID, + "netmask": iface.NetMask, + "net_type": iface.NetType, + "node_id": iface.NodeID, + "pci_slot": iface.PCISlot, + "qos": flattenQOS(iface.QOS), + "target": iface.Target, + "type": iface.Type, + "vnfs": iface.VNFs, + "libvirt_settings": flattenLibvirtSettings(iface.LibvirtSettings), }) } return res } +func flattenLibvirtSettings(libvirtSettings compute.LibvirtSettings) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "guid": libvirtSettings.GUID, + "txmode": libvirtSettings.TXMode, + "ioeventfd": libvirtSettings.IOEventFD, + "event_idx": libvirtSettings.EventIDx, + "queues": libvirtSettings.Queues, + "rx_queue_size": libvirtSettings.RXQueueSize, + "tx_queue_size": libvirtSettings.TXQueueSize, + } + res = append(res, temp) + return res +} + func flattenQOS(qos compute.QOS) []map[string]interface{} { return []map[string]interface{}{ { @@ -275,6 +294,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} "affinity_weight": computeItem.AffinityWeight, "anti_affinity_rules": flattenListRules(computeItem.AntiAffinityRules), "arch": computeItem.Arch, + "chipset": computeItem.Chipset, "cd_image_id": computeItem.CdImageId, "boot_order": computeItem.BootOrder, "bootdisk_size": computeItem.BootDiskSize, @@ -406,8 +426,9 @@ func flattenDisks(disks []compute.InfoDisk) []map[string]interface{} { res := make([]map[string]interface{}, 0) for _, disk := range disks { temp := map[string]interface{}{ - "disk_id": disk.ID, - "pci_slot": disk.PCISlot, + "bus_number": disk.BusNumber, + "disk_id": disk.ID, + "pci_slot": disk.PCISlot, } res = append(res, temp) } @@ -593,6 +614,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute d.Set("anti_affinity_rules", flattenAffinityRules(compFacts.AntiAffinityRules)) d.Set("arch", compFacts.Arch) d.Set("boot_order", compFacts.BootOrder) + d.Set("chipset", compFacts.Chipset) d.Set("cd_image_id", compFacts.CdImageId) d.Set("clone_reference", compFacts.CloneReference) d.Set("clones", compFacts.Clones) @@ -708,6 +730,7 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} { "meta": flattens.FlattenMeta(disk.Meta), "account_id": disk.AccountID, "boot_partition": disk.BootPartition, + "bus_number": disk.BusNumber, "created_time": disk.CreatedTime, "deleted_time": disk.DeletedTime, "desc": disk.Description, diff --git a/internal/service/cloudbroker/kvmvm/resource_check_input_values.go b/internal/service/cloudbroker/kvmvm/resource_check_input_values.go index d373b77..b3ba89e 100644 --- a/internal/service/cloudbroker/kvmvm/resource_check_input_values.go +++ b/internal/service/cloudbroker/kvmvm/resource_check_input_values.go @@ -2,7 +2,6 @@ package kvmvm import ( "context" - "errors" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -37,7 +36,7 @@ func checkParamsExistence(ctx context.Context, d *schema.ResourceData, c *contro func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) []error { var errs []error - var vinsIds, extNetIds, vfpoolIds []uint64 + var vinsIds, extNetIds, vfpoolIds, dpdkIds []uint64 networksIface, ok := d.GetOk("network") if !ok { @@ -54,10 +53,9 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co case "EXTNET": extNetIds = append(extNetIds, uint64(network["net_id"].(int))) case "VFNIC": - if d.Get("driver").(string) == "KVM_PPC" { - errs = append(errs, errors.New("'VFNIC' net_type is not allowed for driver 'KVM_PPC'")) - } vfpoolIds = append(vfpoolIds, uint64(network["net_id"].(int))) + case "DPDK": + dpdkIds = append(dpdkIds, uint64(network["net_id"].(int))) default: continue } @@ -75,5 +73,9 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co errs = append(errs, vfpoolErrs...) } + if dpdkErrs := ic.ExistDPDKNet(ctx, dpdkIds, c); dpdkErrs != nil { + errs = append(errs, dpdkErrs...) + } + return errs } diff --git a/internal/service/cloudbroker/kvmvm/resource_compute.go b/internal/service/cloudbroker/kvmvm/resource_compute.go index 6780fee..4007a8a 100644 --- a/internal/service/cloudbroker/kvmvm/resource_compute.go +++ b/internal/service/cloudbroker/kvmvm/resource_compute.go @@ -42,7 +42,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" log "github.com/sirupsen/logrus" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute" - "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/kvmppc" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/kvmx86" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" @@ -55,59 +54,48 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf c := m.(*controller.ControllerCfg) createReqX86 := kvmx86.CreateRequest{} - createReqPPC := kvmppc.CreateRequest{} if diags := checkParamsExistence(ctx, d, c); diags != nil { return diags } if desc, ok := d.GetOk("description"); ok { - createReqPPC.Description = desc.(string) createReqX86.Description = desc.(string) } if sepID, ok := d.GetOk("sep_id"); ok { - createReqPPC.SEPID = uint64(sepID.(int)) createReqX86.SEPID = uint64(sepID.(int)) } if pool, ok := d.GetOk("pool"); ok { - createReqPPC.Pool = pool.(string) createReqX86.Pool = pool.(string) } if stackID, ok := d.GetOk("stack_id"); ok { - createReqPPC.StackID = uint64(stackID.(int)) createReqX86.StackID = uint64(stackID.(int)) } if start, ok := d.GetOk("started"); ok { - createReqPPC.Start = start.(bool) createReqX86.Start = start.(bool) } if ipaType, ok := d.GetOk("ipa_type"); ok { - createReqPPC.IPAType = ipaType.(string) createReqX86.IPAType = ipaType.(string) } if bootSize, ok := d.GetOk("boot_disk_size"); ok { - createReqPPC.BootDisk = uint64(bootSize.(int)) createReqX86.BootDisk = uint64(bootSize.(int)) } if IS, ok := d.GetOk("is"); ok { - createReqPPC.IS = IS.(string) createReqX86.IS = IS.(string) } createReqX86.Interfaces = make([]kvmx86.Interface, 0) - createReqPPC.Interfaces = make([]kvmppc.Interface, 0) if networks, ok := d.GetOk("network"); ok { if networks.(*schema.Set).Len() > 0 { ns := networks.(*schema.Set).List() - log.Debugf("BEFORE SORT %v", ns) sort.Slice(ns, func(i, j int) bool { weightI := ns[i].(map[string]interface{})["weight"].(int) weightJ := ns[j].(map[string]interface{})["weight"].(int) @@ -119,9 +107,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf } return weightI < weightJ }) - log.Debugf("AFTER SORT %v", ns) interfacesX86 := make([]kvmx86.Interface, 0) - interfacesPPC := make([]kvmppc.Interface, 0) for _, elem := range ns { netInterfaceVal := elem.(map[string]interface{}) @@ -139,28 +125,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf } createReqX86.Interfaces = interfacesX86 - for _, elem := range ns { - netInterfaceVal := elem.(map[string]interface{}) - reqInterface := kvmppc.Interface{ - NetType: netInterfaceVal["net_type"].(string), - NetID: uint64(netInterfaceVal["net_id"].(int)), - } - - ipaddr, ipSet := netInterfaceVal["ip_address"] - if ipSet { - reqInterface.IPAddr = ipaddr.(string) - } - - interfacesPPC = append(interfacesPPC, reqInterface) - } - createReqPPC.Interfaces = interfacesPPC - } } if disks, ok := d.GetOk("disks"); ok { disksX86 := make([]kvmx86.DataDisk, 0) - disksPPC := make([]kvmppc.DataDisk, 0) for _, elem := range disks.([]interface{}) { diskVal := elem.(map[string]interface{}) @@ -185,96 +154,58 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf createReqX86.DataDisks = disksX86 - for _, elem := range disks.([]interface{}) { - diskVal := elem.(map[string]interface{}) - reqDataDisk := kvmppc.DataDisk{ - DiskName: diskVal["disk_name"].(string), - Size: uint64(diskVal["size"].(int)), - } - if sepId, ok := diskVal["sep_id"]; ok { - reqDataDisk.SepID = uint64(sepId.(int)) - } - if pool, ok := diskVal["pool"]; ok { - reqDataDisk.Pool = pool.(string) - } - if desc, ok := diskVal["desc"]; ok { - reqDataDisk.Description = desc.(string) - } - if imageID, ok := diskVal["image_id"]; ok { - reqDataDisk.ImageID = uint64(imageID.(int)) - } - disksPPC = append(disksPPC, reqDataDisk) - } - - createReqPPC.DataDisks = disksPPC } if cloudInit, ok := d.GetOk("cloud_init"); ok { userdata := cloudInit.(string) if userdata != "" && userdata != "applied" { - createReqPPC.Userdata = strings.TrimSpace(userdata) createReqX86.Userdata = strings.TrimSpace(userdata) } } var computeId uint64 driver := d.Get("driver").(string) - if driver == "KVM_PPC" { - createReqPPC.RGID = uint64(d.Get("rg_id").(int)) - createReqPPC.Name = d.Get("name").(string) - createReqPPC.CPU = uint64(d.Get("cpu").(int)) - createReqPPC.RAM = uint64(d.Get("ram").(int)) - createReqPPC.ImageID = uint64(d.Get("image_id").(int)) - - log.Debugf("resourceComputeCreate: creating Compute of type KVM VM PowerPC") - apiResp, err := c.CloudBroker().KVMPPC().Create(ctx, createReqPPC) - if err != nil { - return diag.FromErr(err) - } - d.SetId(strconv.FormatUint(apiResp, 10)) - computeId = apiResp - } else { - createReqX86.RGID = uint64(d.Get("rg_id").(int)) - createReqX86.Name = d.Get("name").(string) - createReqX86.CPU = uint64(d.Get("cpu").(int)) - createReqX86.RAM = uint64(d.Get("ram").(int)) + createReqX86.RGID = uint64(d.Get("rg_id").(int)) + createReqX86.Name = d.Get("name").(string) + createReqX86.CPU = uint64(d.Get("cpu").(int)) + createReqX86.RAM = uint64(d.Get("ram").(int)) - if image, ok := d.GetOk("image_id"); ok { - createReqX86.ImageID = uint64(image.(int)) - } - if withoutBootDisk, ok := d.GetOk("without_boot_disk"); ok { - createReqX86.WithoutBootDisk = withoutBootDisk.(bool) - } + if image, ok := d.GetOk("image_id"); ok { + createReqX86.ImageID = uint64(image.(int)) + } + if withoutBootDisk, ok := d.GetOk("without_boot_disk"); ok { + createReqX86.WithoutBootDisk = withoutBootDisk.(bool) + } - createReqX86.Driver = driver + createReqX86.Driver = driver - if custom_fields, ok := d.GetOk("custom_fields"); ok { - val := custom_fields.(string) - val = strings.ReplaceAll(val, "\\", "") - val = strings.ReplaceAll(val, "\n", "") - val = strings.ReplaceAll(val, "\t", "") - val = strings.TrimSpace(val) + if custom_fields, ok := d.GetOk("custom_fields"); ok { + val := custom_fields.(string) + val = strings.ReplaceAll(val, "\\", "") + val = strings.ReplaceAll(val, "\n", "") + val = strings.ReplaceAll(val, "\t", "") + val = strings.TrimSpace(val) - createReqX86.CustomField = val - } - - if numaAffinity, ok := d.GetOk("numa_affinity"); ok { - createReqX86.NumaAffinity = numaAffinity.(string) - } - createReqX86.CPUPin = d.Get("cpu_pin").(bool) - createReqX86.HPBacked = d.Get("hp_backed").(bool) + createReqX86.CustomField = val + } - log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") - apiResp, err := c.CloudBroker().KVMX86().Create(ctx, createReqX86) - if err != nil { - return diag.FromErr(err) - } + if numaAffinity, ok := d.GetOk("numa_affinity"); ok { + createReqX86.NumaAffinity = numaAffinity.(string) + } + createReqX86.CPUPin = d.Get("cpu_pin").(bool) + createReqX86.HPBacked = d.Get("hp_backed").(bool) + createReqX86.Chipset = d.Get("chipset").(string) - d.SetId(strconv.FormatUint(apiResp, 10)) - computeId = apiResp + log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") + apiResp, err := c.CloudBroker().KVMX86().Create(ctx, createReqX86) + if err != nil { + return diag.FromErr(err) } + d.SetId(strconv.FormatUint(apiResp, 10)) + computeId = apiResp + warnings := dc.Warnings{} cleanup := false @@ -285,9 +216,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf Permanently: true, DetachDisks: true, } - if reason, ok := d.Get("reason").(string); ok { - req.Reason = reason - } + if _, err := c.CloudBroker().Compute().Delete(ctx, req); err != nil { log.Errorf("resourceComputeCreate: could not delete compute after failed creation: %v", err) } @@ -439,9 +368,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf if int64(pfwItem["public_port_end"].(int)) != 0 { req.PublicPortEnd = int64(pfwItem["public_port_end"].(int)) } - if pfwItem["reason"].(string) != "" { - req.Reason = pfwItem["reason"].(string) - } + pwfId, err := c.CloudBroker().Compute().PFWAdd(ctx, req) if err != nil { warnings.Add(err) @@ -499,9 +426,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf ComputeID: computeId, CDROMID: uint64(snapshotItem["cdrom_id"].(int)), } - if snapshotItem["reason"].(string) != "" { - req.Reason = snapshotItem["reason"].(string) - } + _, err := c.CloudBroker().Compute().CDInsert(ctx, req) if err != nil { warnings.Add(err) @@ -560,6 +485,31 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf } } } + + if ars, ok := d.GetOk("libvirt_settings"); ok { + log.Debugf("resourceComputeCreate: Configure libvirt virtio interface parameters on ComputeID: %d", computeId) + settings := ars.(*schema.Set).List() + if len(settings) > 0 { + for _, v := range settings { + settingsConv := v.(map[string]interface{}) + req := compute.SetNetConfigRequest{ + ComputeID: computeId, + MAC: settingsConv["mac"].(string), + TXMode: settingsConv["txmode"].(string), + IOEventFD: settingsConv["ioeventfd"].(string), + EventIDx: settingsConv["event_idx"].(string), + Queues: uint64(settingsConv["queues"].(int)), + RXQueueSize: uint64(settingsConv["rx_queue_size"].(int)), + TXQueueSize: uint64(settingsConv["tx_queue_size"].(int)), + } + + _, err := c.CloudBroker().Compute().SetNetConfig(ctx, req) + if err != nil { + warnings.Add(err) + } + } + } + } } log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string)) @@ -823,6 +773,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf } } + if d.HasChange("libvirt_settings") { + if err := utilityComputeUpdateLibvirtSettings(ctx, d, m); err != nil { + return diag.FromErr(err) + } + } + return append(resourceComputeRead(ctx, d, m), warnings.Get()...) } diff --git a/internal/service/cloudbroker/kvmvm/schema.go b/internal/service/cloudbroker/kvmvm/schema.go index 2463ac9..a0be1a4 100644 --- a/internal/service/cloudbroker/kvmvm/schema.go +++ b/internal/service/cloudbroker/kvmvm/schema.go @@ -15,11 +15,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Required: true, Description: "Get compute by id", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, "account_id": { Type: schema.TypeInt, @@ -146,6 +141,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, }, }, + "chipset": { + Type: schema.TypeString, + Computed: true, + }, "cd_image_id": { Type: schema.TypeInt, Computed: true, @@ -225,6 +224,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "created_time": { Type: schema.TypeInt, Computed: true, @@ -554,6 +557,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "conn_id": { Type: schema.TypeInt, Computed: true, @@ -590,6 +597,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + }, "name": { Type: schema.TypeString, Computed: true, @@ -614,6 +625,7 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "qos": { Type: schema.TypeList, Computed: true, @@ -638,6 +650,42 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { }, }, }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "target": { Type: schema.TypeString, Computed: true, @@ -932,6 +980,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Find by IP address", }, + "stack_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by stack ID", + }, + "image_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by image ID", + }, "extnet_name": { Type: schema.TypeString, Optional: true, @@ -1098,6 +1156,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "chipset": { + Type: schema.TypeString, + Computed: true, + }, "cd_image_id": { Type: schema.TypeInt, Computed: true, @@ -1158,6 +1220,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "disk_id": { Type: schema.TypeInt, Computed: true, @@ -1198,6 +1264,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "conn_id": { Type: schema.TypeInt, Computed: true, @@ -1234,6 +1304,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + }, "name": { Type: schema.TypeString, Computed: true, @@ -1282,6 +1356,42 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { }, }, }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "target": { Type: schema.TypeString, Computed: true, @@ -2153,10 +2263,6 @@ func dataSourceComputeGetAuditsSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, "items": { Type: schema.TypeList, @@ -2196,10 +2302,6 @@ func dataSourceComputePfwListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, "items": { Type: schema.TypeList, @@ -2792,7 +2894,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Required: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86", "KVM_PPC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating Description: "Hardware architecture of this compute instance.", }, "cpu": { @@ -2815,6 +2917,12 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Optional: true, Description: "ID of the OS image to base this compute instance on.", }, + "chipset": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Type of the emulated system.", + }, "without_boot_disk": { Type: schema.TypeBool, Optional: true, @@ -2900,7 +3008,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Required: true, StateFunc: statefuncs.StateFuncToUpper, - ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC"}, false), // observe case while validating + ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK"}, false), // observe case while validating Description: "Type of the network for this connection, either EXTNET or VINS.", }, @@ -2934,11 +3042,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { }, Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, + "affinity_label": { Type: schema.TypeString, Optional: true, @@ -2981,6 +3085,11 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { }, }, }, + "delete_async_mode": { + Type: schema.TypeBool, + Computed: true, + Description: "async mode", + }, "anti_affinity_rules": { Type: schema.TypeList, Optional: true, @@ -3092,11 +3201,6 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, }, }, }, @@ -3152,11 +3256,6 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, }, }, }, @@ -3211,11 +3310,6 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, }, }, }, @@ -3317,6 +3411,43 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { }, Description: "ID of the connected pci devices", }, + "libvirt_settings": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "mac": { + Type: schema.TypeString, + Required: true, + }, + "txmode": { + Type: schema.TypeString, + Optional: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Optional: true, + }, + "event_idx": { + Type: schema.TypeString, + Optional: true, + }, + "queues": { + Type: schema.TypeInt, + Optional: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Optional: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Optional: true, + }, + }, + }, + Description: "Configure libvirt virtio interface parameters. You can only delete values locally. Data on the platform cannot be deleted.", + }, // Computed properties "account_id": { Type: schema.TypeInt, @@ -3436,6 +3567,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "conn_id": { Type: schema.TypeInt, Computed: true, @@ -3472,6 +3607,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + }, "name": { Type: schema.TypeString, Computed: true, @@ -3520,6 +3659,42 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { }, }, }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "target": { Type: schema.TypeString, Computed: true, diff --git a/internal/service/cloudbroker/kvmvm/utility_compute.go b/internal/service/cloudbroker/kvmvm/utility_compute.go index 6577e49..538011f 100644 --- a/internal/service/cloudbroker/kvmvm/utility_compute.go +++ b/internal/service/cloudbroker/kvmvm/utility_compute.go @@ -532,10 +532,6 @@ func utilityComputeCheckPresence(ctx context.Context, d *schema.ResourceData, m req.ComputeID = uint64(d.Get("compute_id").(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - res, err := c.CloudBroker().Compute().Get(ctx, req) if err != nil { return nil, err @@ -586,13 +582,16 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData oldSet, newSet := d.GetChange("network") + oldList := oldSet.(*schema.Set).List() + newList := newSet.(*schema.Set).List() + + detachMap, changeIpMap, attachMap := differenceNetwork(oldList, newList) + apiErrCount := 0 var lastSavedError error - detachSet := oldSet.(*schema.Set).Difference(newSet.(*schema.Set)) - log.Debugf("utilityComputeNetworksConfigure: detach set has %d items for Compute ID %s", detachSet.Len(), d.Id()) - for _, runner := range detachSet.List() { - netData := runner.(map[string]interface{}) + log.Debugf("utilityComputeNetworksConfigure: detach set has %d items for Compute ID %s", len(detachMap), d.Id()) + for _, netData := range detachMap { computeId, _ := strconv.ParseUint(d.Id(), 10, 64) req := compute.NetDetachRequest{ ComputeID: computeId, @@ -609,21 +608,40 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData } } + log.Debugf("utilityComputeNetworksConfigure: changeIp set has %d items for Compute ID %s", len(changeIpMap), d.Id()) + for _, netData := range changeIpMap { + computeId, _ := strconv.ParseUint(d.Id(), 10, 64) + req := compute.ChangeIPRequest{ + ComputeID: computeId, + NetType: netData["net_type"].(string), + NetID: uint64(netData["net_id"].(int)), + IPAddr: netData["ip_address"].(string), + } + + _, err := c.CloudBroker().Compute().ChangeIP(ctx, req) + if err != nil { + log.Errorf("utilityComputeNetworksConfigure: failed to change net ID %d of type %s from Compute ID %s: %s", + netData["net_id"].(int), netData["net_type"].(string), d.Id(), err) + apiErrCount++ + lastSavedError = err + } + } + needStart := false - if d.Get("network").(*schema.Set).Len() == 1 || oldSet.(*schema.Set).Len() < 1 { + if oldSet.(*schema.Set).Len() == len(detachMap) || oldSet.(*schema.Set).Len() == 0 { if err := utilityComputeStop(ctx, d, m); err != nil { apiErrCount++ lastSavedError = err } - needStart = true + if start := d.Get("started"); start.(bool) { + needStart = true + } } - attachSet := newSet.(*schema.Set).Difference(oldSet.(*schema.Set)) - attachList := attachSet.List() - sort.Slice(attachList, func(i, j int) bool { - weightI := attachList[i].(map[string]interface{})["weight"].(int) - weightJ := attachList[j].(map[string]interface{})["weight"].(int) + sort.Slice(attachMap, func(i, j int) bool { + weightI := attachMap[i]["weight"].(int) + weightJ := attachMap[j]["weight"].(int) if weightI == 0 { return false } @@ -632,9 +650,8 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData } return weightI < weightJ }) - log.Debugf("utilityComputeNetworksConfigure: attach set has %d items for Compute ID %s", attachSet.Len(), d.Id()) - for _, runner := range attachList { - netData := runner.(map[string]interface{}) + log.Debugf("utilityComputeNetworksConfigure: attach set has %d items for Compute ID %s", len(attachMap), d.Id()) + for _, netData := range attachMap { computeId, _ := strconv.ParseUint(d.Id(), 10, 64) req := compute.NetAttachRequest{ ComputeID: computeId, @@ -672,6 +689,53 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData return nil } +func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, attachMap []map[string]interface{}) { + attachMap = make([]map[string]interface{}, 0) + changeIpMap = make([]map[string]interface{}, 0) + detachMap = make([]map[string]interface{}, 0) + for _, oldNetwork := range oldList { + oldMap := oldNetwork.(map[string]interface{}) + found := false + for _, newNetwork := range newList { + newMap := newNetwork.(map[string]interface{}) + if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] { + if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && newMap["ip_address"] != oldMap["ip_address"] { + changeIpMap = append(changeIpMap, newMap) + found = true + break + } else if newMap["ip_address"] == oldMap["ip_address"] { + found = true + break + } + } + } + if found { + continue + } + detachMap = append(detachMap, oldMap) + } + + for _, newNetwork := range newList { + newMap := newNetwork.(map[string]interface{}) + found := false + for _, oldNetwork := range oldList { + oldMap := oldNetwork.(map[string]interface{}) + if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] { + if newMap["ip_address"] == oldMap["ip_address"] || ((newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && newMap["ip_address"] != oldMap["ip_address"]) { + found = true + break + } + } + } + if found { + continue + } + attachMap = append(attachMap, newMap) + } + + return +} + func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) error { c := m.(*controller.ControllerCfg) @@ -697,6 +761,10 @@ func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interfa req.HPBacked = d.Get("hp_backed").(bool) } + if d.HasChange("chipset") { + req.Chipset = d.Get("chipset").(string) + } + // Note bene: numa_affinity, cpu_pin and hp_backed are not allowed to be changed for compute in STARTED tech status. // If STARTED, we need to stop it before update var isStopRequired bool @@ -947,6 +1015,36 @@ func utilityComputeUpdatePciDevices(ctx context.Context, d *schema.ResourceData, return nil } +func utilityComputeUpdateLibvirtSettings(ctx context.Context, d *schema.ResourceData, m interface{}) error { + c := m.(*controller.ControllerCfg) + computeId, _ := strconv.ParseUint(d.Id(), 10, 64) + oldSet, newSet := d.GetChange("libvirt_settings") + + added := (newSet.(*schema.Set).Difference(oldSet.(*schema.Set))).List() + if len(added) > 0 { + for _, v := range added { + settingsConv := v.(map[string]interface{}) + req := compute.SetNetConfigRequest{ + ComputeID: computeId, + MAC: settingsConv["mac"].(string), + TXMode: settingsConv["txmode"].(string), + IOEventFD: settingsConv["ioeventfd"].(string), + EventIDx: settingsConv["event_idx"].(string), + Queues: uint64(settingsConv["queues"].(int)), + RXQueueSize: uint64(settingsConv["rx_queue_size"].(int)), + TXQueueSize: uint64(settingsConv["tx_queue_size"].(int)), + } + + _, err := c.CloudBroker().Compute().SetNetConfig(ctx, req) + if err != nil { + return err + } + } + } + + return nil +} + func utilityComputeUpdateTags(ctx context.Context, d *schema.ResourceData, m interface{}) error { c := m.(*controller.ControllerCfg) @@ -1013,9 +1111,6 @@ func utilityComputeUpdatePFW(ctx context.Context, d *schema.ResourceData, m inte } else { req.PublicPortEnd = uint64(pfwItem["public_port_end"].(int)) } - if pfwItem["reason"].(string) != "" { - req.Reason = pfwItem["reason"].(string) - } _, err := c.CloudBroker().Compute().PFWDel(ctx, req) if err != nil { @@ -1037,9 +1132,6 @@ func utilityComputeUpdatePFW(ctx context.Context, d *schema.ResourceData, m inte if pfwItem["local_port"].(int) != 0 { req.LocalBasePort = uint64(pfwItem["local_port"].(int)) } - if pfwItem["reason"].(string) != "" { - req.Reason = pfwItem["reason"].(string) - } pwfId, err := c.CloudBroker().Compute().PFWAdd(ctx, req) if err != nil { @@ -1136,9 +1228,17 @@ func utilityComputeUpdateSnapshot(ctx context.Context, d *schema.ResourceData, m Label: snapshotItem["label"].(string), } - _, err := c.CloudBroker().Compute().SnapshotDelete(ctx, req) - if err != nil { - return err + asyncMode, ok := d.GetOk("snapshot_delete_async") + if ok && asyncMode.(bool) { + _, err := c.CloudBroker().Compute().SnapshotDeleteAsync(ctx, req) + if err != nil { + return err + } + } else { + _, err := c.CloudBroker().Compute().SnapshotDelete(ctx, req) + if err != nil { + return err + } } } } @@ -1218,9 +1318,6 @@ func utilityComputeUpdateCD(ctx context.Context, d *schema.ResourceData, m inter req := compute.CDEjectRequest{ ComputeID: computeId, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().Compute().CDEject(ctx, req) if err != nil { @@ -1235,9 +1332,6 @@ func utilityComputeUpdateCD(ctx context.Context, d *schema.ResourceData, m inter ComputeID: computeId, CDROMID: uint64(cdItem["cdrom_id"].(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().Compute().CDInsert(ctx, req) if err != nil { diff --git a/internal/service/cloudbroker/kvmvm/utility_compute_get_audits.go b/internal/service/cloudbroker/kvmvm/utility_compute_get_audits.go index 82325f6..4fe73ef 100644 --- a/internal/service/cloudbroker/kvmvm/utility_compute_get_audits.go +++ b/internal/service/cloudbroker/kvmvm/utility_compute_get_audits.go @@ -46,10 +46,6 @@ func utilityComputeGetAuditsCheckPresence(ctx context.Context, d *schema.Resourc ComputeID: uint64(d.Get("compute_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - computeAudits, err := c.CloudBroker().Compute().GetAudits(ctx, req) if err != nil { return nil, err diff --git a/internal/service/cloudbroker/kvmvm/utility_compute_list.go b/internal/service/cloudbroker/kvmvm/utility_compute_list.go index c33acc0..0a15535 100644 --- a/internal/service/cloudbroker/kvmvm/utility_compute_list.go +++ b/internal/service/cloudbroker/kvmvm/utility_compute_list.go @@ -69,6 +69,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource if ipAddress, ok := d.GetOk("ip_address"); ok { req.IPAddress = ipAddress.(string) } + if stackID, ok := d.GetOk("stack_id"); ok { + req.StackID = stackID.(uint64) + } + if imageID, ok := d.GetOk("image_id"); ok { + req.ImageID = imageID.(uint64) + } if extNetName, ok := d.GetOk("extnet_name"); ok { req.ExtNetName = extNetName.(string) } diff --git a/internal/service/cloudbroker/kvmvm/utility_compute_pfw_list.go b/internal/service/cloudbroker/kvmvm/utility_compute_pfw_list.go index 1eaf0a6..0579a25 100644 --- a/internal/service/cloudbroker/kvmvm/utility_compute_pfw_list.go +++ b/internal/service/cloudbroker/kvmvm/utility_compute_pfw_list.go @@ -46,10 +46,6 @@ func utilityComputePfwListCheckPresence(ctx context.Context, d *schema.ResourceD ComputeID: uint64(d.Get("compute_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - listPFWs, err := c.CloudBroker().Compute().PFWList(ctx, req) if err != nil { return nil, err diff --git a/internal/service/cloudbroker/lb/resource_lb.go b/internal/service/cloudbroker/lb/resource_lb.go index ce52403..320d2a7 100644 --- a/internal/service/cloudbroker/lb/resource_lb.go +++ b/internal/service/cloudbroker/lb/resource_lb.go @@ -58,7 +58,7 @@ func resourceLBCreate(ctx context.Context, d *schema.ResourceData, m interface{} req := lb.CreateRequest{ Name: d.Get("name").(string), RGID: uint64(d.Get("rg_id").(int)), - ExtNetID: uint64(d.Get("extnet_id").(int)), + ExtNetID: int64(d.Get("extnet_id").(int)), VINSID: uint64(d.Get("vins_id").(int)), } if start, ok := d.GetOk("start"); ok { diff --git a/internal/service/cloudbroker/rg/flattens.go b/internal/service/cloudbroker/rg/flattens.go index c3150de..0488764 100644 --- a/internal/service/cloudbroker/rg/flattens.go +++ b/internal/service/cloudbroker/rg/flattens.go @@ -475,7 +475,6 @@ func flattenResourceRG(d *schema.ResourceData, rgData *rg.RecordRG) { d.Set("gid", rgData.GID) d.Set("rg_name", rgData.Name) d.Set("resource_limits", flattenRgResourceLimits(rgData.ResourceLimits)) - d.Set("def_net_type", rgData.DefNetType) d.Set("description", rgData.Description) d.Set("register_computes", rgData.RegisterComputes) d.Set("uniq_pools", rgData.UniqPools) diff --git a/internal/service/cloudbroker/rg/models.go b/internal/service/cloudbroker/rg/models.go index 49d6a1c..33855ba 100644 --- a/internal/service/cloudbroker/rg/models.go +++ b/internal/service/cloudbroker/rg/models.go @@ -77,7 +77,6 @@ type ResgroupUpdateParam struct { Disk int `json:"maxVDiskCapacity"` Cpu int `json:"maxCPUCapacity"` NetTraffic int `json:"maxNetworkPeerTransfer"` - Reason string `json:"reason"` } type AccountAclRecord struct { diff --git a/internal/service/cloudbroker/rg/resource_rg.go b/internal/service/cloudbroker/rg/resource_rg.go index 68991ed..8acf2c5 100644 --- a/internal/service/cloudbroker/rg/resource_rg.go +++ b/internal/service/cloudbroker/rg/resource_rg.go @@ -117,18 +117,10 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter req.DefNet = defNetType.(string) } - if ipcidr, ok := d.GetOk("ipcidr"); ok { - req.IPCIDR = ipcidr.(string) - } - if description, ok := d.GetOk("description"); ok { req.Description = description.(string) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - if extNetId, ok := d.GetOk("ext_net_id"); ok { req.ExtNetID = uint64(extNetId.(int)) } @@ -211,7 +203,6 @@ func resourceResgroupRead(ctx context.Context, d *schema.ResourceData, m interfa d.Get("rg_name").(string), d.Get("account_id").(int)) //c := m.(*controller.ControllerCfg) - rgData, err := utilityResgroupCheckPresence(ctx, d, m) if err != nil { d.SetId("") // ensure ID is empty @@ -301,8 +292,7 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter restore, ok := d.GetOk("restore") if ok && restore.(bool) { restoreReq := rg.RestoreRequest{ - RGID: rgData.ID, - Reason: "automatic restore of resource by terraform", + RGID: rgData.ID, } _, err := c.CloudBroker().RG().Restore(ctx, restoreReq) @@ -316,8 +306,7 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter enable, ok := d.GetOk("enable") if ok && enable.(bool) { enableReq := rg.EnableRequest{ - RGID: rgData.ID, - Reason: "automatic enable of resource by terraform", + RGID: rgData.ID, } _, err = c.CloudBroker().RG().Enable(ctx, enableReq) @@ -349,20 +338,12 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter /* NOTE: we do not allow changing the following attributes of an existing RG via terraform: - def_net_type - - ipcidr - ext_net_id - ext_ip The following code fragment checks if any of these have been changed and generates error. */ - if ok := d.HasChange("def_net"); ok { - _, newDefNet := d.GetChange("def_net") - if newDefNet.(*schema.Set).Len() == 0 { - return diag.Errorf("resourceResgroupUpdate: block def_net must not be empty") - } - } - - for _, attr := range []string{"def_net_type", "ipcidr", "ext_ip"} { + for _, attr := range []string{"def_net_type", "ext_ip"} { attrNew, attrOld := d.GetChange(attr) if attrNew.(string) != attrOld.(string) { return diag.FromErr(fmt.Errorf("resourceResgroupUpdate: RG ID %s: changing %s for existing RG is not allowed", d.Id(), attr)) @@ -444,6 +425,9 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter if d.HasChange("uniq_pools") { uniqPools := d.Get("uniq_pools").([]interface{}) + if len(uniqPools) == 0 { + req.ClearUniqPools = true + } for _, pool := range uniqPools { req.UniqPools = append(req.UniqPools, pool.(string)) } @@ -468,6 +452,13 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter } if d.HasChange("def_net") { + oldDefNet, _ := d.GetChange("def_net") + if oldDefNet.(*schema.Set).Len() > 0 { + _, err := c.CloudBroker().RG().RemoveDefNet(ctx, rg.RemoveDefNetRequest{RGID: rgData.ID}) + if err != nil { + return diag.FromErr(err) + } + } if err := resourceRGSetDefNet(ctx, d, m); err != nil { return diag.FromErr(err) } @@ -520,9 +511,6 @@ func resourceResgroupDelete(ctx context.Context, d *schema.ResourceData, m inter if permanently, ok := d.GetOk("permanently"); ok { req.Permanently = permanently.(bool) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } c := m.(*controller.ControllerCfg) _, err = c.CloudBroker().RG().Delete(ctx, req) @@ -559,10 +547,6 @@ func resourceRGAccessGrant(ctx context.Context, d *schema.ResourceData, m interf Right: right, } - if reason, ok := access["reason"]; ok { - req.Reason = reason.(string) - } - if _, err := c.CloudBroker().RG().AccessGrant(ctx, req); err != nil { errs = append(errs, err) } @@ -593,9 +577,6 @@ func resourceRGSetDefNet(ctx context.Context, d *schema.ResourceData, m interfac if netID, ok := defNetItem["net_id"]; ok { req.NetID = uint64(netID.(int)) } - if reason, ok := defNetItem["reason"]; ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().RG().SetDefNet(ctx, req) return err @@ -651,10 +632,6 @@ func resourceRGChangeAccess(ctx context.Context, d *schema.ResourceData, m inter User: user, } - if reason, ok := deleteItem["reason"]; ok { - reqRevoke.Reason = reason.(string) - } - _, err := c.CloudBroker().RG().AccessRevoke(ctx, reqRevoke) if err != nil { return err @@ -673,10 +650,6 @@ func resourceRGChangeAccess(ctx context.Context, d *schema.ResourceData, m inter Right: right, } - if reason, ok := addedItem["reason"]; ok { - reqGrant.Reason = reason.(string) - } - _, err := c.CloudBroker().RG().AccessGrant(ctx, reqGrant) if err != nil { return err @@ -749,6 +722,17 @@ func ResourceResgroup() *schema.Resource { StateContext: schema.ImportStatePassthroughContext, }, + CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { + if diff.HasChange("def_net") { + diff.SetNewComputed("def_net_id") + } + if diff.HasChanges() { + diff.SetNewComputed("updated_by") + diff.SetNewComputed("updated_time") + } + return nil + }, + Timeouts: &schema.ResourceTimeout{ Create: &constants.Timeout600s, Read: &constants.Timeout300s, diff --git a/internal/service/cloudbroker/rg/schema.go b/internal/service/cloudbroker/rg/schema.go index d58c41b..757ff43 100644 --- a/internal/service/cloudbroker/rg/schema.go +++ b/internal/service/cloudbroker/rg/schema.go @@ -11,10 +11,7 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, + "account_id": { Type: schema.TypeInt, Computed: true, @@ -739,10 +736,6 @@ func dataSourceRgUsageSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Required: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, "cpu": { Type: schema.TypeInt, @@ -2268,7 +2261,6 @@ func resourceRgSchemaMake() map[string]*schema.Schema { "def_net_type": { Type: schema.TypeString, Optional: true, - Computed: true, // Default: "PRIVATE", ValidateFunc: validation.StringInSlice([]string{"PRIVATE", "PUBLIC", "NONE"}, false), Description: "Type of the network, which this resource group will use as default for its computes - PRIVATE or PUBLIC or NONE.", @@ -2287,11 +2279,6 @@ func resourceRgSchemaMake() map[string]*schema.Schema { Description: "User-defined text description of this resource group.", }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, - "ext_net_id": { Type: schema.TypeInt, Optional: true, @@ -2337,11 +2324,6 @@ func resourceRgSchemaMake() map[string]*schema.Schema { Required: true, Description: "Access rights to set, one of 'R', 'RCX' or 'ARCXDU'", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for action", - }, }, }, }, @@ -2364,11 +2346,6 @@ func resourceRgSchemaMake() map[string]*schema.Schema { Default: 0, Description: "Network segment ID. If netType is PUBLIC and netId is 0 then default external network segment will be selected. If netType is PRIVATE and netId=0, the first ViNS defined for this RG will be selected. Otherwise, netId identifies either existing external network segment or ViNS.", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "Reason for action", - }, }, }, }, diff --git a/internal/service/cloudbroker/rg/utility_rg.go b/internal/service/cloudbroker/rg/utility_rg.go index e4743f3..499927b 100644 --- a/internal/service/cloudbroker/rg/utility_rg.go +++ b/internal/service/cloudbroker/rg/utility_rg.go @@ -50,9 +50,6 @@ func utilityResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m } else { req.RGID = uint64(d.Get("rg_id").(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } rgData, err := c.CloudBroker().RG().Get(ctx, req) if err != nil { diff --git a/internal/service/cloudbroker/rg/utility_rg_usage.go b/internal/service/cloudbroker/rg/utility_rg_usage.go index c56ab60..8d7abdc 100644 --- a/internal/service/cloudbroker/rg/utility_rg_usage.go +++ b/internal/service/cloudbroker/rg/utility_rg_usage.go @@ -46,10 +46,6 @@ func utilityDataRgUsageCheckPresence(ctx context.Context, d *schema.ResourceData RGID: uint64(d.Get("rg_id").(int)), } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - usage, err := c.CloudBroker().RG().Usage(ctx, req) if err != nil { return nil, err diff --git a/internal/service/cloudbroker/user/flattens.go b/internal/service/cloudbroker/user/flattens.go index 770c646..459b77e 100644 --- a/internal/service/cloudbroker/user/flattens.go +++ b/internal/service/cloudbroker/user/flattens.go @@ -124,6 +124,7 @@ func flattenUserGetAudits(audits *user.ListAudits) []map[string]interface{} { "response_time": item.ResponseTime, "status_code": item.StatusCode, "time": item.Time, + "guid": item.GUID, } res = append(res, temp) } diff --git a/internal/service/cloudbroker/user/schema.go b/internal/service/cloudbroker/user/schema.go index ba12a80..6898164 100644 --- a/internal/service/cloudbroker/user/schema.go +++ b/internal/service/cloudbroker/user/schema.go @@ -198,6 +198,10 @@ func dataSourceUserGetAuditSchemaMake() map[string]*schema.Schema { Type: schema.TypeFloat, Computed: true, }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, }, }, }, diff --git a/internal/service/cloudbroker/vins/flattens.go b/internal/service/cloudbroker/vins/flattens.go index 637d5be..ed9626f 100644 --- a/internal/service/cloudbroker/vins/flattens.go +++ b/internal/service/cloudbroker/vins/flattens.go @@ -72,6 +72,7 @@ func flattenVins(d *schema.ResourceData, vinsRecord *vins.RecordVINS) { d.Set("vnfs", flattenVinsRecordVNFs(vinsRecord.VNFs)) d.Set("vxlan_id", vinsRecord.VXLANID) d.Set("nat_rule", flattenRuleBlock(vinsRecord.VNFs.NAT.Config.Rules)) + d.Set("computes", flattenComputes(vinsRecord.Computes)) } func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) { @@ -109,6 +110,23 @@ func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) { d.Set("user_managed", vinsRecord.UserManaged) d.Set("vnfs", flattenVinsRecordVNFs(vinsRecord.VNFs)) d.Set("vxlan_id", vinsRecord.VXLANID) + d.Set("computes", flattenComputes(vinsRecord.Computes)) + +} + +func flattenLibvirtSettings(libvirtSettings vins.LibvirtSettings) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "guid": libvirtSettings.GUID, + "txmode": libvirtSettings.TXMode, + "ioeventfd": libvirtSettings.IOEventFD, + "event_idx": libvirtSettings.EventIDx, + "queues": libvirtSettings.Queues, + "rx_queue_size": libvirtSettings.RXQueueSize, + "tx_queue_size": libvirtSettings.TXQueueSize, + } + res = append(res, temp) + return res } func flattenVinsVNFDev(vd vins.VNFDev) []map[string]interface{} { @@ -138,6 +156,18 @@ func flattenVinsVNFDev(vd vins.VNFDev) []map[string]interface{} { return res } +func flattenComputes(computes []vins.Computes) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(computes)) + for _, compute := range computes { + tmp := map[string]interface{}{ + "id": compute.ID, + "name": compute.Name, + } + res = append(res, tmp) + } + return res +} + func flattenVinsRecordVNFs(rv vins.RecordVNFs) []map[string]interface{} { res := make([]map[string]interface{}, 0) temp := map[string]interface{}{ @@ -393,25 +423,28 @@ func flattenVinsListInterfaces(i vins.ListInterfaces) []map[string]interface{} { res := make([]map[string]interface{}, 0, len(i)) for _, v := range i { temp := map[string]interface{}{ - "conn_id": v.ConnID, - "conn_type": v.ConnType, - "def_gw": v.DefGW, - "enabled": v.Enabled, - "flipgroup_id": v.FLIPGroupID, - "guid": v.GUID, - "ip_address": v.IPAddress, - "listen_ssh": v.ListenSSH, - "mac": v.MAC, - "name": v.Name, - "net_id": v.NetID, - "net_mask": v.NetMask, - "net_type": v.NetType, - "node_id": v.NodeID, - "pci_slot": v.PCISlot, - "qos": flattenVinsQOS(v.QOS), - "target": v.Target, - "type": v.Type, - "vnfs": v.VNFs, + "conn_id": v.ConnID, + "conn_type": v.ConnType, + "def_gw": v.DefGW, + "enabled": v.Enabled, + "flipgroup_id": v.FLIPGroupID, + "guid": v.GUID, + "ip_address": v.IPAddress, + "listen_ssh": v.ListenSSH, + "mac": v.MAC, + "mtu": v.MTU, + "name": v.Name, + "net_id": v.NetID, + "net_mask": v.NetMask, + "net_type": v.NetType, + "node_id": v.NodeID, + "pci_slot": v.PCISlot, + "bus_number": v.BusNumber, + "qos": flattenVinsQOS(v.QOS), + "target": v.Target, + "type": v.Type, + "vnfs": v.VNFs, + "libvirt_settings": flattenLibvirtSettings(v.LibvirtSettings), } res = append(res, temp) } diff --git a/internal/service/cloudbroker/vins/resource_utility.go b/internal/service/cloudbroker/vins/resource_utility.go index fd77299..e99d395 100644 --- a/internal/service/cloudbroker/vins/resource_utility.go +++ b/internal/service/cloudbroker/vins/resource_utility.go @@ -64,9 +64,7 @@ func createVinsInAcc(ctx context.Context, d *schema.ResourceData, m interface{}, if preReservationsNum, ok := d.GetOk("pre_reservations_num"); ok { req.PreReservationsNum = uint64(preReservationsNum.(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } + if routesList, ok := d.GetOk("routes"); ok { var routes []vins.Route var route vins.Route @@ -117,9 +115,7 @@ func createVinsInRG(ctx context.Context, d *schema.ResourceData, m interface{}, if preReservationsNum, ok := d.GetOk("pre_reservations_num"); ok { req.PreReservationsNum = uint64(preReservationsNum.(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } + if routesList, ok := d.GetOk("routes"); ok { var routes []vins.Route var route vins.Route diff --git a/internal/service/cloudbroker/vins/resource_vins.go b/internal/service/cloudbroker/vins/resource_vins.go index 9a967a9..c71d1be 100644 --- a/internal/service/cloudbroker/vins/resource_vins.go +++ b/internal/service/cloudbroker/vins/resource_vins.go @@ -343,9 +343,6 @@ func resourceVinsDelete(ctx context.Context, d *schema.ResourceData, m interface if permanently, ok := d.GetOk("permanently"); ok { req.Permanently = permanently.(bool) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } if _, err := c.CloudBroker().VINS().Delete(ctx, req); err != nil { return diag.FromErr(err) @@ -362,9 +359,6 @@ func resourceVinsEnable(ctx context.Context, d *schema.ResourceData, m interface req := vins.EnableRequest{ VINSID: vinsId, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().Enable(ctx, req) return err @@ -376,9 +370,6 @@ func resourceVinsDisable(ctx context.Context, d *schema.ResourceData, m interfac req := vins.DisableRequest{ VINSID: vinsId, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().Disable(ctx, req) return err @@ -390,9 +381,6 @@ func resourceVinsRestore(ctx context.Context, d *schema.ResourceData, m interfac req := vins.RestoreRequest{ VINSID: vinsId, } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().Restore(ctx, req) return err @@ -421,9 +409,6 @@ func resourceVinsIpReserve(ctx context.Context, d *schema.ResourceData, m interf if computeId, ok := ip["compute_id"]; ok { req.ComputeID = uint64(computeId.(int)) } - if reason, ok := ip["reason"]; ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().IPReserve(ctx, req) if err != nil { @@ -459,9 +444,6 @@ func resourceVinsNatRuleAdd(ctx context.Context, d *schema.ResourceData, m inter if proto, ok := natRule["proto"]; ok { req.Proto = proto.(string) } - if reason, ok := natRule["reason"]; ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().NATRuleAdd(ctx, req) if err != nil { @@ -505,10 +487,6 @@ func resourceVinsChangeExtNetId(ctx context.Context, d *schema.ResourceData, m i // there was preexisting external net connection - disconnect ViNS req := vins.ExtNetDisconnectRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - _, err := c.CloudBroker().VINS().ExtNetDisconnect(ctx, req) return err } @@ -521,9 +499,6 @@ func resourceVinsChangeExtNetId(ctx context.Context, d *schema.ResourceData, m i if ip, ok := d.GetOk("ext_ip"); ok && ip != "" { req.IP = ip.(string) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().ExtNetConnect(ctx, req) return err @@ -593,9 +568,6 @@ func resourceVinsChangeIp(ctx context.Context, d *schema.ResourceData, m interfa if ip["compute_id"].(int) != 0 { req.ComputeID = uint64(ip["compute_id"].(int)) } - if ip["reason"].(string) != "" { - req.Reason = ip["reason"].(string) - } _, err := c.CloudBroker().VINS().IPReserve(ctx, req) if err != nil { @@ -640,9 +612,6 @@ func resourceVinsChangeNatRule(ctx context.Context, d *schema.ResourceData, m in VINSID: vinsId, RuleID: int64(natRule["rule_id"].(int)), } - if natRule["reason"].(string) != "" { - req.Reason = natRule["reason"].(string) - } _, err := c.CloudBroker().VINS().NATRuleDel(ctx, req) errs = append(errs, err) @@ -738,9 +707,6 @@ func resourceVinsChangeVnfRedeploy(ctx context.Context, d *schema.ResourceData, _, newRedeploy := d.GetChange("vnfdev_redeploy") if newRedeploy.(bool) { req := vins.VNFDevRedeployRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().VNFDevRedeploy(ctx, req) return err @@ -757,9 +723,6 @@ func resourceVinsChangeVnfRestart(ctx context.Context, d *schema.ResourceData, m _, newRestart := d.GetChange("vnfdev_restart") if newRestart.(bool) { req := vins.VNFDevRestartRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().VNFDevRestart(ctx, req) if err != nil { @@ -778,9 +741,6 @@ func resourceVinsChangeVnfReset(ctx context.Context, d *schema.ResourceData, m i _, newRestart := d.GetChange("vnfdev_reset") if newRestart.(bool) { req := vins.VNFDevResetRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().VNFDevReset(ctx, req) if err != nil { @@ -799,9 +759,6 @@ func resourceVinsChangeVnfStartStop(ctx context.Context, d *schema.ResourceData, _, newStart := d.GetChange("vnfdev_start") if newStart.(bool) { req := vins.VNFDevStartRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().VNFDevStart(ctx, req) if err != nil { @@ -810,9 +767,6 @@ func resourceVinsChangeVnfStartStop(ctx context.Context, d *schema.ResourceData, } req := vins.VNFDevStopRequest{VINSID: vinsId} - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } _, err := c.CloudBroker().VINS().VNFDevStop(ctx, req) return err diff --git a/internal/service/cloudbroker/vins/schema.go b/internal/service/cloudbroker/vins/schema.go index 74c7859..31beb90 100644 --- a/internal/service/cloudbroker/vins/schema.go +++ b/internal/service/cloudbroker/vins/schema.go @@ -12,11 +12,7 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema { Required: true, Description: "vins id", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, + "vnf_dev": { Type: schema.TypeList, Computed: true, @@ -195,6 +191,47 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema { Computed: true, Description: "mac", }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + Description: "mtu", + }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "name": { Type: schema.TypeString, Computed: true, @@ -224,6 +261,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema { Computed: true, Description: "pci slot", }, + "bus_number": { + Type: schema.TypeInt, + Computed: true, + }, "qos": { Type: schema.TypeList, Computed: true, @@ -1445,6 +1486,11 @@ func dataSourceVinsListDeletedSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Filter by external IP", }, + "vnf_dev_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Filter by VNF Device id", + }, "sort_by": { Type: schema.TypeString, Optional: true, @@ -1796,11 +1842,7 @@ func DataSourceVinsNatRuleListSchemaMake() map[string]*schema.Schema { Required: true, Description: "Unique ID of the ViNS. If ViNS ID is specified, then ViNS name, rg_id and account_id are ignored.", }, - "reason": { - Type: schema.TypeString, - Optional: true, - Description: "reason for action", - }, + "items": { Type: schema.TypeList, Computed: true, @@ -1967,10 +2009,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema { }, }, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, // Additional parameters from CreateInRG "rg_id": { @@ -2032,10 +2070,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Optional: true, }, - "reason": { - Type: schema.TypeString, - Optional: true, - }, }, }, }, @@ -2324,6 +2358,47 @@ func resourceVinsSchemaMake() map[string]*schema.Schema { Computed: true, Description: "mac", }, + "mtu": { + Type: schema.TypeInt, + Computed: true, + Description: "mtu", + }, + "libvirt_settings": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "txmode": { + Type: schema.TypeString, + Computed: true, + }, + "ioeventfd": { + Type: schema.TypeString, + Computed: true, + }, + "event_idx": { + Type: schema.TypeString, + Computed: true, + }, + "queues": { + Type: schema.TypeInt, + Computed: true, + }, + "rx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + "tx_queue_size": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, "name": { Type: schema.TypeString, Computed: true, @@ -2353,6 +2428,11 @@ func resourceVinsSchemaMake() map[string]*schema.Schema { Computed: true, Description: "pci slot", }, + "bus_number": { + Type: schema.TypeInt, + Computed: true, + Description: "bus number", + }, "qos": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudbroker/vins/utility_vins.go b/internal/service/cloudbroker/vins/utility_vins.go index a6dc803..7fbf471 100644 --- a/internal/service/cloudbroker/vins/utility_vins.go +++ b/internal/service/cloudbroker/vins/utility_vins.go @@ -56,10 +56,6 @@ func utilityVinsCheckPresence(ctx context.Context, d *schema.ResourceData, m int req.VINSID = uint64(d.Get("vins_id").(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - vins, err := c.CloudBroker().VINS().Get(ctx, req) if err != nil { return nil, err diff --git a/internal/service/cloudbroker/vins/utility_vins_list_deleted.go b/internal/service/cloudbroker/vins/utility_vins_list_deleted.go index e59dadc..5996a22 100644 --- a/internal/service/cloudbroker/vins/utility_vins_list_deleted.go +++ b/internal/service/cloudbroker/vins/utility_vins_list_deleted.go @@ -69,6 +69,9 @@ func utilityVinsListDeletedCheckPresence(ctx context.Context, d *schema.Resource if size, ok := d.GetOk("size"); ok { req.Size = uint64(size.(int)) } + if VNFDevId, ok := d.GetOk("vnfdev_id"); ok { + req.VNFDevId = uint64(VNFDevId.(int)) + } log.Debugf("utilityVinsListDeletedCheckPresence") vinsList, err := c.CloudBroker().VINS().ListDeleted(ctx, req) diff --git a/internal/service/cloudbroker/vins/utility_vins_nat_rule_list.go b/internal/service/cloudbroker/vins/utility_vins_nat_rule_list.go index 71dcaf1..dd03370 100644 --- a/internal/service/cloudbroker/vins/utility_vins_nat_rule_list.go +++ b/internal/service/cloudbroker/vins/utility_vins_nat_rule_list.go @@ -52,10 +52,6 @@ func utilityVinsNatRuleListCheckPresence(ctx context.Context, d *schema.Resource req.VINSID = uint64(d.Get("vins_id").(int)) } - if reason, ok := d.GetOk("reason"); ok { - req.Reason = reason.(string) - } - natRuleList, err := c.CloudBroker().VINS().NATRuleList(ctx, req) if err != nil { return nil, err diff --git a/samples/README.md b/samples/README.md index 49d940c..ae896fc 100644 --- a/samples/README.md +++ b/samples/README.md @@ -7,109 +7,272 @@ - cloudapi: - data: - - image - - image_list - - image_list_stacks - - snapshot_list - - pcidevice_list - - pcidevice - - vgpu - - disk_list - - rg_list - - account_list + - account + - account_audits_list - account_computes_list + - account_consumed_units + - account_consumed_units_by_type + - account_deleted_list - account_disks_list - - account_vins_list - - account_audits_list - - account - - account_rg_list - - account_counsumed_units - - account_counsumed_units_by_type + - account_flipgroups_list + - account_list - account_reserved_units + - account_resource_consumption_get + - account_resource_consumption_list + - account_rg_list - account_templates_list - - account_deleted_list - - bservice_list - - bservice_snapshot_list - - bservice_deleted_list + - account_vins_list + - audit - bservice + - bservice_deleted_list - bservice_group - - extnet_default - - extnet_list - - extnet - - extnet_computes_list - - vins_list - - locations_list - - location_url - - lb - - lb_list - - lb_list_deleted + - bservice_list + - bservice_snapshot_list + - disk + - disk_list - disk_list_deleted - - disk_list_unattached - disk_list_types - disk_list_types_detailed - - disk_snapshot_list + - disk_list_unattached + - disk_replication - disk_snapshot - - resources: + - disk_snapshot_list + - dpdknet + - dpdknet_list + - extnet + - extnet_computes_list + - extnet_default + - extnet_list + - flipgroup + - flipgroup_list - image - - virtual_image - - cdrom_image - - delete_images + - image_list + - k8ci_list - k8s + - k8s_computes + - k8s_list + - k8s_list_deleted - k8s_wg - - snapshot - - pcidevice - - account - - bservice - - bservice_group + - k8s_wg_cloud_init + - k8s_wg_list + - kvmvm + - kvmvm_audits + - kvmvm_get_audits + - kvmvm_get_console_url + - kvmvm_get_log + - kvmvm_list + - vkvmvm_list_deleted + - kvmvm_pci_device_list + - kvmvm_pfw_list + - kvmvm_snapshot_usage + - kvmvm_user_list + - kvmvm_vgpu_list - lb - - lb_frontend - - lb_backend - - lb_frontend_bind - - lb_backend_server - - disk_snapshot -- cloudbroker: - - data: - - grid - - grid_list - - image - - image_list - - image_list_stacks - - pcidevice_list - - pcidevice - - sep - - sep_list - - sep_disk_list - - sep_config - - sep_pool - - sep_consumption - - disk_list + - lb_list + - lb_list_deleted + - location_url + - locations_list + - resgroup + - rg_affinity_group_computes + - rg_affinity_groups_get + - rg_affinity_groups_list + - rg_audits - rg_list - - account_list - - account_computes_list - - account_disks_list - - account_vins_list - - account_audits_list - - account - - account_rg_list - - account_counsumed_units - - account_counsumed_units_by_type - - account_reserved_units - - account_templates_list - - account_deleted_list + - rg_list_computes + - rg_list_deleted + - rg_list_lb + - rg_list_pfw + - rg_list_vins + - rg_resource_consumption_get + - rg_resource_consumption_list + - rg_usage + - snapshot_list + - stack + - stack_list + - vfpool + - vfpool_list + - vins + - vins_audits + - vins_ext_net_list + - vins_ip_list - vins_list + - vins_list_deleted + - vins_nat_rule_list + - vins_static_route + - vins_static_route_list - resources: + - account + - bservice + - bservice_group + - disk + - disk_snapshot + - flipgroup - image - - virtual_image - - cdrom_image - - delete_images + - image_from_blank_compute + - image_from_platform_disk + - image_virtual - k8s + - k8s_cp - k8s_wg + - kvmvm + - lb + - lb_backend + - lb_backend_server + - lb_frontend + - lb_frontend_bind + - pfw + - resgroup - snapshot - - pcidevice - - sep - - sep_config - - account - vins + - vins_static_route +- cloudbroker: + - data: + - cb_account + - cb_account_audits_list + - cb_account_available_templates_list + - cb_account_computes_list + - cb_account_disks_list + - cb_account_flipgroups_list + - cb_account_list + - cb_account_list_deleted + - cb_account_resource_consumption_get + - cb_account_resource_consumption_list + - cb_account_rg_list + - cb_account_vins_list + - cb_audit + - cb_audit_linked_jobs + - cb_audit_list + - cb_audits_export_to_file + - cb_disk + - cb_disk_list + - cb_disk_list_deleted + - cb_disk_list_types + - cb_disk_list_types_detailed + - cb_disk_list_unattached + - cb_disk_replication + - cb_disk_snapshot + - cb_disk_snapshot_list + - cb_dpdknet + - cb_dpdknet_list + - cb_extnet + - cb_extnet_default + - cb_extnet_list + - cb_extnet_static_route + - cb_extnet_static_route_list + - cb_flipgroup + - cb_flipgroup_list + - cb_grid + - cb_grid_get_consumption + - cb_grid_get_diagnosis + - cb_grid_get_settings + - cb_grid_get_status + - cb_grid_list + - cb_grid_list_consumption + - cb_grid_list_emails + - cb_grid_post_diagnosis + - cb_grid_post_status + - cb_image + - cb_image_list + - cb_image_list_stacks + - cb_k8ci + - cb_k8ci_list + - cb_k8ci_list_deleted + - cb_k8s + - cb_k8s_computes + - cb_k8s_list + - cb_k8s_list_deleted + - cb_k8s_wg + - cb_k8s_wg_cloud_init + - cb_k8s_wg_list + - cb_kvmvm + - cb_kvmvm_affinity_relations + - cb_kvmvm_audits + - cb_kvmvm_boot_order_get + - cb_kvmvm_get_audits + - cb_kvmvm_get_console_url + - cb_kvmvm_get_log + - cb_kvmvm_list + - cb_kvmvm_list_deleted + - cb_kvmvm_migrate_storage_info + - cb_kvmvm_pci_device_list + - cb_kvmvm_pfw_list + - cb_kvmvm_snapshot_list + - cb_kvmvm_snapshot_usage + - cb_kvmvm_user_list + - cb_kvmvm_vgpu_list + - cb_lb + - cb_lb_list + - cb_lb_list_deleted + - cb_node + - cb_node_list + - cb_pcidevice + - cb_pcidevice_list + - cb_rg + - cb_rg_affinity_group_computes + - cb_rg_affinity_groups_get + - cb_rg_affinity_groups_list + - cb_rg_audits + - cb_rg_list + - cb_rg_list_computes + - cb_rg_list_deleted + - cb_rg_list_lb + - cb_rg_list_pfw + - cb_rg_list_vins + - cb_rg_resource_consumption_get + - cb_rg_resource_consumption_list + - cb_rg_usage + - cb_sep + - cb_sep_config + - cb_sep_consumption + - cb_sep_disk_list + - cb_sep_list + - cb_sep_pool + - cb_stack + - cb_stack_list + - cb_user + - cb_user_get_audit + - cb_user_list + - cb_vfpool + - cb_vfpool_list + - cb_vins + - cb_vins_audits + - cb_vins_ext_net_list + - cb_vins_ip_list + - cb_vins_list + - cb_vins_list_deleted + - cb_vins_nat_rule_list + - cb_vins_static_route + - cb_vins_static_route_list + - resources: + - cb_account + - cb_cdrom_image + - cb_disk + - cb_disk_snapshot + - cb_dpdknet + - cb_extnet + - cb_extnet_static_route + - cb_flipgroup + - cb_image + - cb_image_from_blank_compute + - cb_image_from_platform_disk + - cb_k8ci + - cb_k8s_cp + - cb_k8s_wg + - cb_kvmvm + - cb_lb + - cb_lb_backend + - cb_lb_backend_server + - cb_lb_frontend + - cb_lb_frontend_bind + - cb_pcidevice + - cb_rg + - cb_sep + - cb_sep_config + - cb_user + - cb_vfpool + - cb_vins + - cb_vins_static_route + - cb_virtual_image ## Как пользоваться примерами diff --git a/samples/cloudapi/account/data_account_flipgroups_list/main.tf b/samples/cloudapi/account/data_account_flipgroups_list/main.tf index eb253a1..c1b00f4 100644 --- a/samples/cloudapi/account/data_account_flipgroups_list/main.tf +++ b/samples/cloudapi/account/data_account_flipgroups_list/main.tf @@ -62,6 +62,12 @@ data "decort_account_flipgroups_list" "afgl" { #тип - целое число #flipgroup_id = 100 + #сортировка по одному из поддерживаемых полей + #опциональный параметр + #тип - строка + #формат - "+поле" по возрастанию / "-поле" по убыванию + #sort_by = "+name" + #кол-во страниц для вывода #опциональный параметр #тип - целое число diff --git a/samples/cloudapi/account/resource_account/main.tf b/samples/cloudapi/account/resource_account/main.tf index b7836f2..3e69a16 100644 --- a/samples/cloudapi/account/resource_account/main.tf +++ b/samples/cloudapi/account/resource_account/main.tf @@ -77,12 +77,6 @@ resource "decort_account" "a" { #ARCXDU - админ access_type = "R" - #рекурсивное удаление пользователя из всех ресурсов аккаунтов - #необязательный параметр - #тип - булев - #по-умолчанию - false - #применяется при удалении пользователя из аккаунта - recursive_delete = true } users { user_id = "username_1@decs3o" diff --git a/samples/cloudapi/audit/data_audit/main.tf b/samples/cloudapi/audit/data_audit/main.tf new file mode 100644 index 0000000..f2d590f --- /dev/null +++ b/samples/cloudapi/audit/data_audit/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение аудита по guid +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_audit" "audit" { + #guid аудита + #обязательный параметр + #тип - строка + audit_guid = "abcdefg" + +} + +output "test" { + value = data.decort_audit.audit +} diff --git a/samples/cloudapi/disk/resource_disk/main.tf b/samples/cloudapi/disk/resource_disk/main.tf index b6b862d..0af19ce 100644 --- a/samples/cloudapi/disk/resource_disk/main.tf +++ b/samples/cloudapi/disk/resource_disk/main.tf @@ -57,11 +57,6 @@ resource "decort_disk" "acl" { #тип - булев permanently = false - #описание причины удаления - #опциональный параметр - #тип - строка - reason = "some" - #Флаг, отвечающий за доступность диска дургим ресурсам #опциональный параметр #тип - строка diff --git a/samples/cloudapi/dpdknet/data_dpdknet/main.tf b/samples/cloudapi/dpdknet/data_dpdknet/main.tf new file mode 100644 index 0000000..59ec65c --- /dev/null +++ b/samples/cloudapi/dpdknet/data_dpdknet/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение данных диска +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_dpdknet" "dpdk" { + #фильтр по id DPDK сети + #обязательный параметр + #тип - целое число + dpdk_id = 49304 +} + +output "test" { + value = data.decort_dpdknet.dpdk +} diff --git a/samples/cloudapi/disk/resource_disk_replication/main.tf b/samples/cloudapi/dpdknet/data_dpdknet_list/main.tf similarity index 50% rename from samples/cloudapi/disk/resource_disk_replication/main.tf rename to samples/cloudapi/dpdknet/data_dpdknet_list/main.tf index 99304ef..1ae79a3 100644 --- a/samples/cloudapi/disk/resource_disk_replication/main.tf +++ b/samples/cloudapi/dpdknet/data_dpdknet_list/main.tf @@ -1,6 +1,6 @@ /* Пример использования -Ресурс репликации диска +Получение списка доступных дисков */ #Расскомментируйте этот код, @@ -26,59 +26,54 @@ provider "decort" { allow_unverified_ssl = true } -resource "decort_disk_replication" "dr" { - #id диска из которого будет создана реплика - #обязательный параметр +data "decort_dpdknet_list" "dl" { + #фильтр по id DPDK сети + #опциональный параметр #тип - целое число - disk_id = 20100 - - #имя реплики диска - #обязательный параметр - #тип - строка - disk_name = "test" + #by_id = 100 - #sep id - #обязательный параметр + #фильтр по grid ID + #опциональный параметр #тип - целое число - sep_id = 1 - - #название pool - #обязательный параметр + #gid = 100 + + #фильтр по имени сети + #опциональный параметр #тип - строка - pool_name = "some" + #name = "test_dpdk" - #флаг паузы + #фильтр по описания #опциональный параметр - #тип - булев - #pause = false + #тип - строка + #desc = "user" - #флаг для изменения ролей дисков + #фильтр по статусу #опциональный параметр - #тип - булев - #reverse = false + #тип - строка + #status = "ENABLED" - #флаг для запуска связи между диском и репликой + #фильтр по compute IDs #опциональный параметр - #тип - булев - #start = false + #тип - массив чисел + #compute_ids = [11111,22222] - #флаг для отключения диска от ВМ при удалении + #сортировка по одному из поддерживаемых полей #опциональный параметр - #тип - булев - #detach = false + #тип - строка + #формат - "+поле" по возрастанию / "-поле" по убыванию + #sort_by = "+name" - #флаг для удаления реплики диска безвозвратно + #кол-во страниц для вывода #опциональный параметр - #тип - булев - #permanently = false + #тип - целое число + #page = 1 - #описание причины удаления + #размер страницы #опциональный параметр - #тип - строка - #reason = "some" + #тип - целое число + #size = 1 } - output "test" { - value = decort_disk_replication.dr + value = data.decort_dpdknet_list.dl } diff --git a/samples/cloudapi/flipgroup/data_flipgroup_list/main.tf b/samples/cloudapi/flipgroup/data_flipgroup_list/main.tf index 0dc80f4..c5f2cb6 100644 --- a/samples/cloudapi/flipgroup/data_flipgroup_list/main.tf +++ b/samples/cloudapi/flipgroup/data_flipgroup_list/main.tf @@ -93,8 +93,8 @@ data "decort_flipgroup_list" "fg" { #фильтр по id клиентов #опциональный параметр - #тип - массив целых чисел - #client_ids = [10,11] + #тип - массив строк + #client_ids = ["10","11"] #фильтр по статусу #опциональный параметр diff --git a/samples/cloudapi/image/data_image_list/main.tf b/samples/cloudapi/image/data_image_list/main.tf index 19bfe71..6d6130e 100644 --- a/samples/cloudapi/image/data_image_list/main.tf +++ b/samples/cloudapi/image/data_image_list/main.tf @@ -75,18 +75,18 @@ data "decort_image_list" "il" { #фильтр по доступу #опциональный параметр - #тип - булевый тип - #public = "true" + #тип - булев + #public = true #фильтр по hot_resize #опциональный параметр - #тип - булевый тип - #hot_resize = "true" + #тип - булев + #hot_resize = true #фильтр по bootable #опциональный параметр - #тип - булевый тип - #bootable = "true" + #тип - булев + #bootable = true #сортировка по одному из поддерживаемых полей #опциональный параметр @@ -105,6 +105,11 @@ data "decort_image_list" "il" { #тип - целое число #если не задан - выводятся все доступные данные #size = 3 + + #фильтр по enabled + #опциональный параметр + #тип - булев + #enabled = true } output "test" { diff --git a/samples/cloudapi/image/resource_image/main.tf b/samples/cloudapi/image/resource_image/main.tf index 1d83200..7d71f19 100644 --- a/samples/cloudapi/image/resource_image/main.tf +++ b/samples/cloudapi/image/resource_image/main.tf @@ -94,15 +94,10 @@ resource "decort_image" "img" { #тип - строка pool_name = "pool" - #архитектура образа (X86_64 / PPC64_LE) + #архитектура образа (X86_64) #опциональный параметр #тип - строка - architecture = "PPC64_LE" - - #флаг окончательного удаления - #опциональный параметр - #тип - булев - permanently = true + architecture = "X86_64" #наименование сетевого интерфейса для вашего компьютера с Linux, eth - встроенный, ens - pci слот #опциональный параметр diff --git a/samples/cloudapi/image/resource_image_from_blank_compute/main.tf b/samples/cloudapi/image/resource_image_from_blank_compute/main.tf index 39d6f28..606ec7b 100644 --- a/samples/cloudapi/image/resource_image_from_blank_compute/main.tf +++ b/samples/cloudapi/image/resource_image_from_blank_compute/main.tf @@ -95,11 +95,6 @@ resource "decort_image_from_blank_compute" "img" { #тип - булев #async_mode = true - #флаг окончательного удаления - #опциональный параметр - #тип - булев - #permanently = true - } output "img_out" { diff --git a/samples/cloudapi/image/resource_image_from_platform_disk/main.tf b/samples/cloudapi/image/resource_image_from_platform_disk/main.tf index d113407..5699ada 100644 --- a/samples/cloudapi/image/resource_image_from_platform_disk/main.tf +++ b/samples/cloudapi/image/resource_image_from_platform_disk/main.tf @@ -57,10 +57,16 @@ resource "decort_image_from_platform_disk" "img" { #архитектура образа #используется для создания образа #обязательный параметр - #возможные значения - X86_64, PPC64_LE + #возможные значения - X86_64 #тип - строка architecture = "X86_64" + #драйверы компьютов, подходящие для данного образа + #используется для создания образа + #обязательный параметр + #тип - массив строк + drivers = ["KVM_X86"] + #имя пользователя для образа #используется для создания образа #опциональный параметр @@ -91,12 +97,6 @@ resource "decort_image_from_platform_disk" "img" { #тип - строка #pool_name = "pool" - #драйверы компьютов, подходящие для данного образа - #используется для создания образа - #опциональный параметр - #тип - массив строк - #drivers = ["KVM_X86"] - #поддержка hot resize #используется для создания образа #опциональный параметр @@ -116,10 +116,6 @@ resource "decort_image_from_platform_disk" "img" { #тип - булев #async_mode = true - #флаг окончательного удаления - #опциональный параметр - #тип - булев - #permanently = true } output "img_out" { diff --git a/samples/cloudapi/image/resource_image_virtual/main.tf b/samples/cloudapi/image/resource_image_virtual/main.tf index 01ff9fe..e68e3f1 100644 --- a/samples/cloudapi/image/resource_image_virtual/main.tf +++ b/samples/cloudapi/image/resource_image_virtual/main.tf @@ -43,10 +43,6 @@ resource "decort_image_virtual" "iv" { #тип - целое число link_to = 123 - #Флаг для удаления диска - #опциональный параметр - #тип - булев - permanently = false } output "sr" { diff --git a/samples/cloudapi/k8s/resource_k8s/main.tf b/samples/cloudapi/k8s/resource_k8s/main.tf index 0ecea74..fec659c 100644 --- a/samples/cloudapi/k8s/resource_k8s/main.tf +++ b/samples/cloudapi/k8s/resource_k8s/main.tf @@ -148,6 +148,11 @@ resource "decort_k8s" "cluster" { #опциональный параметр #тип - строка sep_pool = "data01" + + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" } #...Далее можно создавать произвольное кол-во дополнительных worker групп @@ -188,6 +193,11 @@ resource "decort_k8s" "cluster" { #тип - строка sep_pool = "data01" + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + #список лейблов #опциональный параметр #тип - массив строк @@ -286,6 +296,11 @@ resource "decort_k8s" "cluster" { # тип - файл с форматом в виде x509 pem oidc_cert = file("ca.crt") + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + # запуск,остановка кластера # опциональный параметр # тип - булев diff --git a/samples/cloudapi/k8s/resource_k8s_wg/main.tf b/samples/cloudapi/k8s/resource_k8s_wg/main.tf index 6048535..49ab513 100644 --- a/samples/cloudapi/k8s/resource_k8s_wg/main.tf +++ b/samples/cloudapi/k8s/resource_k8s_wg/main.tf @@ -58,6 +58,11 @@ resource "decort_k8s_wg" "wg" { #по-умолчанию - 1024 ram = 1024 + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + #размер загрузочного диска для worker node, в Гбайтах #опциональный параметр #тип - целое число diff --git a/samples/cloudapi/kvmvm/resource_kvmvm/main.tf b/samples/cloudapi/kvmvm/resource_kvmvm/main.tf index e3e1959..374caf5 100644 --- a/samples/cloudapi/kvmvm/resource_kvmvm/main.tf +++ b/samples/cloudapi/kvmvm/resource_kvmvm/main.tf @@ -57,6 +57,11 @@ resource "decort_kvmvm" "comp" { #тип - целое число ram = 2048 + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + #размер загрузочного диска #опциональный параметр #тип - целое число @@ -74,7 +79,7 @@ resource "decort_kvmvm" "comp" { #конфигурация cloud init #опциональный параметр - #тип - файл в формате JSON/YAML + #тип - файл в формате JSON cloud_init = file("initconfig.tftpl") #описание compute @@ -259,7 +264,7 @@ resource "decort_kvmvm" "comp" { #опциональный параметр #тип - блок сетей network { - #тип сети VINS/EXTNET (для любого драйвера) и VFNIC (для KVM_X86) + #тип сети VINS/EXTNET/DPDK (для любого драйвера) и VFNIC (для KVM_X86) #обязательный параметр #тип - строка net_type = "VINS" @@ -348,6 +353,12 @@ resource "decort_kvmvm" "comp" { label = "label1" } + #флаг для удаления снапшотов в асинхронном режиме + #опциональный параметр + #дефолтное значение - false + #тип - булев + snapshot_delete_async = true + #rollback на нужный снапшот #опциональный параметр #Не имеет смысла при отсутсвии снапшотов diff --git a/samples/cloudapi/rg/data_rg/main.tf b/samples/cloudapi/rg/data_rg/main.tf index a6951ff..1703737 100644 --- a/samples/cloudapi/rg/data_rg/main.tf +++ b/samples/cloudapi/rg/data_rg/main.tf @@ -31,11 +31,7 @@ data "decort_resgroup" "rg" { #обязательный параметр #тип - целое число rg_id = 1535 - - #причина для выполнения действия - #необязятельный параметр - #тип - строка - reason = "TEST" + } output "output" { diff --git a/samples/cloudapi/rg/data_rg_usage/main.tf b/samples/cloudapi/rg/data_rg_usage/main.tf index 5d6e4d3..e2f22b9 100644 --- a/samples/cloudapi/rg/data_rg_usage/main.tf +++ b/samples/cloudapi/rg/data_rg_usage/main.tf @@ -30,12 +30,7 @@ data "decort_rg_usage" "rg_usage" { #id ресурсной группы #обязательный параметр #тип - целое число - rg_id = 123 - #причина для действия - #необязательный параметр - #тип - строка - reason = "TEST" } output "output" { diff --git a/samples/cloudapi/rg/resource_rg/main.tf b/samples/cloudapi/rg/resource_rg/main.tf index 0c39e3d..191ed51 100644 --- a/samples/cloudapi/rg/resource_rg/main.tf +++ b/samples/cloudapi/rg/resource_rg/main.tf @@ -50,6 +50,7 @@ resource "decort_resgroup" "rg" { #опциональный параметр #виртуальные машины, созданные в этой RG, по умолчанию будут подключены к этой сети #допустимые значения: PRIVATE, PUBLIC, NONE + #по умолчанию: PRIVATE #тип - строка def_net_type = "NONE" @@ -68,11 +69,6 @@ resource "decort_resgroup" "rg" { #тип - строка ext_ip = "1.1.1.1" - #причина выполнения - #опциональный параметр - #тип - строка - reason = "TEST" - #описание #опциональный параметр #тип - строка @@ -92,8 +88,8 @@ resource "decort_resgroup" "rg" { #опциональный параметр #тип - блок прав доступа access { - #имя юзера предоставляемому права - #обязательный праметр при использовании блока + #имя юзера предоставляемому права + #обязательный параметр при использовании блока #тип - строка user = "kasim_baybikov_1@decs3o" @@ -105,7 +101,6 @@ resource "decort_resgroup" "rg" { #установить сеть по умолчанию #опциональный параметр - #при добавлении блока, удалять его нельзя #тип - блок сетей def_net { #тип сети @@ -122,10 +117,6 @@ resource "decort_resgroup" "rg" { #тип - целое число net_id = 1234 - #причина выполнения - #опциональный параметр - #тип - строка - reason = "TEST" } #лимиты ресурсов для ресурсной группы @@ -163,6 +154,12 @@ resource "decort_resgroup" "rg" { ext_ips = 29 } + #список названий pools + #необязательный параметр + #игнорируется при создании ресурса, применяется только при обновлении + #тип - массив строк + #uniq_pools = ["sep1_poolName1", "sep2_poolName2"] + #флаг для принудительного удаления ресурсной группы #опциональный параметр #тип - булев diff --git a/samples/cloudapi/snapshot/resource_snapshot/main.tf b/samples/cloudapi/snapshot/resource_snapshot/main.tf index fe2fbc3..621d819 100644 --- a/samples/cloudapi/snapshot/resource_snapshot/main.tf +++ b/samples/cloudapi/snapshot/resource_snapshot/main.tf @@ -46,7 +46,13 @@ resource "decort_snapshot" "s" { #если флаг был измеен с false на true, то произойдет откат #по-уолчанию - false #тип - булев - #rollback = false + rollback = false + + #флаг для удаление снапшота асинхронном режиме + #опциональный параметр + #по умолчанию - false + #тип - булев + delete_async_mode = true } diff --git a/samples/cloudapi/vins/data_vins_list/main.tf b/samples/cloudapi/vins/data_vins_list/main.tf index c27d721..003ed51 100644 --- a/samples/cloudapi/vins/data_vins_list/main.tf +++ b/samples/cloudapi/vins/data_vins_list/main.tf @@ -52,6 +52,11 @@ data "decort_vins_list" "vl" { #тип - строка #ext_ip = "test" + #фильтр по VNF Device id + #опциональный параметр + #тип - целое число + #vnf_dev_id = 14 + #включение удаленных vins в результат #опциональный параметр #тип - булев diff --git a/samples/cloudbroker/account/resource_account/main.tf b/samples/cloudbroker/account/resource_account/main.tf index b04b064..cb80e56 100644 --- a/samples/cloudbroker/account/resource_account/main.tf +++ b/samples/cloudbroker/account/resource_account/main.tf @@ -127,12 +127,6 @@ resource "decort_cb_account" "acc" { #ARCXDU - админ access_type = "R" - #рекурсивное удаление пользователя из всех ресурсов аккаунтов - #опциональный параметр - #тип - булев - #по-умолчанию - false - #применяется при удалении пользователя из аккаунта - recursive_delete = true } */ diff --git a/samples/cloudbroker/audit/data_audits_export_to_file/main.tf b/samples/cloudbroker/audit/data_audits_export_to_file/main.tf new file mode 100644 index 0000000..a5f2290 --- /dev/null +++ b/samples/cloudbroker/audit/data_audits_export_to_file/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получения списка аудитов в виде архива csv файлов +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_cb_audits_export_to_file" "audit" { + #путь, где будет создан архив, если не указан, создается в директории с main.tf с именем "audits.tar.gz" + #обязательный параметр + #тип - строка + file_path = "abcdefg.tar.gz" + +} + +output "test" { + value = data.decort_cb_audits_export_to_file.audit +} diff --git a/samples/cloudbroker/disk/resource_disk/main.tf b/samples/cloudbroker/disk/resource_disk/main.tf index e0834a9..6dcbc45 100644 --- a/samples/cloudbroker/disk/resource_disk/main.tf +++ b/samples/cloudbroker/disk/resource_disk/main.tf @@ -41,7 +41,7 @@ resource "decort_cb_disk" "acl" { #тип - целое число gid = 212 - #название диска диска + #название диска #обязательный параметр #тип - строка disk_name = "super-disk-re" @@ -101,11 +101,6 @@ resource "decort_cb_disk" "acl" { #тип - булев #permanently = true - #причина удаления диска - #опциональный параметр - #тип - строка - #reason = "delete" - #флаг поделиться диском #опциональный параметр #тип - булев diff --git a/samples/cloudbroker/disk/resource_disk_replication/main.tf b/samples/cloudbroker/disk/resource_disk_replication/main.tf deleted file mode 100644 index 5604840..0000000 --- a/samples/cloudbroker/disk/resource_disk_replication/main.tf +++ /dev/null @@ -1,84 +0,0 @@ -/* -Пример использования -Ресурс репликации диска -*/ - -#Расскомментируйте этот код, -#и внесите необходимые правки в версию и путь, -#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером - -/* -terraform { - required_providers { - decort = { - source = "basis/decort/decort" - version = "" - } - } -} -*/ - -provider "decort" { - authenticator = "decs3o" - #controller_url = - controller_url = "https://ds1.digitalenergy.online" - #oauth2_url = - oauth2_url = "https://sso.digitalenergy.online" - allow_unverified_ssl = true -} - -resource "decort_cb_disk_replication" "dr" { - #ID диска из которого будет создана реплика - #обязательный параметр - #тип - целое число - disk_id = 20100 - - #Имя реплики диска - #обязательный параметр - #тип - строка - disk_name = "test" - - #sep id - #обязательный параметр - #тип - целое число - sep_id = 1 - - #название pool - #обязательный параметр - #тип - строка - pool_name = "some" - - #флаг паузы - #опциональный параметр - #тип - булев - #pause = false - - #флаг для изменения ролей дисков - #опциональный параметр - #тип - булев - #reverse = false - - #флаг для запуска связи между диском и репликой - #опциональный параметр - #тип - булев - #start = false - - #флаг для отключения диска от ВМ при удалении - #опциональный параметр - #тип - булев - #detach = false - - #флаг для удаления реплики диска безвозвратно - #опциональный параметр - #тип - булев - #permanently = false - - #описание причины удаления - #опциональный параметр - #тип - строка - #reason = "some" -} - -output "test" { - value = decort_cb_disk_replication.dr -} diff --git a/samples/cloudbroker/dpdknet/data_dpdknet/main.tf b/samples/cloudbroker/dpdknet/data_dpdknet/main.tf new file mode 100644 index 0000000..719016c --- /dev/null +++ b/samples/cloudbroker/dpdknet/data_dpdknet/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение данных диска +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_cb_dpdknet" "dpdk" { + #фильтр по id DPDK сети + #обязательный параметр + #тип - целое число + dpdk_id = 49304 +} + +output "test" { + value = data.decort_cb_dpdknet.dpdk +} diff --git a/samples/cloudbroker/dpdknet/data_dpdknet_list/main.tf b/samples/cloudbroker/dpdknet/data_dpdknet_list/main.tf new file mode 100644 index 0000000..4950a18 --- /dev/null +++ b/samples/cloudbroker/dpdknet/data_dpdknet_list/main.tf @@ -0,0 +1,89 @@ +/* +Пример использования +Получение списка доступных дисков +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_cb_dpdknet_list" "dl" { + #фильтр по id DPDK сети + #опциональный параметр + #тип - целое число + #by_id = 100 + + #фильтр по grid ID + #опциональный параметр + #тип - целое число + #gid = 100 + + #фильтр по имени сети + #опциональный параметр + #тип - строка + #name = "test_dpdk" + + #фильтр по описания + #опциональный параметр + #тип - строка + #desc = "user" + + #фильтр по статусу + #опциональный параметр + #тип - строка + #status = "ENABLED" + + #фильтр по доступным аккаунтам + #опциональный параметр + #тип - массив чисел + #account_access = [11111,22222] + + #фильтр по доступным ресурсным группам + #опциональный параметр + #тип - массив чисел + #rg_access = [11111,22222] + + #фильтр по compute IDs + #опциональный параметр + #тип - массив чисел + #compute_ids = [11111,22222] + + #сортировка по одному из поддерживаемых полей + #опциональный параметр + #тип - строка + #формат - "+поле" по возрастанию / "-поле" по убыванию + #sort_by = "+name" + + #кол-во страниц для вывода + #опциональный параметр + #тип - целое число + #page = 1 + + #размер страницы + #опциональный параметр + #тип - целое число + #size = 1 +} + +output "test" { + value = data.decort_cb_dpdknet_list.dl +} diff --git a/samples/cloudbroker/dpdknet/resource_dpdknet/main.tf b/samples/cloudbroker/dpdknet/resource_dpdknet/main.tf new file mode 100644 index 0000000..b716521 --- /dev/null +++ b/samples/cloudbroker/dpdknet/resource_dpdknet/main.tf @@ -0,0 +1,78 @@ +/* +Пример использования +Ресурса диска: +1. Создание ресурса +2. Изменение ресурса +3. Удаление ресурса +*/ + +#Раскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером + +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_cb_dpdknet" "dpdk" { + #название + #обязательный параметр + #тип - строка + name = "dpdk-name" + + #gid + #обязательный параметр + #тип - целое число + gid = 212 + + #vlanid для тегирования траффика на интерфейсе для компьюта + #обязательный параметр + #тип - целое число + vlan_id = 123 + + #OVS bridge в котором будут создаваться интерфейсы для компьютов, созданные из этой сети + #обязательный параметр + #тип - строка + ovs_bridge = "OVSBridge" + + #описание сети + #опциональный параметр + #тип - строка + #desc = "description" + + #список id аккаунтов, которым может быть выделена сеть в эксклюзивное пользование + #опциональный параметр + #тип - массив целых чисел + #account_access = [10,11] + + #список id ресурсных групп, которым может быть выделена сеть в эксклюзивное пользование + #опциональный параметр + #тип - массив целых чисел + #rg_access = [10,11] + + #флаг доступности сети для проведения с ней операций + #опциональный параметр + #по умолчанию - false + #тип - булев + #enabled = true +} + +output "test" { + value = decort_cb_dpdknet.dpdk +} diff --git a/samples/cloudbroker/grid/data_grid_get_settings/main.tf b/samples/cloudbroker/grid/data_grid_get_settings/main.tf new file mode 100644 index 0000000..52607fd --- /dev/null +++ b/samples/cloudbroker/grid/data_grid_get_settings/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение настроек grid (платформы) по id +*/ + +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + source = "basis/decort/decort" + version = "" + } + } +} +*/ + +provider "decort" { + authenticator = "decs3o" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_cb_grid_get_settings" "gs" { + #id grid для получения информации + #обязательный параметр + #тип - целое число + grid_id = 215 + +} + +output "test" { + value = data.decort_cb_grid_get_settings.gs +} diff --git a/samples/cloudbroker/image/data_image_list/main.tf b/samples/cloudbroker/image/data_image_list/main.tf index 3315586..63093b2 100644 --- a/samples/cloudbroker/image/data_image_list/main.tf +++ b/samples/cloudbroker/image/data_image_list/main.tf @@ -75,17 +75,17 @@ data "decort_cb_image_list" "il" { #фильтр по доступу #опциональный параметр #тип - булев - #public = "true" + #public = true #фильтр по hot_resize #опциональный параметр #тип - булев - #hot_resize = "true" + #hot_resize = true #фильтр по bootable #опциональный параметр #тип - булев - #bootable = "true" + #bootable = true #сортировка по одному из поддерживаемых полей #опциональный параметр @@ -105,6 +105,11 @@ data "decort_cb_image_list" "il" { #тип - целое число #size = 3 + #фильтр по enabled + #опциональный параметр + #тип - булев + #enabled = true + } output "test" { diff --git a/samples/cloudbroker/image/resource_delete_images/main.tf b/samples/cloudbroker/image/resource_delete_images/main.tf index 4656d67..a9e4d0f 100644 --- a/samples/cloudbroker/image/resource_delete_images/main.tf +++ b/samples/cloudbroker/image/resource_delete_images/main.tf @@ -39,11 +39,6 @@ resource "decort_delete_images" "my_images" { #по-умолчанию - false #тип - булев permanently = true - - #причина удаления - #обязательный параметр - #тип - строка - reason = "test delete" } output "test" { diff --git a/samples/cloudbroker/image/resource_image/main.tf b/samples/cloudbroker/image/resource_image/main.tf index c553a54..f9db50b 100644 --- a/samples/cloudbroker/image/resource_image/main.tf +++ b/samples/cloudbroker/image/resource_image/main.tf @@ -155,16 +155,6 @@ resource "decort_cb_image" "my_image" { #для удаления всех доступных аккаунтов, необходимо передать пустой массив #accounts = [9, 5] - #мгновенное удаление - #опциональный параметр, можно использовать перед удалением - #тип - булев - #permanently = true - - #причина удаления - #опциональный параметр, можно использовать перед удалением - #тип - строка - #reason = "test" - #наименование сетевого интерфейса для вашего компьютера с Linux, eth - встроенный, ens - pci слот #опциональный параметр #тип - строка diff --git a/samples/cloudbroker/image/resource_image_cdrom/main.tf b/samples/cloudbroker/image/resource_image_cdrom/main.tf index de8015a..1ae097e 100644 --- a/samples/cloudbroker/image/resource_image_cdrom/main.tf +++ b/samples/cloudbroker/image/resource_image_cdrom/main.tf @@ -48,7 +48,7 @@ resource "decort_cb_cdrom_image" "my_image" { gid = 212 #драйвера - #обязательный параметр + #опциональный параметр #тип - массив строк #возможные варианты - ["KVM_X86", "SVA_KVM_X86"], ["KVM_X86"], ["SVA_KVM_X86"] drivers = ["KVM_X86", "SVA_KVM_X86"] @@ -116,11 +116,6 @@ resource "decort_cb_cdrom_image" "my_image" { #опциональный параметр, используется на уже созданном ресурсе #тип - булев #bootable = true - - #мгновенное удаление - #опциональный параметр, можно использовать перед удалением - #тип - булев - #permanently = true } output "test" { diff --git a/samples/cloudbroker/image/resource_image_from_blank_compute/main.tf b/samples/cloudbroker/image/resource_image_from_blank_compute/main.tf index e806755..f840f60 100644 --- a/samples/cloudbroker/image/resource_image_from_blank_compute/main.tf +++ b/samples/cloudbroker/image/resource_image_from_blank_compute/main.tf @@ -133,16 +133,6 @@ resource "decort_cb_image_from_blank_compute" "my_image" { #для удаления всех доступных аккаунтов, необходимо передать пустой массив #accounts = [9, 5] - #мгновенное удаление - #опциональный параметр, можно использовать перед удалением - #тип - булев - #permanently = true - - #причина удаления - #опциональный параметр, можно использовать перед удалением - #тип - строка - #reason = "test" - #наименование сетевого интерфейса для вашего компьютера с Linux, eth - встроенный, ens - pci слот #используется для обновления образа #опциональный параметр diff --git a/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf b/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf index 14789de..03ee91b 100644 --- a/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf +++ b/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf @@ -59,10 +59,16 @@ resource "decort_cb_image_from_platform_disk" "my_image" { #архитектура образа #используется для создания образа #обязательный параметр - #возможные значения - X86_64 or PPC64_LE + #возможные значения - X86_64 #тип - строка architecture = "X86_64" + #драйверы компьютов, подходящие для данного образа + #используется для создания образа + #обязательный параметр + #тип - массив строк + drivers = ["KVM_X86"] + #имя пользователя для образа #используется для обновления и создания образа #опциональный параметр @@ -93,12 +99,6 @@ resource "decort_cb_image_from_platform_disk" "my_image" { #тип - строка #pool_name = "pool" - #драйверы компьютов, подходящие для данного образа - #используется для создания образа - #опциональный параметр - #тип - массив строк - #drivers = ["KVM_X86"] - #поддержка hot resize #используется для обновления и создания образа #опциональный параметр @@ -146,16 +146,6 @@ resource "decort_cb_image_from_platform_disk" "my_image" { #для удаления всех доступных аккаунтов, необходимо передать пустой массив #accounts = [9, 5] - #мгновенное удаление - #опциональный параметр, можно использовать перед удалением - #тип - булев - #permanently = true - - #причина удаления - #опциональный параметр, можно использовать перед удалением - #тип - строка - #reason = "test" - #наименование сетевого интерфейса для вашего компьютера с Linux, eth - встроенный, ens - pci слот #используется для обновления образа #опциональный параметр diff --git a/samples/cloudbroker/image/resource_virtual_image/main.tf b/samples/cloudbroker/image/resource_virtual_image/main.tf index e996d53..d5c6b0b 100644 --- a/samples/cloudbroker/image/resource_virtual_image/main.tf +++ b/samples/cloudbroker/image/resource_virtual_image/main.tf @@ -95,18 +95,6 @@ resource "decort_cb_virtual_image" "my_image" { #для удаления всех доступных стаков, необходимо передать пустой массив #тип - массив целых чисел #enabled_stacks = [9] - - #мгновенное удаление - #опциональный параметр - #можно использовать перед удалением - #тип - булев - #permanently = true - - #причина удаления - #опциональный параметр - #можно использовать перед удалением - #тип - строка - #reason = "test" } diff --git a/samples/cloudbroker/k8s/resource_k8s_cp/main.tf b/samples/cloudbroker/k8s/resource_k8s_cp/main.tf index 9a03684..5ac19e5 100644 --- a/samples/cloudbroker/k8s/resource_k8s_cp/main.tf +++ b/samples/cloudbroker/k8s/resource_k8s_cp/main.tf @@ -175,6 +175,11 @@ resource "decort_cb_k8s_cp" "cp" { #тип - файл с форматом в виде .crt oidc_cert = file("ca.crt") + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + #пользовательские значения sysctl для LB #опциональный параметр #тип - массив мап diff --git a/samples/cloudbroker/k8s/resource_k8s_wg/main.tf b/samples/cloudbroker/k8s/resource_k8s_wg/main.tf index 5a3ec46..d8cd2ad 100644 --- a/samples/cloudbroker/k8s/resource_k8s_wg/main.tf +++ b/samples/cloudbroker/k8s/resource_k8s_wg/main.tf @@ -94,6 +94,11 @@ resource "decort_cb_k8s_wg" "wg" { #используется при создании и обновлении ресурса cloud_init = file("initconfig.tftpl") + #тип эмулируемой системы + #опциональный параметр + #тип - строка + chipset = "i440fx" + } output "test_wg" { diff --git a/samples/cloudbroker/kvmvm/data_kvmvm/main.tf b/samples/cloudbroker/kvmvm/data_kvmvm/main.tf index a57a4b2..08badf3 100644 --- a/samples/cloudbroker/kvmvm/data_kvmvm/main.tf +++ b/samples/cloudbroker/kvmvm/data_kvmvm/main.tf @@ -33,11 +33,6 @@ data "decort_cb_kvmvm" "comp" { #тип - целое число compute_id = 11346 - #прична запроса - #опциональный параметр - #тип - строка - reason = "test" - } output "test" { diff --git a/samples/cloudbroker/kvmvm/data_kvmvm_get_audits/main.tf b/samples/cloudbroker/kvmvm/data_kvmvm_get_audits/main.tf index cdbbcc2..3d1628d 100644 --- a/samples/cloudbroker/kvmvm/data_kvmvm_get_audits/main.tf +++ b/samples/cloudbroker/kvmvm/data_kvmvm_get_audits/main.tf @@ -32,11 +32,6 @@ data "decort_cb_kvmvm_get_audits" "kvmvm_get_audits" { #тип - целое число compute_id = 10154 - #причина запроса - #опциональный параметр - #тип - строка - #reason = "test" - } output "output" { diff --git a/samples/cloudbroker/kvmvm/data_kvmvm_pfw_list/main.tf b/samples/cloudbroker/kvmvm/data_kvmvm_pfw_list/main.tf index fef83c6..1306a6e 100644 --- a/samples/cloudbroker/kvmvm/data_kvmvm_pfw_list/main.tf +++ b/samples/cloudbroker/kvmvm/data_kvmvm_pfw_list/main.tf @@ -32,11 +32,6 @@ data "decort_cb_kvmvm_pfw_list" "kvmvm_pfw_list" { #тип - целое число compute_id = 48 - #причина запроса - #опциональный параметр - #тип - строка - reason = "test" - } output "output" { diff --git a/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf b/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf index ef69598..f56fba2 100644 --- a/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf +++ b/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf @@ -57,6 +57,11 @@ resource "decort_cb_kvmvm" "comp" { #тип - целое число ram = 2048 + #тип эмулируемой системы + #опциональный параметр + #тип - строка + #chipset = "i440fx" + #id образа диска для создания compute #опциональный параметр #тип - целое число @@ -84,7 +89,7 @@ resource "decort_cb_kvmvm" "comp" { #конфигурация cloud init #опциональный параметр - #тип - файл в формате JSON/YAML + #тип - файл в формате JSON #cloud_init = file("initconfig.tftpl") #описание compute @@ -268,16 +273,11 @@ resource "decort_cb_kvmvm" "comp" { #тип - строка (json-encoded) #custom_fields = "{`key`:`value`}" - #описание необходимости выполнения действия - #опциональный параметр - #тип - строка - #reason = "need" - #присоединения сетей и удаление сетей в компьюте #опциональный параметр #тип - блок #network { - #тип сети VINS/EXTNET (для любого драйвера) и VFNIC (для KVM_X86) + #тип сети VINS/EXTNET/DPDK (для любого драйвера) и VFNIC (для KVM_X86) #обязательный параметр #тип - строка #net_type = "VINS" @@ -366,7 +366,13 @@ resource "decort_cb_kvmvm" "comp" { #label = "label1" #} - #Rollback на нужный снапшот + #флаг для удаления снапшотов в асинхронном режиме + #опциональный параметр + #дефолтное значение - false + #тип - булев + #snapshot_delete_async = true + + #rollback на нужный снапшот #опциональный параметр #не имеет смысла при отсутсвии снапшотов #тип - блок @@ -464,10 +470,55 @@ resource "decort_cb_kvmvm" "comp" { #тип - булев #detach_disks = true - #Ффлаг для удаления компьюта + #флаг для удаления компьюта #опциональный параметр #тип - булев #permanently = false + + #конфигурация параметров libvirt virtio интерфейса + #опциональный параметр + #добавление блока возможно только при выключенной виртуальной машине, + #удаление блока удалит настройки только локально, состояние на платформе не изменится + #тип - блок + #libvirt_settings { + #mac адреc + #обязательный параметр + #тип - строка + #mac = "52:54:00:00:19:e1" + + #tx mode + #опциональный параметр + #возможные значения - 'iothread', 'timer' или 'selected by hypervisor' + #тип - строка + #txmode = "iothread" + + #IO event + #опциональный параметр + #возможные значения - 'on', 'off' or 'selected by hypervisor' + #тип - строка + #ioeventfd = "on" + + #event ID + #опциональный параметр + #возможные значения - 'on', 'off' or 'selected by hypervisor' + #тип - строка + #event_idx = "off" + + #количество очередей + #опциональный параметр + #тип - целое число + #queues = "4" + + #длина очереди RX + #опциональный параметр + #тип - целое число + #rx_queue_size = "1024" + + #длина очереди TX + #опциональный параметр + #тип - целое число + #tx_queue_size = "1024" + #} } output "test" { diff --git a/samples/cloudbroker/rg/data_rg/main.tf b/samples/cloudbroker/rg/data_rg/main.tf index 7ef2386..47b27d7 100644 --- a/samples/cloudbroker/rg/data_rg/main.tf +++ b/samples/cloudbroker/rg/data_rg/main.tf @@ -32,11 +32,6 @@ data "decort_cb_rg" "rg" { #обязательный параметр #тип - целое число rg_id = 1022 - - #причина для выполнения действия - #необязятельный параметр - #тип - строка - reason = "TEST" } output "output" { diff --git a/samples/cloudbroker/rg/data_rg_usage/main.tf b/samples/cloudbroker/rg/data_rg_usage/main.tf index d16b565..0680842 100644 --- a/samples/cloudbroker/rg/data_rg_usage/main.tf +++ b/samples/cloudbroker/rg/data_rg_usage/main.tf @@ -32,11 +32,6 @@ data "decort_cb_rg_usage" "rg_usage" { #обязательный параметр #тип - целое число rg_id = 123 - - #причина для действия - #необязательный параметр - #тип - строка - #reason = "TEST" } output "output" { diff --git a/samples/cloudbroker/rg/resource_rg/main.tf b/samples/cloudbroker/rg/resource_rg/main.tf index 7d1ae2e..2bebccc 100644 --- a/samples/cloudbroker/rg/resource_rg/main.tf +++ b/samples/cloudbroker/rg/resource_rg/main.tf @@ -85,6 +85,7 @@ resource "decort_cb_rg" "rg" { #виртуальные машины, созданные в этой RG, по умолчанию будут подключены к этой сети. #Допустимые значения: PRIVATE, PUBLIC, NONE. #необязательный параметр + #по умолчанию: PRIVATE #тип - строка #def_net_type = "NONE" @@ -108,11 +109,6 @@ resource "decort_cb_rg" "rg" { #тип - строка #ext_ip = "1.1.1.1" - #причина выполнения - #необязательный параметр - #тип - строка - #reason = "TEST" - #зарегистрировать компьюты в регистрационной системе #необязательный параметр #тип - булев @@ -138,10 +134,6 @@ resource "decort_cb_rg" "rg" { #разрешенные значения: "R", "RCX" or "ARCXDU" right = "RCX" - #причина запроса - #необязательный параметр - #тип - строка - reason = "test" } #установить сеть по умолчанию @@ -162,11 +154,6 @@ resource "decort_cb_rg" "rg" { #необязательный параметр #тип - целое число net_id = 1234 - - #причина выполнения - #необязательный параметр - #тип - строка - reason = "TEST" } #может ли запуститься ВМ, если ресурсов CPU недостаточно diff --git a/samples/cloudbroker/vins/data_vins/main.tf b/samples/cloudbroker/vins/data_vins/main.tf index 68a0f8d..7e348f9 100644 --- a/samples/cloudbroker/vins/data_vins/main.tf +++ b/samples/cloudbroker/vins/data_vins/main.tf @@ -31,11 +31,6 @@ data "decort_cb_vins" "vins" { #обязательный параметр #тип - целое число vins_id = 10101 - - #причина запроса - #опциональный параметр - #тип - строка - #reason = "report" } output "test" { diff --git a/samples/cloudbroker/vins/data_vins_list_deleted/main.tf b/samples/cloudbroker/vins/data_vins_list_deleted/main.tf index 9730d25..d2c2fc4 100644 --- a/samples/cloudbroker/vins/data_vins_list_deleted/main.tf +++ b/samples/cloudbroker/vins/data_vins_list_deleted/main.tf @@ -52,6 +52,11 @@ data "decort_cb_vins_list_deleted" "vins_list_deleted" { #тип - строка #ext_ip = "test" + #фильтр по VNF Device id + #опциональный параметр + #тип - целое число + #vnf_dev_id = 14 + #сортировка по одному из поддерживаемых полей #опциональный параметр #тип - строка diff --git a/samples/cloudbroker/vins/data_vins_nat_rule_list/main.tf b/samples/cloudbroker/vins/data_vins_nat_rule_list/main.tf index c99bb20..def5d91 100644 --- a/samples/cloudbroker/vins/data_vins_nat_rule_list/main.tf +++ b/samples/cloudbroker/vins/data_vins_nat_rule_list/main.tf @@ -31,11 +31,6 @@ data "decort_cb_vins_nat_rule_list" "vins_nat_rule_list" { #обязательный параметр #тип - целое число vins_id = 10101 - - #причина вызова - #опциональный параметр - #тип - строка - #reason = "test" } output "test" { diff --git a/samples/cloudbroker/vins/resource_vins/main.tf b/samples/cloudbroker/vins/resource_vins/main.tf index 7cb082e..16b5fcb 100644 --- a/samples/cloudbroker/vins/resource_vins/main.tf +++ b/samples/cloudbroker/vins/resource_vins/main.tf @@ -83,11 +83,6 @@ resource "decort_cb_vins" "vins" { #тип - строка #description = "Description" - #причина запроса - #опциональный параметр - #тип - строка - #reason = "test" - #блок для указания списка routes #опциональный параметр #тип - список routes @@ -167,11 +162,6 @@ resource "decort_cb_vins" "vins" { #опциональный параметр #тип - целое число #compute_id = 1234 - - #причина запроса - #опциональный параметр - #тип - строка - #reason = "one more reason" #} #блок для добавления natRule diff --git a/wiki/4.7.0/01.-Введение.md b/wiki/4.7.0/01.-Введение.md new file mode 100644 index 0000000..e1aa752 --- /dev/null +++ b/wiki/4.7.0/01.-Введение.md @@ -0,0 +1,7 @@ +DECORT Terraform Provider версии 4.7.x позволяет управлять облачными ресурсами на платформе Digital Energy Cloud Orchestration Technology (DECORT) версии 4.1.x и выше посредством Terraform. + +С помощью данного провайдера можно организовать программное управление вычислительными ресурсами (_compute_), ресурсными группами, сетевыми и дисковыми ресурсами, образами дисков, кластером, а также другими параметрами облачной платформы DECORT. + +Если вы хорошо знакомы с инструментом Terraform и хотите максимально быстро начать использовать платформу DECORT в своих Terraform-проектах, то можете сразу перейти к разделу [Пример работы](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/02.-Пример-работы.md), где приведён подробно откомментированный пример работы с основными видами ресурсов платформы. Если у вас всё же возникнут вопросы по облачной платформе DECORT и порядку авторизации в ней, то обратитесь к главе [«Обзор облачной платформы DECORT»](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md). Также может оказаться полезной глава [«Инициализация Terraform провайдера DECORT»](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/04.02-Инициализация-Terraform-провайдера-DECORT.md). + +Если вы только начинаете использовать инструмент Terraform и облачную платформу DECORT, то рекомендуем вам начать с главы [«Обзор облачной платформы DECORT»](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md), после чего изучить главы [«_Data source_ функции Terraform провайдера DECORT»](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/06.-Data-source-функции-Terraform-провайдера-DECORT.md) и [«_Resource_ функции Terraform провайдера DECORT»](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/07.-Resource-функции-Terraform-провайдера-DECORT.md). Примеры, приведенные в этих разделах, помогут вам быстро освоить базовые приёмы работы с инструментом Terraform и провайдером DECORT. diff --git a/wiki/4.7.0/02.-Пример-работы.md b/wiki/4.7.0/02.-Пример-работы.md new file mode 100644 index 0000000..4d3f5d2 --- /dev/null +++ b/wiki/4.7.0/02.-Пример-работы.md @@ -0,0 +1,92 @@ +Данный раздел предназначен для тех, кто хорошо знаком с инструментом Terraform, а также имеет представление об основных понятиях и способах авторизации в облачной платформе DECORT. + +Ниже приведён подробно откомментированный пример, показывающий, как создать виртуальный сервер (aka _compute_ на базе системы виртуализации KVM x86) в облачной платформе DECORT с помощью соответствующего Terraform провайдера. Сервер будет создан в новой ресурсной группе, к нему будет подключён один предварительно созданный диск, у сервера будет прямое сетевое подключение во внешнюю сеть. + +Идентификатор образа операционной системы, на базе которого должен быть создан виртуальный сервер, считывается из облачной платформы с помощью _data source_ функции `decort_image`. + +Далее мы с помощью _resource_ функции `decort_resgroup` создаём новую ресурсную группу, в которую будет помещён этот виртуальный сервер. В качестве альтернативы, для получения информации об уже имеющейся ресурсной группе можно использовать _data source_ функцию с таким же названием. + +Затем с помощью _resource_ функции `decort_disk` создаётся диск, который будет подключён к виртуальному серверу в качестве дополнительного. Помимо этого дополнительного диска у сервера будет также и загрузочный диск, на который в процессе создания сервера клонируется выбранный образ операционной системы. + +Виртуальный сервер - в данном примере на базе системы виртуализации KVM x86 - создаётся посредством _resource_ функции `decort_kvmvm`. + +Только авторизованные в контроллере облачной платформы пользователи могут управлять облачными ресурсами. Подробнее о способах авторизации см. [Обзор облачной платформы DECORT](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md). + +```terraform +# 1. Initialize DECORT plugin and connection to DECORT cloud controller +# NOTE: in this example credentials are expected to come from +# DECORT_APP_ID and DECORT_APP_SECRET environmental variables - set them +# in the shell before calling terraform. +# Alternatively you may define plugin parameters app_id and app_secret in +# the TF file, however, this may not be secure if you plan to share this TF +# file with others. + +provider "decort" { + authenticator = "decs3o" + controller_url = "<>" # specify correct DECORT controller URL, e.g. "https://ds1.digitalenergy.online" + oauth2_url = "<>" # specify corresponding DECORT OAUTH2 URL, e.g. "https://sso.digitalenergy.online" + app_id = "<>" # application secret to access DECORT cloud API in 'decs3o' and 'bvs' authentication mode, e.g. "ewqfrvea7s890avw804389qwguf234h0otfi3w4eiu" + app_secret = "<>" # application ID to access DECORT cloud API in 'decs3o' and 'bvs' authentication mode, e.g. "ewqfrvea7s890avw804389qwguf234h0otfi3w4eiu" + # allow_unverified_ssl = true +} + +# 2. Load account to use - new VM will belong to this account +data "decort_account" "my_account" { + account_id = # Specify account ID +} + +# 3. Load OS image to use for VM deployment +data "decort_image" "os_image" { + image_id = # Specify OS image id, e.g. 1234. You can get accessible image id from data source "decort_image_list" +} + +# 4. Create new Resource Group in the selected account, new VM will be created in this RG +resource "decort_resgroup" "my_rg" { + name = "NewRgByTF" + account_id = data.decort_account.my_account.account_id + gid = # Grid (platform) ID + # if you want to set resource quota on this Resource Group, uncomment + # the following code fragment + # quota { + # cpu = 8 # CPU limit + # ram = 8912 # RAM limit in MB + # disk = 96 # disk volume limit in GB + #} +} + +# 5. Create extra disk, which will be attached to the new VM. +# This step is optional - if you do not want extra disks on your VM, skip it +# and comment out extra_disks parameter when creating VM below. +resource "decort_disk" "extra_disk" { + disk_name = "extra-disk-for-vm" + account_id = data.decort_account.my_account.account_id + gid = # Grid (platform) ID + size_max = 5 # disk size in GB + type = "D" # disk type, always use "D" for extra disks + sep_id = data.decort_image.os_image.sep_id # use the same SEP ID as the OS image + pool = "<>" # consult your DECORT platform admin for configured storage pool names +} + +# 6. Create virtual machine (a compute of type KVM VM x86 in this example) +# Now that we have all necessary components at hand, we may create a virtual machine. +# This VM will be based on the previsouly obtained OS image, located in the specified +# Resource Group, directly connected to an external network, have a boot disk of +# specified size and one extra disk attached. +resource "decort_kvmvm" "my_new_vm" { + name = "tf-managed-vm" + driver = "KVM_X86" # Compute virtualization driver + rg_id = decort_resgroup.my_rg.id + cpu = 1 # CPU count + ram = 1024 # RAM size in MB, must be even number, ideally a power of 2 + boot_disk_size = 10 # Boot disk size in GB + image_id = data.decort_image.os_image.image_id + description = "Test KVM VM Compute managed by Terraform" + extra_disks = [ decort_disk.extra_disk.id ] + + network { + net_type = "EXTNET" + net_id = <> # specify external network ID to use, consult your DECORT platform admin for correct IDs + # ip_address = "<>" # you may optionally request a specific IP address + } +} +``` diff --git a/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md b/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md new file mode 100644 index 0000000..938223a --- /dev/null +++ b/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT.md @@ -0,0 +1,31 @@ +## Основные понятия +Ниже перечислены основные понятия с указанием соответствующих им аргументов в Terraform провайдере DECORT. +1. **Контроллер облачной платформы DECORT** – управляющее приложение, которое обеспечивает авторизацию пользователей и оркестрацию облачных ресурсов. + - Адрес контроллера задается в обязательном аргументе `controller_url` на стадии инициализации Terraform провайдера DECORT. Например, `controller_url= "https://ds1.digitalenergy.online"` +2. **Авторизационный провайдер** – приложение, работающее по протоколу Oauth2, предназначенное для выпуска и валидации токенов доступа к контроллеру облачной платформы в соответствующих режимах авторизации. Все действия в платформе должны выполняться авторизованными пользователями, и авторизационное приложение позволяет получить токен доступа, действующий некоторое ограниченное время, наличие которого подтверждает успешную авторизацию. + - Адрес авторизационного провайдера задается в аргументе`oauth2_url` на стадии инициализации Terraform провайдера DECORT. Например `oauth2_url= "https://sso.digitalenergy.online"` +3. **Подписчик** (_account_) – сущность, которая используется для группирования облачных ресурсов по принадлежности к определенному клиенту для целей учета потребления и биллинга. + - Имя подписчика задается аргументом `account_name` при вызове _resource_ или _data_ функций провайдера. Альтернативной является задание численного идентификатора подписчика в аргументе `account_id`. +4. **Пользователь** (_user_) – пользователь облачной инфраструктуры, представленный учетной записью. Чтобы получить возможность управлять облачными ресурсами (например, создавать виртуальные серверы или дискт) пользователь должен быть ассоциирован с одним или несколькими подписчиками и иметь соответствующие права, определяемые ролевой моделью, принятой в облачной платформе DECORT. Для доступа к платформе пользователь должен авторизоваться одним из способов, описанных ниже в разделе «Способы авторизации». +5. **Ресурсная группа** (_resource group_) – способ группирования вычислительных ресурсов (например, виртуальных серверов по функциональному признаку или принадлежности к одному и тому же проекту). Ресурсную группу можно рассматривать как небольшой персональный дата-центр, в котором размещаются один или несколько серверов и виртуальных сетевых сегментов. Ресурсная группа идентифицируется по комбинации параметров `account` и `name`. Обратите внимание, что имя имя ресурсной группы уникально только в рамках одного и того же `account`. +6. **Вычислительный ресурс** (_compute_) - универсальная абстракция пользовательского сервера в платформе DECORT. Благодаря использованию такой абстракции можно, например, создать одну виртуальную машину на базе KVM Intel x86, а другую - на базе KVM IBM Power, а потом управлять ими - изменять количество CPU/RAM, подключать/отключать диски и т.п. - одинаковым образом, не задумываясь об их архитектурных различиях. В то же время, так как типизация ресурсов в Terraform не поддерживает наследование, различные типы вычислительных ресурсов, доступных на платформе DECORT и абстрагируемых через понятие унифицированный _compute_, в Terraform представлены разными типами (напр., свой тип для виртуальных серверов на базе KVM и свой тип для перспективных x86-совместимых bare metal серверов). +7. **Ресурс хранения** (_disk_) - универсальная абстракция дискового ресурса в платформе DECORT. Платформа поддерживает различные типы систем хранения данных, но при этом управление созданными на разных системах хранения дисками осуществляется посредством унифицированного набора действий, например, "подключить диск к _compute_", "увеличить размер диска", "сделать мгновенный снимок диска", "настроить параметры быстродействия диска". +8. **Виртуальный сервер** – экземпляр _compute_, в основе технической реализации которого лежит виртуальная машина, работающая в облаке DECORT и доступна по сети. Виртуальный сервер характеризуется количеством выделенных ему CPU (аргумент`cpu`), объемом ОЗУ (`ram`), размером загрузочного диска (`boot_disk size`). При создании виртуального сервера на загрузочный диск устанавливается образ операционной системы, заданный в аргументе `image_id`. Помимо загрузочного диска к виртуальному серверу можно подключить несколько дисков для хранения прикладных данных, список которых задается аргументами `extra_disks`. Виртуальный сервер идентифицируется по комбинации аргументов `name` (имя сервера) и `rgid` (идентификатор ресурсной группы). Обратите внимание, что имя виртуального сервера `name` уникально только в рамках одной и той же ресурсной группы. +9. **Виртуальный сетевой сегмент** (_Virtual Network Segment_ или _ViNS_) - сетевой сегмент и обеспечивающая его функционирование виртуальная инфраструктура, которые пользователь может создавать для своих нужд на уровне ресурсной группы или подписчика (_account_). ViNS можно создать полностью изолированным от внешних сетей (см. ниже _External Network_) или с подключением во внешнюю сеть. Внутри ViNS работает DHCP-сервис, обеспечивающий управление IP адресами экземпляров _compute_, подключённых в этот ViNS. +10. **Внешняя сеть** (_External Network_) - сетевой сегмент, через который платформа DECORT взаимодействует с внешними по отношению к ней сетевыми ресурсами. Например, в случае с публичным облаком на базе DECORT в качестве внешней сети выступает сеть Интернет. В отличие от ViNS платформа не управляет внешней сетью, а лишь пользуется её ресурсами. В платформе может быть настроено несколько внешних сетей с различными диапазонами IP адресов, и существует механизм управления доступом пользователей к внешним сетям. +11. Сетевой доступ к экземпляру _compute_ (виртуальному серверу) реализуется через его подключение к ViNS и/или прямое подключение во внешнюю сеть (External Network). Один и тот же экземпляр _compute_ может одновременно иметь несколько подключений в разные ViNS и/или различные внешние сети. + +## Способы авторизации +Облачная платформа DECORT поддерживает три базовых типа авторизации: +1. С использованием авторизационного провайдера, работающего по протоколу _Oauth2_. Данный способ является предпочтительным, так как обеспечивает бОльшую гибкость и безопасность. Для авторизации в этом режиме при инициализации Terrafrom провайдера DECORT необходимо указать параметры `oauth2_url` и `controller_url`, а также предоставить одно из нижеперечисленного: + - Комбинация Application ID & Application secret, соответствующих пользователю, от имени которого будет осуществляться управление облачными ресурсами в текущей сессии. В процессе проверки предоставленных Application ID & Application secret модуль получает от авторизационного провайдера токен (JSON Web Token, JWT), который затем используется для доступа к указанному контроллеру DECORT. Для авторизации по данному варианту, при инициализации Terraform провайдера DECORT следует установить аргумент `authenticator=decs3o` и задать аргументы `app_id` и `app_secret` (или определить соответствующие переменные окружения `DECORT_APP_ID` и `DECORT_APP_SECRET`). + - JSON Web Token – заранее полученный от авторизационного провайдера токен доступа, ассоциированный с определенным пользователем, от имени которого будет осуществляться управление облачными ресурсами в текущей сессии. Для авторизации по данному варианту, при инициализации Terraform провайдера DECORT следует установить аргумент `authenticator=jwt` и задать аргумент `jwt` (или определить переменную окружения `DECORT_JWT`). +2. С использованием комбинации _имя пользователя : пароль_. Данный режим не использует внешних авторизационных провайдеров и подразумевает, что пользователь с такой комбинацией зарегистрирован непосредственно на указанном в параметре `controller_url` контроллере облачной платформы DECORT. + - Чтобы провайдер авторизовался по данному варианту, при его инициализации следует установить аргумент `authenticator=legacy` и задать аргументы `user` и `password` (или определить соответствующие переменные окружения `DECORT_USER` и `DECORT_PASSWORD`). +3. С использованием авторизационного провайдера, работающего по протоколу _Oauth2_oidc_. Для авторизации в этом режиме при инициализации Terrafrom провайдера DECORT необходимо указать параметры `oauth2_url` и `controller_url`, а также Application ID & Application secret, _имя пользователя и пароль_, соответствующих пользователю, от имени которого будет осуществляться управление облачными ресурсами в текущей сессии, и _имя домена_. В процессе проверки предоставленных Application ID & Application secret и пары _имя пользователя-пароль_ модуль получает от авторизационного провайдера токен (JSON Web Token, JWT), который затем используется для доступа к указанному контроллеру DECORT. Для авторизации по данному варианту, при инициализации Terraform провайдера DECORT следует установить аргумент `authenticator=bvs`, задать аргументы `app_id` и `app_secret` (или определить соответствующие переменные окружения `DECORT_APP_ID` и `DECORT_APP_SECRET`), `bvs_user` и `bvs_password` (или определить соответствующие переменные окружения `DECORT_BVS_USER` и `DECORT_BVS_PASSWORD`), а также указать `domain` (или определить соответствующие переменные окружения `DECORT_DOMAIN`). + +После успешной авторизации пользователь (или приложение-клиент) получает доступ к ресурсам, находящимся под управлением соответствующего DECORT контроллера. Доступ предоставляется в рамках подписчиков (_account_), с которыми ассоциирован данный пользователь (_user_), и в соответствии с присвоенными ему ролями. + +## Пользовательская и административная группы API +Пользовательская группа API - группа API платформы DECORT, которая позволяет выполнять операции с платформой с правами обычного пользователя. Покрывает большую часть задач. +Административная группа API - группа API платформы DECORT, которая позволяет выполнять операции с платформой с расширенными правами. Данные права подразумевают расширенный перечень операций над ресурсами, расширенный перечень ресурсов, расширенную информацию. Требуются права администратора для взаимодействия с этой группой API. diff --git a/wiki/4.7.0/04.-Начало-работы-с-terraform-провайдером-DECORT.md b/wiki/4.7.0/04.-Начало-работы-с-terraform-провайдером-DECORT.md new file mode 100644 index 0000000..edaa664 --- /dev/null +++ b/wiki/4.7.0/04.-Начало-работы-с-terraform-провайдером-DECORT.md @@ -0,0 +1,6 @@ +Данный раздел описывает: +- Системные требования +- Установку провайдера +- Инициализацию провайдера +- Переключение режима работы между разными группами API +- Получение gid/grid_id площадки diff --git a/wiki/4.7.0/04.01-Установка-Terraform-провайдера-DECORT.md b/wiki/4.7.0/04.01-Установка-Terraform-провайдера-DECORT.md new file mode 100644 index 0000000..f6fe4be --- /dev/null +++ b/wiki/4.7.0/04.01-Установка-Terraform-провайдера-DECORT.md @@ -0,0 +1,150 @@ +## Системные требования + +Для запуска провайдера вам потребуется машина, на которой установлен Terraform. + +Кроме того, в связи с тем, что начиная с версии 0.12 Terraform изменил алгоритм поиска и инициализации локальных провайдеров, настройка данного провайдера для работы с Terraform 0.12 или более новыми версиями потребует выполнения ряда дополнительных действий. Подробнее см. [8.3 Настройка локального провайдера для работы с новыми версиями Terraform](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/08.-Полезные-советы#user-content-8-3-настройка-локального-провайдера-для-работы-с-новыми-версиями-terraform.md). + +## Установка +Начиная с версии провайдера `4.3.0` в релизном архиве находятся скрипты-инсталляторы. +Чтобы выполнить установку, необходимо: +1. Перейти по адресу: https://repository.basistech.ru/BASIS/terraform-provider-decort/releases +2. Выбрать необходимую версию провайдера подходящую под операционную систему. +3. Скачать архив. +4. Распаковать архив. +5. Выполнить скрипт установщика, `install.sh` или `install.bat` для Windows.
+*Для запуска `install.sh` не забудьте изменить права доступа к файлу* +```bash +chmod u+x install.sh +``` +6. Дождаться сообщения об успешной установке. Установщик выведет актуальный блок конфигурации провайдера, скопируйте его +```bash +DECORT provider version 4.3.0 has been successfully installed + +Copy this provider configuration to main.tf file: +terraform { + required_providers { + decort = { + version = "4.3.0" + source = "basis/decort/decort" + } + } +} +``` +7. После этого, создайте файл `main.tf` в рабочей директории, которая может находится в любом удобном для пользователя месте. +В данном примере, рабочая директория с файлом main.tf находится по пути: +```bash +~/work/tfdir/main.tf +``` +8. Вставьте в `main.tf` блок конфигурации провайдера, который был выведен на экран установщиком: +```terraform +terraform { + required_providers { + decort = { + version = "4.3.0" + source = "basis/decort/decort" + } + } +} +``` +9. Добавьте в файл блок с инициализацией провайдера. +```terraform +provider "decort" { + authenticator = "decs3o" + controller_url = "https://mr4.digitalenergy.online" + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} +``` + +10. В консоли выполните команду +```bash +terraform init +``` + +11. В случае успешной установки, Terraform инициализирует провайдер и будет готов к дальнейшей работе. + +## Установка из релизов +Terraform провайдер DECORT имеет скомпилированные релизные версии, которые расположены по адресу: [Релизы](https://repository.basistech.ru/BASIS/terraform-provider-decort/releases). +Чтобы выполнить установку из релиза, необходимо: +1. Перейти по адресу: https://repository.basistech.ru/BASIS/terraform-provider-decort/releases +2. Выбрать необходимую версию провайдера подходящую под операционную систему. +3. Скачать архив. +4. Распаковать архив. +5. Полученный файл (в директории `bin/`) необходимо поместить: +Linux: +```bash +~/.terraform.d/plugins/${host_name}/${namespace}/${type}/${version}/${target} +``` +Windows: +```powershell +%APPDATA%\terraform.d\plugins\${host_name}\${namespace}\${type}\${version}\${target} +``` +Где: +- host_name - имя хоста, держателя провайдера, например, basis +- namespace - пространство имен хоста, например decort +- type - тип провайдера, может совпадать с пространством имен, например, decort +- version - версия провайдера, например 4.3.0 +- target - архитектура операционной системы, например windows_amd64 + +В примере ниже используется путь до провайдера на машине с ОС Linux: + +```bash +~/.terraform.d/plugins/basis/decort/decort/4.3.0/linux_amd64/tf-provider + ^ ^ ^ ^ ^ ^ + host_name | | | | | | + | | | | | + namespace | | | | | + | | | | + type | | | | + | | | + version | | | + | | + target | | + | + исполняемый файл | +``` + +6. После этого, создайте файл `main.tf` в рабочей директории, которая может находится в любом удобном для пользователя месте. +В данном примере, рабочая директория с файлом main.tf находится по пути: +```bash +~/work/tfdir/main.tf +``` +7. Добавьте в `main.tf` следующий блок +```terraform +terraform { + required_providers { + decort = { + version = "4.3.0" + source = "basis/decort/decort" + } + } +} +``` +В поле `version` указывается версия провайдера. +
+**ВНИМАНИЕ: Версии в блоке и в пути к исполняемому файлу провайдера должны совпадать!** + +В поле `source` помещается путь до репозитория с версией вида: + +```bash +${host_name}/${namespace}/${type} +``` + +**ВНИМАНИЕ: Версии в блоке и в пути к исполняемому файлу провайдера должны совпадать!** + +8. Добавьте в файл блок с инициализацией провайдера. +```terraform +provider "decort" { + authenticator = "decs3o" + controller_url = "https://mr4.digitalenergy.online" + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} +``` + +9. В консоли выполните команду +```bash +terraform init +``` + +10. В случае успешной установки, Terraform инициализирует провайдер и будет готов к дальнейшей работе. diff --git a/wiki/4.7.0/04.02-Инициализация-Terraform-провайдера-DECORT.md b/wiki/4.7.0/04.02-Инициализация-Terraform-провайдера-DECORT.md new file mode 100644 index 0000000..f20597d --- /dev/null +++ b/wiki/4.7.0/04.02-Инициализация-Terraform-провайдера-DECORT.md @@ -0,0 +1,64 @@ +## Список аргументов для инициализации +Перед началом использования любой Terraform провайдер должен быть инициализирован. + +В процессе инициализации Terraform провайдера DECORT проверяется корректность переданных аргументов и выполняется авторизация в указанном контроллере облачной инфраструктуры. Подробнее о способах авторизации в платформе DECORT смотри соответствующий [раздел](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.7.0/03.-Обзор-облачной-платформы-DECORT#user-content-способы-авторизации.md). + +При инициализации Terraform провайдера DECORT используются следующие аргументы: + +| Аргумент | Переменная окружения | Описание | +| --- | --- | --- | +| allow_unverified_ssl | - | Если данный аргумент явно установлен в `true`, то провайдер **не будет** проверять SSL сертификаты при взаимодействии с авторизационным сервисом OAuth2 и контроллером облачной платформы.
Отключение проверок может быть полезным при работе в доверенной среде, использующей самоподписанные SSL сертификаты. Однако, так как отключение проверок несёт потенциальные риски безопасности, данную настройку следует использовать с осторожностью.
Разрешённые значения: `false` (значение по умолчанию) и `true`. | +| app_id | DECORT_APP_ID | Идентификатор приложения (клиента) для авторизации в контроллере облачной платформы в режиме `decs3o` или `bvs`.
Аргументы `app_id` и `app_secret` являются обязательными для режимов авторизации `authenticator=decs3o` и `authenticator=bvs`.
Если `app_id` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_APP_ID`. | +| app_secret | DECORT_APP_SECRET | Секретный код приложения (клиента) для авторизации в контроллере облачной платформы в режиме `decs3o` или `bvs`.
Аргументы `app_id` и `app_secret` являются обязательными для режимов авторизации `authenticator=decs3o` и `authenticator=bvs`.
Если `app_secret` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_APP_SECRET`. | +| authenticator | - | Режим авторизации при подключении к контроллеру облачной платформы.
Доступные режимы: `decs3o`, `legacy`, `jwt` или `bvs`.
Данный аргумент является обязательным. | +| bvs_user | DECORT_BVS_USER | Имя пользователя для авторизации в контроллере облачной платформы в режиме `bvs`.
Аргументы `bvs_password` и `bvs_user` являются обязательными для режима авторизации `authenticator=bvs`.
Если `bvs_user` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_BVS_USER`. | +| bvs_password | DECORT_BVS_PASSWORD | Пароль пользователя для авторизации в контроллере облачной платформы в режиме `bvs`.
Аргументы `bvs_user` и `bvs_password` являются обязательными для режима авторизации `authenticator=bvs`.
Если `bvs_password` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_BVS_PASSWORD`. | +| domain | DECORT_DOMAIN | Имя домена в контроллере облачной платформы в режиме `bvs`.
Данный аргумент является обязательным.
Если `domain` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_DOMAIN`. | +| controller_url | DECORT_CONTROLLER_URL | URL контроллера облачной платформы, через который будет осуществляться управление облачными ресурсами.
Данный аргумент является обязательным. | +| jwt | DECORT_JWT | JSON Web Token (JWT), который используется для авторизации в контроллере облачной платформы в режиме `jwt`.
Данный аргумент является обязательным для режима авторизации `authenticator=jwt`.
Если `jwt` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_JWT` | +| oauth2_url | DECORT_OAUTH2_URL | URL авторизационного сервиса OAuth2, который используется для управления доступом пользователей (или программных клиентов) к контроллеру облачной платформы.
Данный аргумент является обязательным для режимов авторизации `authenticator=decs3o`, `authenticator=bvs` и `authenticator=jwt`.
Если `oauth2_url` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_OAUTH2_URL` | +| password | DECORT_PASSWORD | Пароль для авторизации в контроллере облачной платформы в режиме `legacy`.
Аргументы `password` и `user` являются обязательными для режима авторизации `authenticator=legacy`.
Если `password` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_PASSWORD`. | +| user | DECORT_USER | Имя пользователя для авторизации в контроллере облачной платформы в режиме `legacy`.
Аргументы `user` и `password` являются обязательными для режима авторизации `authenticator=legacy`.
Если `user` не задан в tf-файле, то провайдер будет использовать значение из переменной окружения `DECORT_USER`. | + +## Пример инициализации в режиме авторизации `decs3o` +Пример инициализации Terraform провайдера DECORT: +```terraform +provider "decort" { + authenticator = "decs3o" + controller_url = "https://ctrl.decort.online" + oauth2_url = "https://oauth2.decort.online:7777" +} +``` + +В данном примере используется режим авторизации `decs3o`. + +Как отмечено выше, в данном режиме требуется указать аргументы `app_id` и `app_secret`, идентифицирующие пользователя (или приложение-клиент), от лица которого будут выполняться дальнейшие действия. Однако, так как данная информация является конфиденциальной (по сути, она эквивалентна паре _имя пользователя : пароль_), то в общем случае заносить такого рода данные в tf-файл не следует. Рекомендуется определять в среде запуска Terraform переменные окружения `DECORT_APP_ID` и `DECORT_APP_SECRET`, из которых провайдер извлечёт нужные данные. Приведенный пример подразумевает, что нужная информация будет получена из этих переменных окружения. + +Пользователь, от лица которого Terrafrom будет выполнять действия в облачной платформе, должен заранее создать пару _Application ID_ и _Application Secret_ в авторизационном приложении OAuth2. Именно эти значения, а также URL авторизационного приложения Oauth2, должны присваиваться аргументам `app_id`, `app_secret` и `oauth2_url` соответственно для успешной инициализации провайдера. + +Также обратите внимание на формат задания аргументов `controller_url` и `oauth2_url`. В общем случае они должны содержать идентификатор протокола (_https://_) и сетевой порт, если он отличается от порта по умолчанию (в примере для авторизационного сервиса OAuth2 указан порт _7777_). Эту информацию вы можете узнать у администратора вашей облачной инфраструктуры DECORT. + +## Пример инициализации в режиме авторизации `bvs` +Пример инициализации Terraform провайдера DECORT: +```terraform +provider "decort" { + authenticator = "bvs" + controller_url = "https://delta.qa.loc" + oauth2_url = "https://bvs-delta.qa.loc:8443" + app_id = "delta" + app_secret = "" + bvs_password = "" + bvs_user = "" + domain = "dynamix" +} +``` + +В данном примере используется режим авторизации `bvs`. + +Как отмечено выше, в данном режиме требуется указать аргументы `app_id` - идентификатор площадки - delta, alpha, poc, etc. Можно найти на странице администратора по следующему пути: вкладка безопасность - клиентские сервисы - наименование площадки. `app_secret` - пароль площадки. Можно найти на странице администратора по следующему пути: вкладка безопасность - клиентские сервисы - наименование площадки (символ i) - поле "Пароль". Однако, так как данная информация является конфиденциальной, то в общем случае заносить такого рода данные в tf-файл не следует. Рекомендуется определять в среде запуска Terraform переменные окружения `DECORT_APP_ID` и `DECORT_APP_SECRET`, из которых провайдер извлечёт нужные данные. Приведенный пример подразумевает, что нужная информация будет получена из этих переменных окружения. +Также обязательными аргументами являются: `bvs_user` - имя пользователя, `bvs_password` - пароль пользователя. Рекомендуется не заносить их в tf-файл, а определять в среде запуска Terraform переменные окружения `DECORT_BVS_USER` и `DECORT_BVS_PASSWORD`, из которых провайдер извлечёт нужные данные. Приведенный пример подразумевает, что нужная информация будет получена из этих переменных окружения. +Домен для подключения `domain` - указывается наименование площадки. Данный аргумент является обязательным. Рекомендуется не заносить его в tf-файл, а определять в среде запуска Terraform переменную окружения `DECORT_DOMAIN`, из которой провайдер извлечёт нужные данные. Приведенный пример подразумевает, что нужная информация будет получена из этих переменных окружения. + +Пользователь, от лица которого Terrafrom будет выполнять действия в облачной платформе, должен заранее получить от администратора _Application ID_ и _Application Secret_, _bvs user_ и _bvs password_, а также _domain_. А также осуществить первичный вход на платформу посредством браузера. + +Также обратите внимание на формат задания аргументов `controller_url` и `oauth2_url`. В общем случае они должны содержать идентификатор протокола (_https://_) и сетевой порт, если он отличается от порта по умолчанию (в примере для авторизационного сервиса OAuth2 указан порт _8443_). Эту информацию вы можете узнать у администратора вашей облачной инфраструктуры DECORT. diff --git a/wiki/4.7.0/04.03-Переключение-между-группами-API.md b/wiki/4.7.0/04.03-Переключение-между-группами-API.md new file mode 100644 index 0000000..fb722ac --- /dev/null +++ b/wiki/4.7.0/04.03-Переключение-между-группами-API.md @@ -0,0 +1,38 @@ +Так как платформа DECORT предоставляет для работы две группы API, то terraform провайдер позволяет свободно переключать режимы работы между этими группами. +По умолчанию стоит пользовательская группа API. Ее можно сменить на административную группу. +Если прав у пользователя будет достаточно, то запрос будет выполнен, если нет, то будет ошибка: +```bash +Permission denied +``` +Которая говорит о том, что прав недостаточно. Тогда для выполнения операции обратитесь к администратору платформы. +Установка режима взаимодействия с группами API осуществляется через установку переменной окружения _DECORT_ADMIN_MODE_. +Для более подробного описания возможностей каждой группы API см. соответствующий раздел. + +## Переключение режима работы в Windows +Используйте сл. команду: +```Powershell +$Env:DECORT_ADMIN_MODE=1 +``` +Для отключения: +```Powershell +$Env:DECORT_ADMIN_MODE=0 +``` +## Переключение режима работы в Linux +Используйте сл. команду: +```bash +DECORT_ADMIN_MODE=1 +``` +или +```bash +export DECORT_ADMIN_MODE=1 +``` +Для отключения: +```bash +DECORT_ADMIN_MODE=0 +``` +или +```bash +export DECORT_ADMIN_MODE=0 +``` +**ОБРАТИТЕ ВНИМАНИЕ** +Переменные окружения создаются для терминальной сессии. В сл. раз их придется задавать еще раз, если требуется режим, отличный от пользовательского. diff --git a/wiki/4.7.0/04.04-Получение-gid-или-grid_id.md b/wiki/4.7.0/04.04-Получение-gid-или-grid_id.md new file mode 100644 index 0000000..4b316ac --- /dev/null +++ b/wiki/4.7.0/04.04-Получение-gid-или-grid_id.md @@ -0,0 +1,31 @@ +Платформа может располагаться на нескольких площадках(grid). +Такие площадки имеют свой id. +Для создания некоторых ресурсов требуется ввести grid_id или gid площадки. +Получение gid различается для пользовательского и административного API. + +## Получение gid для пользовательского API +Для получения gid с помощью пользовательского API, необходимо получить информацию из _data_source_ функции _decort_locations_list_, как указано ниже: +```terraform +data "decort_locations_list" "ll" { + +} + +output "test" { + value = data.decort_locations_list.ll +} +``` +В файл состояния будет сохранен результат, где можно посмотреть доступные для работы площадки. + +## Получение gid для административного API +Для получения gid с помощью административного API, необходимо получить информацию из _data_source_ функции _decort_grid_list_, как указано ниже: +```terraform +data "decort_grid_list" "gl" { + +} + +output "test" { + value = data.decort_grid_list.gl +} + +``` +В файл состояния будет сохранен результат, где можно посмотреть доступные для работы площадки. diff --git a/wiki/4.7.0/04.05-Сборка-terraform-провайдера-в-образ.md b/wiki/4.7.0/04.05-Сборка-terraform-провайдера-в-образ.md new file mode 100644 index 0000000..02bc8b7 --- /dev/null +++ b/wiki/4.7.0/04.05-Сборка-terraform-провайдера-в-образ.md @@ -0,0 +1,43 @@ +Образ приложения - современный способ запуска приложений. Образ приложения представляет собой контейнер, в который входит ОС и необходимые для работы приложения пакеты. +Способов создать образ приложения довольно много, для этого существуют программы контейнеризации: +- Docker +- Podman +- и другие +Образ представляет собой "зафиксированную" версию приложения, что означает, что никакие изменения в приложения внесены быть не могут. Так же означает то, что приложение не может создавать побочные файлы при работе. +Контейнер - это запущенный экземпляр образа. То есть, один образ может порождать множество контейнеров, каждый из которых будет включать в себя отдельный экземпляр приложения. +Одно из преимуществ работы приложения в контейнере - кроссплатформенность. Это преимущество обуславливается тем, что образ приложения уже включает в себя все необходимое для успешной работы приложения, в том числе операционную систему. Поэтому, пользователю достаточно установить на вычислительной машине программу, которая обеспечивает работу с образами приложений. + +## Docker +Docker является одной из самых популярных программ для работы с образами. +Docker позволяет: +- Создавать образы +- Запускать контейнеры +- Управлять контейнерами +- Управлять образами +Скачать и установить Docker можно по ссылке https://docs.docker.com/get-docker/ + +## Сборка terraform провайдера +### Требования: +- Docker +- git +- Компилятор языка GO += make +### Установка необходимых программ +1. Компилятор языка GO можно скачать и установить по ссылке: https://go.dev/dl/ +2. Docker можно скачать и установить по ссылке выше. +3. Git можно скачать и установить по ссылке: https://git-scm.com/ +4. Программа make входит в пакет установленных программ для ОС Linux. Для Windows можно воспользоваться инструкцией со stack overflow: https://stackoverflow.com/questions/32127524/how-to-install-and-use-make-in-windows +### Порядок действий +1. Склонировать репозиторий с провайдером: +```bash +git clone https://github.com/rudecs/terraform-provider-decort.git +``` +2. Перейти в директорию со скачанным кодом: +```bash +cd terraform-provider-decort +``` +3. Выполнить команду: +```bash +make image +``` +В результате выполнения данной последовательности, будет создан docker образ, который содержит в себе приложение terraform, terraform провайдер. diff --git a/wiki/4.7.0/05.-Работа-с-terraform.md b/wiki/4.7.0/05.-Работа-с-terraform.md new file mode 100644 index 0000000..675f2ea --- /dev/null +++ b/wiki/4.7.0/05.-Работа-с-terraform.md @@ -0,0 +1,4 @@ +Раздел описывает некоторые практики работы с terraform, которые могут быть полезны пользователю. +Раздел включает в себя следующие статьи: +- Импортирование ресурсов +- Работа с таймаутами diff --git a/wiki/4.7.0/05.01-Импортирование-ресурсов.md b/wiki/4.7.0/05.01-Импортирование-ресурсов.md new file mode 100644 index 0000000..8a419d3 --- /dev/null +++ b/wiki/4.7.0/05.01-Импортирование-ресурсов.md @@ -0,0 +1,75 @@ +Импортирование ресурсов в terraform позволяет привести в соответствие состояние terraform (.tfstate) к состоянию ресурса в платформе. +Необходимость такого приведения возникает в нескольких случаях: +- Ресурс был создан через портал платформы, работа продолжается через terraform провайдер, +- Ресурс был создан через terraform провайдер, однако был изменен через портал платформы, +- Ресурс был создан через terraform провайдер, однако был изменен другим пользователем через terraform провайдер, +- И так далее + +Такие расхождения в состоянии ресурсов нередки, путей их решения несколько: +- Использовать импортирование ресурсов, +- Использовать общие файлы состояний ресурсов, к которым будут иметь доступ все участники, занятые в работе с платформой. +В текущем разделе рассматривается первый вариант. + +## Импортирование ресурсов +Импортирование ресурсов позволяет совершить запрос к платформе, чтобы сформировать файл состояния. +Чтобы совершить импортирование ресурсов необходимо ввести сл. команду: +```bash +terraform import . +``` +## Пример +Предположим, что у нас ресурс, описывающий диск: +```terraform +resource "decort_disk" "disk" { + account_id = 121212 + gid = 3333 + disk_name = "mySuperDisk" + size_max = 100500 +} +``` +Если запустить команду: +```bash +terraform apply +``` +То у нас будет создан новый диск. +Но, такой диск уже есть на площадке и мы хотели бы сформировать .tfstate для этого ресурса. +Поэтому, для начала, необходимо получить список дисков: +```terraform +data "decort_disk_list" "dl"{ + +} +output "test" { + value = data.decort_disk_list.dl +} +``` +В полученных данных необходимо найти требуемый диск, получить его id - параметр disk_id. Пусть это будет - 777777 +Теперь можно выполнить импортирование: +```bash +terraform import decort_disk.disk 777777 +``` +Команда должна успешно завершиться, появиться файл состояний, который позволит манипулировать ресурсом. + +## Ошибки при импортировании +При импортировании ресурса может возникнуть сл. ошибка: +```bash +Error: : required field is not set +``` +Где - наименование поля. +Ошибка возникает в том случае, если в описании ресурса отсутствует обязательное поле. +Например: +```terraform +resource "decort_disk" "disk" { + account_id = 121212 + gid = 3333 + size_max = 100500 +} +``` +В приведенном выше описании отсутствует поле disk_name, поэтому, при попытке импортирования возникнет ошибка. +Для ее устранения, необходимо выполнить запрос на получение списка дисков, найти недостающее поле, после чего добавить его в описание ресурса. +После этого повторить попытку импортирования. + +## Общий алгоритм устранения ошибок +1. Выполнить запрос импортирования +2. В случае ошибки - внести недостающие поля. +3. Повторить п.1. + + diff --git a/wiki/4.7.0/05.02-Работа-с-таймаутами.md b/wiki/4.7.0/05.02-Работа-с-таймаутами.md new file mode 100644 index 0000000..9a739b4 --- /dev/null +++ b/wiki/4.7.0/05.02-Работа-с-таймаутами.md @@ -0,0 +1,100 @@ +Terraform провайдер DECORT поддерживает тонкую настройку таймаутов выполнения запросов к платформе. Таймауты необходимы для определения максимального времени выполнения запроса. При превышении этого времени соединение рвется и запрос считается невыполненным. +Таймауты применяются при работе с _resource_ функциями провайдера. _Data source_ функции по-умолчанию имеют таймаут в 20 минут и изменяться не может. + +## Стандартные таймауты terraform +| Операция | Время | Описание | +| --- | --- | --- | +| create | 20 минут | Создание ресурса | +| read | 20 минут | Чтение ресурса | +| update | 20 минут | Обновление ресурса | +| delete | 20 минут | Удаление ресурса | +| default | 20 минут | Значение по умолчанию. Устанавливает значение для всех операций | + +## Стандартные таймауты провайдера DECORT +В провайдере DECORT таймауты переопределены для того, чтобы уменьшить нагрузку на платформу. +| Операция | Время | Описание | +| --- | --- | --- | +| create | 10 минут | Создание ресурса | +| read | 5 минут | Чтение ресурса | +| update | 5 минут | Обновление ресурса | +| delete | 5 минут | Удаление ресурса | +| default | 5 минут | Значение по умолчанию. Устанавливает значение для всех операций | + +## Установка таймаутов +Все таймауты можно установить самостоятельно для каждого ресурса. +Для этого используется блок _timeouts_, который имеется в каждом ресурсе провайдера. +Пример: +```terraform +resource "decort_res" "res_name" { + timeouts { + create = "10m" + update = "1m" + delete = "2m" + read = "7m" + #default = "15m" + } +} +``` +Где: +- create - операция создания ресурса +- read - операция чтения ресурса +- update - операция обновления ресурса +- delete - операция удаления ресурса +- default - установит заданное время для всех операций +## Формат установления времени +Как видно из примера выше, провайдер принимает на вход строку вида: +``` +"" +``` +Где: +- time-num - число +- time-val - сокращенная запись значения временного отрезка. + +Таблица с временными отрезками: + +| Отрезок | Значение | +| --- | --- | +| n | наносекунда | +| ms | миллисекунда | +| s | секунда | +| m | минута | +| h | час | + +Примеры: +``` +"10m" +"1s" +"1h10m" +``` +И так далее + +## Работа с таймером через .tf-файл +В .tf-файле, в блоке ресурса можно задавать таймауты для операций над ресурсом, однако, при работе с таймаутом, следует помнить о правиле: +__В случае изменения таймаутов в .tf-файле, операции с новыми таймаутами будут производиться только после apply/plan/destroy__ +То есть, если изменить таймауты и выполнить операцию, то она выполнится со старыми таймаутами, а сл. операция уже будет выполнена с новыми таймаутами. +Это объясняется тем, что значения таймаутов считываются из файла состояний .tfstate при выполнении операции, и новые значения таймаутов попадут туда только при успешно выполненной операции. + +## Ошибки при работе с таймаутом +### context deadline exceeded +Если время таймаута слишком короткое, то можно получить сл. ошибку: +``` +context deadline exceeded +``` +Которая говорит, что было выполнено прерывание работы программы из-за истечения времени на операцию. +Для исправления можно увеличить размер окна таймаута и выполнить успешный запрос (например, с помощью терминала), чтобы новое значения таймаутов было добавлено в .tfstate. В противном случае, файл состояния придется править в ручную, либо удалить его и импортировать ресурс для формирования .tfstate. + +### 504 ошибка +Данная ошибка говорит о том, что сервер принудительно разорвал соединения из-за истечения времени на ответ. +В случае получения данной ошибки, обратитесь в службу технической поддержки. + +## Работа с таймаутами через терминал +Сл. команда выполнит операцию terraform с заданным таймаутом: +```bash +timeout