This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/cloudstack-terraform-provider.git


The following commit(s) were added to refs/heads/main by this push:
     new 34a24b7  add support for vpc internal lb (#264)
34a24b7 is described below

commit 34a24b701d317a016e87fff7de91d74d2a728e74
Author: Curverneur <[email protected]>
AuthorDate: Mon Aug 17 08:06:22 2026 +0200

    add support for vpc internal lb (#264)
    
    * added resource_cloudstack_loadbalancer and corresponding doc page
    
    * changed from type list to type set due to the need to re-create after 
order of virtualmachineids changed
---
 cloudstack/provider.go                         |   1 +
 cloudstack/resource_cloudstack_loadbalancer.go | 182 +++++++++++++++++++++++++
 website/docs/r/loadbalancer.html.markdown      |  62 +++++++++
 3 files changed, 245 insertions(+)

diff --git a/cloudstack/provider.go b/cloudstack/provider.go
index 1ea5ec3..aea132a 100644
--- a/cloudstack/provider.go
+++ b/cloudstack/provider.go
@@ -126,6 +126,7 @@ func Provider() *schema.Provider {
                        "cloudstack_ipaddress":                      
resourceCloudStackIPAddress(),
                        "cloudstack_kubernetes_cluster":             
resourceCloudStackKubernetesCluster(),
                        "cloudstack_kubernetes_version":             
resourceCloudStackKubernetesVersion(),
+                       "cloudstack_loadbalancer":                   
resourceCloudStackLoadBalancer(),
                        "cloudstack_loadbalancer_rule":              
resourceCloudStackLoadBalancerRule(),
                        "cloudstack_network":                        
resourceCloudStackNetwork(),
                        "cloudstack_network_acl":                    
resourceCloudStackNetworkACL(),
diff --git a/cloudstack/resource_cloudstack_loadbalancer.go 
b/cloudstack/resource_cloudstack_loadbalancer.go
new file mode 100644
index 0000000..cf646a2
--- /dev/null
+++ b/cloudstack/resource_cloudstack_loadbalancer.go
@@ -0,0 +1,182 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package cloudstack
+
+import (
+       "github.com/apache/cloudstack-go/v2/cloudstack"
+       "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func resourceCloudStackLoadBalancer() *schema.Resource {
+       return &schema.Resource{
+               Create: resourceCloudStackLoadBalancerCreate,
+               Read:   resourceCloudStackLoadBalancerRead,
+               Delete: resourceCloudStackLoadBalancerDelete,
+
+               Schema: map[string]*schema.Schema{
+                       "algorithm": {
+                               Description: "load balancer algorithm (source, 
roundrobin, leastconn)",
+                               Type:        schema.TypeString,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "instanceport": {
+                               Description: "the TCP port of the virtual 
machine where the network traffic will be load balanced to",
+                               Type:        schema.TypeInt,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "name": {
+                               Description: "name of the load balancer",
+                               Type:        schema.TypeString,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "networkid": {
+                               Description: "The guest network the load 
balancer will be created for",
+                               Type:        schema.TypeString,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "scheme": {
+                               Description: "the load balancer scheme. 
Supported value in this release is Internal",
+                               Type:        schema.TypeString,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "sourceipaddressnetworkid": {
+                               Description: "the network id of the source ip 
address",
+                               Type:        schema.TypeString,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "sourceport": {
+                               Description: "the source port the network 
traffic will be load balanced from",
+                               Type:        schema.TypeInt,
+                               Required:    true,
+                               ForceNew:    true,
+                       },
+
+                       "description": {
+                               Description: "the description of the load 
balancer",
+                               Type:        schema.TypeString,
+                               Optional:    true,
+                               ForceNew:    true,
+                       },
+
+                       "sourceipaddress": {
+                               Description: "the source IP address the network 
traffic will be load balanced from",
+                               Type:        schema.TypeString,
+                               Optional:    true,
+                               ForceNew:    true,
+                       },
+
+                       "virtualmachineids": {
+                               Description: "the list of IDs of the virtual 
machine that are being assigned to the load balancer rule(i.e. 
virtualMachineIds=1,2,3)",
+                               Type:        schema.TypeSet,
+                               Optional:    true,
+                               ForceNew:    true,
+                               Elem: &schema.Schema{
+                                       Type: schema.TypeString,
+                               },
+                       },
+               },
+       }
+}
+
+func resourceCloudStackLoadBalancerCreate(d *schema.ResourceData, meta 
interface{}) error {
+       cs := meta.(*cloudstack.CloudStackClient)
+
+       p := cs.LoadBalancer.NewCreateLoadBalancerParams(
+               d.Get("algorithm").(string),
+               d.Get("instanceport").(int),
+               d.Get("name").(string),
+               d.Get("networkid").(string),
+               d.Get("scheme").(string),
+               d.Get("sourceipaddressnetworkid").(string),
+               d.Get("sourceport").(int),
+       )
+       if v, ok := d.GetOk("description"); ok {
+               p.SetDescription(v.(string))
+       }
+       if v, ok := d.GetOk("sourceipaddress"); ok {
+               p.SetSourceipaddress(v.(string))
+       }
+
+       r, err := cs.LoadBalancer.CreateLoadBalancer(p)
+       if err != nil {
+               return err
+       }
+
+       if v, ok := d.GetOk("virtualmachineids"); ok {
+               vmIds := v.(*schema.Set).List()
+               for _, vmId := range vmIds {
+                       p_update := 
cs.LoadBalancer.NewAssignToLoadBalancerRuleParams(r.Id)
+                       p_update.SetVirtualmachineids([]string{vmId.(string)})
+                       _, err := 
cs.LoadBalancer.AssignToLoadBalancerRule(p_update)
+                       if err != nil {
+                               return err
+                       }
+               }
+       }
+
+       d.SetId(r.Id)
+
+       return resourceCloudStackLoadBalancerRead(d, meta)
+}
+
+func resourceCloudStackLoadBalancerRead(d *schema.ResourceData, meta 
interface{}) error {
+       cs := meta.(*cloudstack.CloudStackClient)
+
+       r, _, err := cs.LoadBalancer.GetLoadBalancerByID(d.Id())
+       if err != nil {
+               return err
+       }
+
+       d.Set("algorithm", r.Algorithm)
+       d.Set("name", r.Name)
+       d.Set("network_id", r.Networkid)
+       d.Set("sourceipaddressnetworkid", r.Sourceipaddressnetworkid)
+
+       var vmIds []string
+       for _, vm := range r.Loadbalancerinstance {
+               vmIds = append(vmIds, vm.Id)
+       }
+       d.Set("virtualmachineids", vmIds)
+
+       return nil
+}
+
+func resourceCloudStackLoadBalancerDelete(d *schema.ResourceData, meta 
interface{}) error {
+       cs := meta.(*cloudstack.CloudStackClient)
+
+       _, err := 
cs.LoadBalancer.DeleteLoadBalancer(cs.LoadBalancer.NewDeleteLoadBalancerParams(d.Id()))
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
diff --git a/website/docs/r/loadbalancer.html.markdown 
b/website/docs/r/loadbalancer.html.markdown
new file mode 100644
index 0000000..cbca7c4
--- /dev/null
+++ b/website/docs/r/loadbalancer.html.markdown
@@ -0,0 +1,62 @@
+---
+layout: "cloudstack"
+page_title: "CloudStack: cloudstack_loadbalancer"
+sidebar_current: "docs-cloudstack-resource-loadbalancer"
+description: |-
+  Creates an internal load balancer.
+---
+
+# cloudstack_loadbalancer
+
+Creates an internal load balancer.
+
+## Example Usage
+
+Basic usage:
+
+```hcl
+resource "cloudstack_loadbalancer" "example" {
+  algorithm                = "Source"
+  description              = "Example Load Balancer"
+  instanceport             = "8081"
+  name                     = "internal-lb-example"
+  networkid                = "0ae8fa84-c78e-441a-8628-917d276c7d5c"
+  scheme                   = "Internal"
+  sourceipaddressnetworkid = "0ae8fa84-c78e-441a-8628-917d276c7d5c"
+  sourceport               = "8081"
+  virtualmachineids        = [ "48600f99-d890-472c-bc1a-7379af22727c", 
"749485a1-4081-49cd-9668-1d160ac94488", "9bbf3c6d-c8b8-42e8-ab37-e4f60a71f61d" ]
+}
+```
+
+## Argument Reference
+
+The following arguments are supported:
+
+* `algorithm` - (Required) load balancer algorithm (source, roundrobin, 
leastconn).
+* `description` - (Optional) the description of the load balancer.
+* `instanceport` - (Required) the TCP port of the virtual machine where the 
network traffic will be load balanced to.
+* `name` - (Required) name of the load balancer.
+* `networkid` - (Required) The guest network the load balancer will be created 
for.
+* `scheme` - (Required) the load balancer scheme. Supported value in this 
release is Internal.
+* `sourceipaddressnetworkid` - (Required) the network id of the source ip 
address.
+* `sourceport` - (Required) the source port the network traffic will be load 
balanced from.
+* `sourceipaddress` - (Optional) the source IP address the network traffic 
will be load balanced from.
+* `virtualmachineids` - (Optional) the list of IDs of the virtual machine that 
are being assigned to the load balancer rule(i.e. virtualMachineIds=1,2,3).
+
+
+## Attributes Reference
+
+The following attributes are exported:
+
+* `id` - the Load Balancer ID.
+
+
+
+## Import
+
+A load balancer can be imported; use `<LOADBALANCER ID>` as the import ID. For
+example:
+
+```shell
+terraform import cloudstack_loadbalancer.example 
eefce154-e759-45a4-989a-9a432792801b
+```

Reply via email to