/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>

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 lb

import (
	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func dsLBSchemaMake() map[string]*schema.Schema {
	sch := map[string]*schema.Schema{
		"lb_id": {
			Type:     schema.TypeInt,
			Required: true,
		},
		"account_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"ha_mode": {
			Type:     schema.TypeBool,
			Computed: true,
		},
		"ckey": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"zone_id": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"meta": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Schema{
				Type: schema.TypeString,
			},
		},
		"acl": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"backend_haip": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"backends": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"algorithm": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"server_default_settings": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"downinter": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"fall": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"inter": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"maxconn": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"maxqueue": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"rise": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"slowstart": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"weight": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"servers": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"address": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"check": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"port": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"server_settings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"downinter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"fall": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"inter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxconn": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxqueue": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"rise": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"slowstart": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"weight": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
							},
						},
					},
				},
			},
		},
		"desc": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"dp_api_password": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"dp_api_user": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"extnet_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"frontend_haip": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"frontends": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"bindings": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"address": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"port": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
				},
			},
		},
		"gid": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"guid": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"manager_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"manager_type": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"image_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"milestones": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"name": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"part_k8s": {
			Type:     schema.TypeBool,
			Computed: true,
		},
		"primary_node": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"compute_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"mgmt_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"network_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"rg_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"secondary_node": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"compute_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"mgmt_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"network_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"status": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"tech_status": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"user_managed": {
			Type:     schema.TypeBool,
			Computed: true,
		},
		"vins_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
	}

	return sch
}

func dsLBListDeletedSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"by_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by ID",
		},
		"name": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by name",
		},
		"account_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by Account ID",
		},
		"rg_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by RG ID",
		},
		"tech_status": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by TechStatus",
		},
		"front_ip": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by FrontIP",
		},
		"back_ip": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by BackIP",
		},
		"sort_by": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "sort by one of supported fields, format +|-(field)",
		},
		"page": {
			Type:     schema.TypeInt,
			Optional: true,
			Default:  0,
		},
		"size": {
			Type:     schema.TypeInt,
			Optional: true,
			Default:  0,
		},
		"items": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"ha_mode": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"acl": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"backend_haip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"zone_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"backends": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"algorithm": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"zone_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"server_default_settings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"downinter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"fall": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"inter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxconn": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxqueue": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"rise": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"slowstart": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"weight": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
								"servers": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"address": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"check": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"name": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"port": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"server_settings": {
												Type:     schema.TypeList,
												Computed: true,
												Elem: &schema.Resource{
													Schema: map[string]*schema.Schema{
														"downinter": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"fall": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"guid": {
															Type:     schema.TypeString,
															Computed: true,
														},
														"inter": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"maxconn": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"maxqueue": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"rise": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"slowstart": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"weight": {
															Type:     schema.TypeInt,
															Computed: true,
														},
													},
												},
											},
										},
									},
								},
							},
						},
					},
					"created_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"created_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"deleted_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"deleted_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"desc": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"dp_api_user": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"dp_api_password": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"extnet_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_haip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"frontends": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"bindings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"address": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"name": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"port": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
							},
						},
					},
					"gid": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"manager_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"manager_type": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"lb_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"milestones": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"part_k8s": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"primary_node": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"compute_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"frontend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"mgmt_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"network_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"rg_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"rg_name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"secondary_node": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"compute_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"frontend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"mgmt_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"network_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"status": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"tech_status": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"updated_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"updated_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"user_managed": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"vins_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"entry_count": {
			Type:     schema.TypeInt,
			Computed: true,
		},
	}
}

func dsLBListSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"by_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by ID",
		},
		"name": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by name",
		},
		"account_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by Account ID",
		},
		"rg_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Filter by RG ID",
		},
		"tech_status": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by TechStatus",
		},
		"status": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by Status",
		},
		"front_ip": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by FrontIP",
		},
		"back_ip": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "Filter by BackIP",
		},
		"includedeleted": {
			Type:     schema.TypeBool,
			Optional: true,
			Default:  false,
		},
		"sort_by": {
			Type:        schema.TypeString,
			Optional:    true,
			Description: "sort by one of supported fields, format +|-(field)",
		},
		"page": {
			Type:     schema.TypeInt,
			Optional: true,
			Default:  0,
		},
		"size": {
			Type:     schema.TypeInt,
			Optional: true,
			Default:  0,
		},
		"zone_id": {
			Type:        schema.TypeInt,
			Optional:    true,
			Description: "Zone ID",
		},
		"items": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"ha_mode": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"acl": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"zone_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"backend_haip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"backends": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"algorithm": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"server_default_settings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"downinter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"fall": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"inter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxconn": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxqueue": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"rise": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"slowstart": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"weight": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
								"servers": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"address": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"check": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"name": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"port": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"server_settings": {
												Type:     schema.TypeList,
												Computed: true,
												Elem: &schema.Resource{
													Schema: map[string]*schema.Schema{
														"downinter": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"fall": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"guid": {
															Type:     schema.TypeString,
															Computed: true,
														},
														"inter": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"maxconn": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"maxqueue": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"rise": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"slowstart": {
															Type:     schema.TypeInt,
															Computed: true,
														},
														"weight": {
															Type:     schema.TypeInt,
															Computed: true,
														},
													},
												},
											},
										},
									},
								},
							},
						},
					},
					"created_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"created_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"deleted_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"deleted_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"desc": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"dp_api_user": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"dp_api_password": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"extnet_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_haip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"frontends": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"bindings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"address": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"name": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"port": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
							},
						},
					},
					"gid": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"manager_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"manager_type": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"lb_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"milestones": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"part_k8s": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"primary_node": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"compute_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"frontend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"mgmt_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"network_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"rg_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"rg_name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"secondary_node": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"backend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"compute_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"frontend_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"mgmt_ip": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"network_id": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"status": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"tech_status": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"updated_by": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"updated_time": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"user_managed": {
						Type:     schema.TypeBool,
						Computed: true,
					},
					"vins_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"entry_count": {
			Type:     schema.TypeInt,
			Computed: true,
		},
	}
}

func lbResourceSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"rg_id": {
			Type:     schema.TypeInt,
			Required: true,
		},
		"name": {
			Type:     schema.TypeString,
			Required: true,
		},
		"extnet_id": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"zone_id": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"vins_id": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"ha_mode": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"start": {
			Type:     schema.TypeBool,
			Optional: true,
			Default:  true,
		},
		"desc": {
			Type:     schema.TypeString,
			Optional: true,
			Computed: true,
		},
		"enable": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"restart": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"safe": {
			Type:     schema.TypeBool,
			Default:  true,
			Optional: true,
		},
		"restore": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"config_reset": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"permanently": {
			Type:     schema.TypeBool,
			Optional: true,
		},
		"sysctl_params": {
			Type:        schema.TypeList,
			Optional:    true,
			Description: "Custom sysctl values for Load Balancer instance. Applied on boot",
			Elem: &schema.Schema{
				Type: schema.TypeMap,
				Elem: &schema.Schema{
					Type: schema.TypeString,
				},
			},
		},
		"ckey": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"meta": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Schema{
				Type: schema.TypeString,
			},
		},
		"acl": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"backend_haip": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"backends": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"algorithm": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"server_default_settings": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"downinter": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"fall": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"inter": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"maxconn": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"maxqueue": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"rise": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"slowstart": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"weight": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"servers": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"address": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"check": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"port": {
									Type:     schema.TypeInt,
									Computed: true,
								},
								"server_settings": {
									Type:     schema.TypeList,
									Computed: true,
									Elem: &schema.Resource{
										Schema: map[string]*schema.Schema{
											"downinter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"fall": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"guid": {
												Type:     schema.TypeString,
												Computed: true,
											},
											"inter": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxconn": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"maxqueue": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"rise": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"slowstart": {
												Type:     schema.TypeInt,
												Computed: true,
											},
											"weight": {
												Type:     schema.TypeInt,
												Computed: true,
											},
										},
									},
								},
							},
						},
					},
				},
			},
		},
		"dp_api_user": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"dp_api_password": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"frontend_haip": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"frontends": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"bindings": {
						Type:     schema.TypeList,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"address": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"name": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"port": {
									Type:     schema.TypeInt,
									Computed: true,
								},
							},
						},
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
				},
			},
		},
		"gid": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"guid": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"lb_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"manager_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"manager_type": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"image_id": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"milestones": {
			Type:     schema.TypeInt,
			Computed: true,
		},
		"part_k8s": {
			Type:     schema.TypeBool,
			Computed: true,
		},
		"primary_node": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"compute_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"mgmt_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"network_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"secondary_node": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"backend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"compute_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
					"frontend_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"mgmt_ip": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"network_id": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"status": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"tech_status": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"user_managed": {
			Type:     schema.TypeBool,
			Computed: true,
		},
	}
}

func resourceLbBackendSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"lb_id": {
			Type:        schema.TypeInt,
			Required:    true,
			Description: "ID of the LB instance to backendCreate",
		},
		"name": {
			Type:        schema.TypeString,
			Required:    true,
			Description: "Must be unique among all backends of this LB - name of the new backend to create",
		},
		"algorithm": {
			Type:         schema.TypeString,
			Optional:     true,
			Computed:     true,
			ValidateFunc: validation.StringInSlice([]string{"roundrobin", "static-rr", "leastconn"}, false),
		},
		"inter": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"downinter": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"rise": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"fall": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"slowstart": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"maxconn": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"maxqueue": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"weight": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},

		"guid": {
			Type:     schema.TypeString,
			Computed: true,
		},
		"servers": {
			Type:     schema.TypeList,
			Optional: true,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"address": {
						Type:     schema.TypeString,
						Optional: true,
						Computed: true,
					},
					"check": {
						Type:     schema.TypeString,
						Optional: true,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Optional: true,
						Computed: true,
					},
					"port": {
						Type:     schema.TypeInt,
						Optional: true,
						Computed: true,
					},
					"server_settings": {
						Type:     schema.TypeList,
						Optional: true,
						Computed: true,
						Elem: &schema.Resource{
							Schema: map[string]*schema.Schema{
								"downinter": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"fall": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"guid": {
									Type:     schema.TypeString,
									Computed: true,
								},
								"inter": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"maxconn": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"maxqueue": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"rise": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"slowstart": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
								"weight": {
									Type:     schema.TypeInt,
									Optional: true,
									Computed: true,
								},
							},
						},
					},
				},
			},
		},
	}
}

func resourceLbBackendServerSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"lb_id": {
			Type:        schema.TypeInt,
			Required:    true,
			Description: "ID of the LB instance to backendCreate",
		},
		"backend_name": {
			Type:        schema.TypeString,
			Required:    true,
			Description: "Must be unique among all backends of this LB - name of the new backend to create",
		},
		"name": {
			Type:        schema.TypeString,
			Required:    true,
			Description: "Must be unique among all servers defined for this backend - name of the server definition to add.",
		},
		"address": {
			Type:        schema.TypeString,
			Required:    true,
			Description: "IP address of the server.",
		},
		"port": {
			Type:        schema.TypeInt,
			Required:    true,
			Description: "Port number on the server",
		},
		"check": {
			Type:         schema.TypeString,
			Optional:     true,
			Computed:     true,
			ValidateFunc: validation.StringInSlice([]string{"disabled", "enabled"}, false),
			Description:  "set to disabled if this server should be used regardless of its state.",
		},
		"inter": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"downinter": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"rise": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"fall": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"slowstart": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"maxconn": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"maxqueue": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},
		"weight": {
			Type:     schema.TypeInt,
			Optional: true,
			Computed: true,
		},

		"guid": {
			Type:     schema.TypeString,
			Computed: true,
		},
	}
}

func resourceLbFrontendSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"lb_id": {
			Type:        schema.TypeInt,
			Required:    true,
			Description: "ID of the LB instance to backendCreate",
		},
		"backend_name": {
			Type:     schema.TypeString,
			Required: true,
		},
		"name": {
			Type:     schema.TypeString,
			Required: true,
		},

		"bindings": {
			Type:     schema.TypeList,
			Computed: true,
			Elem: &schema.Resource{
				Schema: map[string]*schema.Schema{
					"address": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"guid": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"name": {
						Type:     schema.TypeString,
						Computed: true,
					},
					"port": {
						Type:     schema.TypeInt,
						Computed: true,
					},
				},
			},
		},
		"guid": {
			Type:     schema.TypeString,
			Computed: true,
		},
	}
}

func resourceLbFrontendBindSchemaMake() map[string]*schema.Schema {
	return map[string]*schema.Schema{
		"lb_id": {
			Type:        schema.TypeInt,
			Required:    true,
			Description: "ID of the LB instance to backendCreate",
		},
		"frontend_name": {
			Type:        schema.TypeString,
			Required:    true,
			Description: "Must be unique among all backends of this LB - name of the new backend to create",
		},
		"name": {
			Type:     schema.TypeString,
			Required: true,
		},
		"address": {
			Type:     schema.TypeString,
			Required: true,
		},
		"port": {
			Type:     schema.TypeInt,
			Required: true,
		},

		"guid": {
			Type:     schema.TypeString,
			Computed: true,
		},
	}
}
