diff --git a/decort/resource_account.go b/decort/resource_account.go index 05cd238..a113092 100644 --- a/decort/resource_account.go +++ b/decort/resource_account.go @@ -69,24 +69,56 @@ func resourceAccountCreate(d *schema.ResourceData, m interface{}) error { if resLimits, ok := d.GetOk("resource_limits"); ok { resLimit := resLimits.([]interface{})[0] resLimitConv := resLimit.(map[string]interface{}) - if resLimitConv["cu_m"] != nil { - urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + maxMemCap := int(resLimitConv["cu_m"].(float64)) + if maxMemCap == 0 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap)) + } } if resLimitConv["cu_d"] != nil { - urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + maxDiskCap := int(resLimitConv["cu_d"].(float64)) + if maxDiskCap == 0 { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap)) + } } if resLimitConv["cu_c"] != nil { - urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + maxCPUCap := int(resLimitConv["cu_c"].(float64)) + if maxCPUCap == 0 { + urlValues.Add("maxCPUCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap)) + } + } if resLimitConv["cu_i"] != nil { - urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + maxNumPublicIP := int(resLimitConv["cu_i"].(float64)) + if maxNumPublicIP == 0 { + urlValues.Add("maxNumPublicIP", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP)) + } + } if resLimitConv["cu_np"] != nil { - urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + maxNP := int(resLimitConv["cu_np"].(float64)) + if maxNP == 0 { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP)) + } + } if resLimitConv["gpu_units"] != nil { - urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + gpuUnits := int(resLimitConv["gpu_units"].(float64)) + if gpuUnits == 0 { + urlValues.Add("gpu_units", strconv.Itoa(-1)) + } else { + urlValues.Add("gpu_units", strconv.Itoa(gpuUnits)) + } } } @@ -223,22 +255,55 @@ func resourceAccountEdit(d *schema.ResourceData, m interface{}) error { resLimitConv := resLimit.(map[string]interface{}) if resLimitConv["cu_m"] != nil { - urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + maxMemCap := int(resLimitConv["cu_m"].(float64)) + if maxMemCap == 0 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap)) + } } if resLimitConv["cu_d"] != nil { - urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + maxDiskCap := int(resLimitConv["cu_d"].(float64)) + if maxDiskCap == 0 { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap)) + } } if resLimitConv["cu_c"] != nil { - urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + maxCPUCap := int(resLimitConv["cu_c"].(float64)) + if maxCPUCap == 0 { + urlValues.Add("maxCPUCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap)) + } + } if resLimitConv["cu_i"] != nil { - urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + maxNumPublicIP := int(resLimitConv["cu_i"].(float64)) + if maxNumPublicIP == 0 { + urlValues.Add("maxNumPublicIP", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP)) + } + } if resLimitConv["cu_np"] != nil { - urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + maxNP := int(resLimitConv["cu_np"].(float64)) + if maxNP == 0 { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP)) + } + } if resLimitConv["gpu_units"] != nil { - urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + gpuUnits := int(resLimitConv["gpu_units"].(float64)) + if gpuUnits == 0 { + urlValues.Add("gpu_units", strconv.Itoa(-1)) + } else { + urlValues.Add("gpu_units", strconv.Itoa(gpuUnits)) + } } urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) diff --git a/samples/resource_account/main.tf b/samples/resource_account/main.tf index 1b456be..f8bcf72 100644 --- a/samples/resource_account/main.tf +++ b/samples/resource_account/main.tf @@ -1,16 +1,16 @@ /* Пример использования -Ресурса cdrom image +Ресурса account Ресурс позволяет: -1. Создавать образ -2. Редактировать образ -3. Удалять образ +1. Создавать аккаунт +2. Редактировать аккаунт +3. Удалять аккаунт */ #Расскомментируйте этот код, #и внесите необходимые правки в версию и путь, #чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером - +/* terraform { required_providers { decort = { @@ -19,7 +19,7 @@ terraform { } } } - +*/ provider "decort" { authenticator = "oauth2" @@ -31,26 +31,126 @@ provider "decort" { } resource "decort_account" "a" { - #id аккаунта + #имя аккаунта + #обязательный параметр + #тип - строка + #используется при создании и редактировании аккаунта + account_name = "new_my_account" + + #имя пользователя - создателя аккаунта #обязательный параметр + #тип - строка + username = "username@decs3o" + + #доступность аккаунта + #необязательный параметр + #тип - будев тип + #может применяться при редактировании аккаунта + enable = true + + #id аккаунта, позволяет сформировать .tfstate, если аккаунт имеет в платформе + #необязательный параметр #тип - число - account_id = 11111 - account_name = "new_my_account" - username = "isername@decs3o" - enable = true + account_id = 11111 + + #электронная почта, на которую будет отправлена информация о доступе + #необязательный параметр + #тип - строка + #применяется при создании аккаунта + emailaddress = "fff@fff.ff" + + #отправлять ли на электронную почту письмо о доступе + #необязательный параметр + #тип - булев тип + #применяется при создании аккаунта и редактировании аккаунта send_access_emails = true + + #добавление/редактирование/удаление пользователей, к которым привязан аккаунт + #необязательный параметр + #тип - объект, кол-во таких объектов не ограничено /*users { + #id пользователя + #обязательный параметр + #тип - строка user_id = "username_2@decs3o" + + #тип доступа пользователя + #обязательный параметр + #тип - строка + #возможные параметры: + #R - чтение + #RCX - запись + #ARCXDU - админ access_type = "R" + + #рекурсивное удаление пользователя из всех ресурсов аккаунтов + #необязательный параметр + #тип - булев тип + #по-умолчанию - false + #применяется при удалении пользователя из аккаунта + recursive_delete = true } users { user_id = "username_1@decs3o" access_type = "R" }*/ + + #ограничение используемых ресурсов + #необязательный параметр + #тип - объект + #используется при создании и редактировании resource_limits { + #кол-во используемых ядер cpu + #необязательный параметр + #тип - ичсло + #если установлена -1 - кол-во неограичено + cu_c = 2 + + #кол-во используемой RAM в МБ + #необязательный параметр + #тип - ичсло + #если установлена -1 - кол-во неограичено cu_m = 1024 + + #размер дисков, в ГБ + #необязательный параметр + #тип - ичсло + #если установлена -1 - размер неограичен + cu_d = 23 + + #кол-во используемых публичных IP + #необязательный параметр + #тип - ичсло + #если установлена -1 - кол-во неограичено + cu_i = 2 + + #ограничения на кол-во передачи данных, в ГБ + #необязательный параметр + #тип - ичсло + #если установлена -1 - кол-во неограичено + cu_np = 2 + + #кол-во графических процессоров + #необязательный параметр + #тип - ичсло + #если установлена -1 - кол-во неограичено + gpu_units = 2 } + #восстановление аккаунта + #необязательный параметр + #тип - булев тип + #применяется к удаленным аккаунтам + #по-умолчанию - false + #retore = false + + #мгновеное удаление аккаунта, если да - то аккаунт невозможно будет восстановить + #необязательный параметр + #тип - булев тип + #используется при удалении аккаунта + #по-умолчанию - false + #permanently = true + }