mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Refactor the use of names vs IDs for parameters referencing other TF resources
We have a curtesy function in place allowing you to specify both a `name` of `ID`. But in order for the graph to be build correctly when you recreate or taint stuff that other resources depend on, we need to reference the `ID` and *not* the `name`. So in order to enforce this and by that help people to not make this mistake unknowingly, I deprecated all the parameters this allies to and changed the logic, docs and tests accordingly.
This commit is contained in:
parent
ae371b5492
commit
815c8840a7
@ -94,14 +94,8 @@ func resourceCloudStackDiskCreate(d *schema.ResourceData, meta interface{}) erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the zone ID
|
// Retrieve the zone ID
|
||||||
|
@ -175,7 +175,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -200,7 +200,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -224,7 +224,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -20,10 +21,19 @@ func resourceCloudStackEgressFirewall() *schema.Resource {
|
|||||||
Delete: resourceCloudStackEgressFirewallDelete,
|
Delete: resourceCloudStackEgressFirewallDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
|
"network_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
ConflictsWith: []string{"network"},
|
||||||
|
},
|
||||||
|
|
||||||
"network": &schema.Schema{
|
"network": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `network_id` field instead",
|
||||||
|
ConflictsWith: []string{"network_id"},
|
||||||
},
|
},
|
||||||
|
|
||||||
"managed": &schema.Schema{
|
"managed": &schema.Schema{
|
||||||
@ -99,8 +109,16 @@ func resourceCloudStackEgressFirewallCreate(d *schema.ResourceData, meta interfa
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
network, ok := d.GetOk("network_id")
|
||||||
|
if !ok {
|
||||||
|
network, ok = d.GetOk("network")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `network_id` or [deprecated] `network` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the network ID
|
// Retrieve the network ID
|
||||||
networkid, e := retrieveID(cs, "network", d.Get("network").(string))
|
networkid, e := retrieveID(cs, "network", network.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ func TestAccCloudStackEgressFirewall_basic(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "network", CLOUDSTACK_NETWORK_1),
|
"cloudstack_egress_firewall.foo", "network_id", CLOUDSTACK_NETWORK_1),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "rule.#", "2"),
|
"cloudstack_egress_firewall.foo", "rule.#", "2"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -59,7 +59,7 @@ func TestAccCloudStackEgressFirewall_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "network", CLOUDSTACK_NETWORK_1),
|
"cloudstack_egress_firewall.foo", "network_id", CLOUDSTACK_NETWORK_1),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "rule.#", "2"),
|
"cloudstack_egress_firewall.foo", "rule.#", "2"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -88,7 +88,7 @@ func TestAccCloudStackEgressFirewall_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
testAccCheckCloudStackEgressFirewallRulesExist("cloudstack_egress_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "network", CLOUDSTACK_NETWORK_1),
|
"cloudstack_egress_firewall.foo", "network_id", CLOUDSTACK_NETWORK_1),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_egress_firewall.foo", "rule.#", "3"),
|
"cloudstack_egress_firewall.foo", "rule.#", "3"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -188,7 +188,7 @@ func testAccCheckCloudStackEgressFirewallDestroy(s *terraform.State) error {
|
|||||||
|
|
||||||
var testAccCloudStackEgressFirewall_basic = fmt.Sprintf(`
|
var testAccCloudStackEgressFirewall_basic = fmt.Sprintf(`
|
||||||
resource "cloudstack_egress_firewall" "foo" {
|
resource "cloudstack_egress_firewall" "foo" {
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["%s/32"]
|
cidr_list = ["%s/32"]
|
||||||
@ -208,7 +208,7 @@ resource "cloudstack_egress_firewall" "foo" {
|
|||||||
|
|
||||||
var testAccCloudStackEgressFirewall_update = fmt.Sprintf(`
|
var testAccCloudStackEgressFirewall_update = fmt.Sprintf(`
|
||||||
resource "cloudstack_egress_firewall" "foo" {
|
resource "cloudstack_egress_firewall" "foo" {
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["%s/32", "%s/32"]
|
cidr_list = ["%s/32", "%s/32"]
|
||||||
|
@ -21,7 +21,7 @@ func resourceCloudStackFirewall() *schema.Resource {
|
|||||||
Delete: resourceCloudStackFirewallDelete,
|
Delete: resourceCloudStackFirewallDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"ip_address": &schema.Schema{
|
"ip_address_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
@ -32,8 +32,8 @@ func resourceCloudStackFirewall() *schema.Resource {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Deprecated: "Please use the `ip_address` field instead",
|
Deprecated: "Please use the `ip_address_id` field instead",
|
||||||
ConflictsWith: []string{"ip_address"},
|
ConflictsWith: []string{"ip_address_id"},
|
||||||
},
|
},
|
||||||
|
|
||||||
"managed": &schema.Schema{
|
"managed": &schema.Schema{
|
||||||
@ -109,12 +109,12 @@ func resourceCloudStackFirewallCreate(d *schema.ResourceData, meta interface{})
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ipaddress, ok := d.GetOk("ip_address")
|
ipaddress, ok := d.GetOk("ip_address_id")
|
||||||
if !ok {
|
if !ok {
|
||||||
ipaddress, ok = d.GetOk("ipaddress")
|
ipaddress, ok = d.GetOk("ipaddress")
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("Either `ip_address` or [deprecated] `ipaddress` must be provided.")
|
return errors.New("Either `ip_address_id` or [deprecated] `ipaddress` must be provided.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the ipaddress ID
|
// Retrieve the ipaddress ID
|
||||||
|
@ -21,7 +21,7 @@ func TestAccCloudStackFirewall_basic(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_firewall.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "rule.#", "2"),
|
"cloudstack_firewall.foo", "rule.#", "2"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -55,7 +55,7 @@ func TestAccCloudStackFirewall_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_firewall.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "rule.#", "2"),
|
"cloudstack_firewall.foo", "rule.#", "2"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -80,7 +80,7 @@ func TestAccCloudStackFirewall_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
testAccCheckCloudStackFirewallRulesExist("cloudstack_firewall.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_firewall.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_firewall.foo", "rule.#", "3"),
|
"cloudstack_firewall.foo", "rule.#", "3"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
@ -174,7 +174,7 @@ func testAccCheckCloudStackFirewallDestroy(s *terraform.State) error {
|
|||||||
|
|
||||||
var testAccCloudStackFirewall_basic = fmt.Sprintf(`
|
var testAccCloudStackFirewall_basic = fmt.Sprintf(`
|
||||||
resource "cloudstack_firewall" "foo" {
|
resource "cloudstack_firewall" "foo" {
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["10.0.0.0/24"]
|
cidr_list = ["10.0.0.0/24"]
|
||||||
@ -191,7 +191,7 @@ resource "cloudstack_firewall" "foo" {
|
|||||||
|
|
||||||
var testAccCloudStackFirewall_update = fmt.Sprintf(`
|
var testAccCloudStackFirewall_update = fmt.Sprintf(`
|
||||||
resource "cloudstack_firewall" "foo" {
|
resource "cloudstack_firewall" "foo" {
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["10.0.0.0/24", "10.0.1.0/24"]
|
cidr_list = ["10.0.0.0/24", "10.0.1.0/24"]
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -37,12 +38,20 @@ func resourceCloudStackInstance() *schema.Resource {
|
|||||||
Required: true,
|
Required: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": &schema.Schema{
|
"network_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"network": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `network_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
"ip_address": &schema.Schema{
|
"ip_address": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
@ -149,11 +158,21 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{})
|
|||||||
}
|
}
|
||||||
|
|
||||||
if zone.Networktype == "Advanced" {
|
if zone.Networktype == "Advanced" {
|
||||||
|
network, ok := d.GetOk("network_id")
|
||||||
|
if !ok {
|
||||||
|
network, ok = d.GetOk("network")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `network_id` or [deprecated] `network` must be provided when using a zone with network type `advanced`.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the network ID
|
// Retrieve the network ID
|
||||||
networkid, e := retrieveID(cs, "network", d.Get("network").(string))
|
networkid, e := retrieveID(cs, "network", network.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the default network ID
|
// Set the default network ID
|
||||||
p.SetNetworkids([]string{networkid})
|
p.SetNetworkids([]string{networkid})
|
||||||
}
|
}
|
||||||
@ -168,14 +187,8 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{})
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a keypair is supplied, add it to the parameter struct
|
// If a keypair is supplied, add it to the parameter struct
|
||||||
@ -240,10 +253,9 @@ func resourceCloudStackInstanceRead(d *schema.ResourceData, meta interface{}) er
|
|||||||
// Update the config
|
// Update the config
|
||||||
d.Set("name", vm.Name)
|
d.Set("name", vm.Name)
|
||||||
d.Set("display_name", vm.Displayname)
|
d.Set("display_name", vm.Displayname)
|
||||||
|
d.Set("network_id", vm.Nic[0].Networkid)
|
||||||
d.Set("ip_address", vm.Nic[0].Ipaddress)
|
d.Set("ip_address", vm.Nic[0].Ipaddress)
|
||||||
//NB cloudstack sometimes sends back the wrong keypair name, so dont update it
|
|
||||||
|
|
||||||
setValueOrID(d, "network", vm.Nic[0].Networkname, vm.Nic[0].Networkid)
|
|
||||||
setValueOrID(d, "service_offering", vm.Serviceofferingname, vm.Serviceofferingid)
|
setValueOrID(d, "service_offering", vm.Serviceofferingname, vm.Serviceofferingid)
|
||||||
setValueOrID(d, "template", vm.Templatename, vm.Templateid)
|
setValueOrID(d, "template", vm.Templatename, vm.Templateid)
|
||||||
setValueOrID(d, "project", vm.Project, vm.Projectid)
|
setValueOrID(d, "project", vm.Project, vm.Projectid)
|
||||||
|
@ -180,8 +180,8 @@ func testAccCheckCloudStackInstanceAttributes(
|
|||||||
return fmt.Errorf("Bad template: %s", instance.Templatename)
|
return fmt.Errorf("Bad template: %s", instance.Templatename)
|
||||||
}
|
}
|
||||||
|
|
||||||
if instance.Nic[0].Networkname != CLOUDSTACK_NETWORK_1 {
|
if instance.Nic[0].Networkid != CLOUDSTACK_NETWORK_1 {
|
||||||
return fmt.Errorf("Bad network: %s", instance.Nic[0].Networkname)
|
return fmt.Errorf("Bad network ID: %s", instance.Nic[0].Networkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -234,7 +234,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform-test"
|
display_name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
user_data = "foobar\nfoo\nbar"
|
user_data = "foobar\nfoo\nbar"
|
||||||
@ -250,7 +250,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-updated"
|
name = "terraform-updated"
|
||||||
display_name = "terraform-updated"
|
display_name = "terraform-updated"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
user_data = "foobar\nfoo\nbar"
|
user_data = "foobar\nfoo\nbar"
|
||||||
@ -266,7 +266,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform-test"
|
display_name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
ip_address = "%s"
|
ip_address = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
@ -287,7 +287,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform-test"
|
display_name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
ip_address = "%s"
|
ip_address = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
@ -305,7 +305,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform-test"
|
display_name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
project = "%s"
|
project = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
|
@ -16,16 +16,32 @@ func resourceCloudStackIPAddress() *schema.Resource {
|
|||||||
Delete: resourceCloudStackIPAddressDelete,
|
Delete: resourceCloudStackIPAddressDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"network": &schema.Schema{
|
"network_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"network": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `network_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
|
"vpc_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"vpc": &schema.Schema{
|
"vpc": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `vpc_id` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
"project": &schema.Schema{
|
"project": &schema.Schema{
|
||||||
@ -52,7 +68,11 @@ func resourceCloudStackIPAddressCreate(d *schema.ResourceData, meta interface{})
|
|||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
p := cs.Address.NewAssociateIpAddressParams()
|
p := cs.Address.NewAssociateIpAddressParams()
|
||||||
|
|
||||||
if network, ok := d.GetOk("network"); ok {
|
network, ok := d.GetOk("network_id")
|
||||||
|
if !ok {
|
||||||
|
network, ok = d.GetOk("network")
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
// Retrieve the network ID
|
// Retrieve the network ID
|
||||||
networkid, e := retrieveID(cs, "network", network.(string))
|
networkid, e := retrieveID(cs, "network", network.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
@ -63,7 +83,11 @@ func resourceCloudStackIPAddressCreate(d *schema.ResourceData, meta interface{})
|
|||||||
p.SetNetworkid(networkid)
|
p.SetNetworkid(networkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
if vpc, ok := d.GetOk("vpc"); ok {
|
vpc, ok := d.GetOk("vpc_id")
|
||||||
|
if !ok {
|
||||||
|
vpc, ok = d.GetOk("vpc")
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
// Retrieve the vpc ID
|
// Retrieve the vpc ID
|
||||||
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
|
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
@ -75,14 +99,8 @@ func resourceCloudStackIPAddressCreate(d *schema.ResourceData, meta interface{})
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Associate a new IP address
|
// Associate a new IP address
|
||||||
@ -115,24 +133,16 @@ func resourceCloudStackIPAddressRead(d *schema.ResourceData, meta interface{}) e
|
|||||||
// Updated the IP address
|
// Updated the IP address
|
||||||
d.Set("ip_address", ip.Ipaddress)
|
d.Set("ip_address", ip.Ipaddress)
|
||||||
|
|
||||||
if _, ok := d.GetOk("network"); ok {
|
_, networkID := d.GetOk("network_id")
|
||||||
// Get the network details
|
_, network := d.GetOk("network")
|
||||||
n, _, err := cs.Network.GetNetworkByID(ip.Associatednetworkid)
|
if networkID || network {
|
||||||
if err != nil {
|
d.Set("network_id", ip.Associatednetworkid)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
setValueOrID(d, "network", n.Name, ip.Associatednetworkid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := d.GetOk("vpc"); ok {
|
_, vpcID := d.GetOk("vpc_id")
|
||||||
// Get the VPC details
|
_, vpc := d.GetOk("vpc")
|
||||||
v, _, err := cs.VPC.GetVPCByID(ip.Vpcid)
|
if vpcID || vpc {
|
||||||
if err != nil {
|
d.Set("vpc_id", ip.Vpcid)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
setValueOrID(d, "vpc", v.Name, ip.Vpcid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setValueOrID(d, "project", ip.Project, ip.Projectid)
|
setValueOrID(d, "project", ip.Project, ip.Projectid)
|
||||||
@ -162,12 +172,14 @@ func resourceCloudStackIPAddressDelete(d *schema.ResourceData, meta interface{})
|
|||||||
}
|
}
|
||||||
|
|
||||||
func verifyIPAddressParams(d *schema.ResourceData) error {
|
func verifyIPAddressParams(d *schema.ResourceData) error {
|
||||||
|
_, networkID := d.GetOk("network_id")
|
||||||
_, network := d.GetOk("network")
|
_, network := d.GetOk("network")
|
||||||
|
_, vpcID := d.GetOk("vpc_id")
|
||||||
_, vpc := d.GetOk("vpc")
|
_, vpc := d.GetOk("vpc")
|
||||||
|
|
||||||
if network && vpc || !network && !vpc {
|
if (networkID || network) && (vpcID || vpc) || (!networkID && !network) && (!vpcID && !vpc) {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"You must supply a value for either (so not both) the 'network' or 'vpc' parameter")
|
"You must supply a value for either (so not both) the 'network_id' or 'vpc_id' parameter")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -42,8 +42,6 @@ func TestAccCloudStackIPAddress_vpc(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackIPAddressExists(
|
testAccCheckCloudStackIPAddressExists(
|
||||||
"cloudstack_ipaddress.foo", &ipaddr),
|
"cloudstack_ipaddress.foo", &ipaddr),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_ipaddress.foo", "vpc", "terraform-vpc"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -83,8 +81,8 @@ func testAccCheckCloudStackIPAddressAttributes(
|
|||||||
ipaddr *cloudstack.PublicIpAddress) resource.TestCheckFunc {
|
ipaddr *cloudstack.PublicIpAddress) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
if ipaddr.Associatednetworkname != CLOUDSTACK_NETWORK_1 {
|
if ipaddr.Associatednetworkid != CLOUDSTACK_NETWORK_1 {
|
||||||
return fmt.Errorf("Bad network: %s", ipaddr.Associatednetworkname)
|
return fmt.Errorf("Bad network ID: %s", ipaddr.Associatednetworkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -114,7 +112,7 @@ func testAccCheckCloudStackIPAddressDestroy(s *terraform.State) error {
|
|||||||
|
|
||||||
var testAccCloudStackIPAddress_basic = fmt.Sprintf(`
|
var testAccCloudStackIPAddress_basic = fmt.Sprintf(`
|
||||||
resource "cloudstack_ipaddress" "foo" {
|
resource "cloudstack_ipaddress" "foo" {
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
}`, CLOUDSTACK_NETWORK_1)
|
}`, CLOUDSTACK_NETWORK_1)
|
||||||
|
|
||||||
var testAccCloudStackIPAddress_vpc = fmt.Sprintf(`
|
var testAccCloudStackIPAddress_vpc = fmt.Sprintf(`
|
||||||
@ -126,7 +124,7 @@ resource "cloudstack_vpc" "foobar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_ipaddress" "foo" {
|
resource "cloudstack_ipaddress" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
|
@ -29,25 +29,32 @@ func resourceCloudStackLoadBalancerRule() *schema.Resource {
|
|||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"ip_address": &schema.Schema{
|
"ip_address_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
Computed: true,
|
||||||
ConflictsWith: []string{"ipaddress"},
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"ipaddress": &schema.Schema{
|
"ipaddress": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Deprecated: "Please use the `ip_address` field instead",
|
Deprecated: "Please use the `ip_address_id` field instead",
|
||||||
ConflictsWith: []string{"ip_address"},
|
},
|
||||||
|
|
||||||
|
"network_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": &schema.Schema{
|
"network": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `network_id` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
"algorithm": &schema.Schema{
|
"algorithm": &schema.Schema{
|
||||||
@ -67,11 +74,21 @@ func resourceCloudStackLoadBalancerRule() *schema.Resource {
|
|||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"member_ids": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
ConflictsWith: []string{"members"},
|
||||||
|
},
|
||||||
|
|
||||||
"members": &schema.Schema{
|
"members": &schema.Schema{
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Required: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Elem: &schema.Schema{Type: schema.TypeString},
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
Deprecated: "Please use the `member_ids` field instead",
|
||||||
|
ConflictsWith: []string{"member_ids"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -99,23 +116,27 @@ func resourceCloudStackLoadBalancerRuleCreate(d *schema.ResourceData, meta inter
|
|||||||
p.SetDescription(d.Get("name").(string))
|
p.SetDescription(d.Get("name").(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the network and the ID
|
network, ok := d.GetOk("network_id")
|
||||||
if network, ok := d.GetOk("network"); ok {
|
if !ok {
|
||||||
|
network, ok = d.GetOk("network")
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
|
// Retrieve the network ID
|
||||||
networkid, e := retrieveID(cs, "network", network.(string))
|
networkid, e := retrieveID(cs, "network", network.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the default network ID
|
// Set the networkid
|
||||||
p.SetNetworkid(networkid)
|
p.SetNetworkid(networkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
ipaddress, ok := d.GetOk("ip_address")
|
ipaddress, ok := d.GetOk("ip_address_id")
|
||||||
if !ok {
|
if !ok {
|
||||||
ipaddress, ok = d.GetOk("ipaddress")
|
ipaddress, ok = d.GetOk("ipaddress")
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("Either `ip_address` or [deprecated] `ipaddress` must be provided.")
|
return errors.New("Either `ip_address_id` or [deprecated] `ipaddress` must be provided.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the ipaddress ID
|
// Retrieve the ipaddress ID
|
||||||
@ -135,8 +156,8 @@ func resourceCloudStackLoadBalancerRuleCreate(d *schema.ResourceData, meta inter
|
|||||||
d.SetId(r.Id)
|
d.SetId(r.Id)
|
||||||
d.SetPartial("name")
|
d.SetPartial("name")
|
||||||
d.SetPartial("description")
|
d.SetPartial("description")
|
||||||
d.SetPartial("ip_address")
|
d.SetPartial("ip_address_id")
|
||||||
d.SetPartial("network")
|
d.SetPartial("network_id")
|
||||||
d.SetPartial("algorithm")
|
d.SetPartial("algorithm")
|
||||||
d.SetPartial("private_port")
|
d.SetPartial("private_port")
|
||||||
d.SetPartial("public_port")
|
d.SetPartial("public_port")
|
||||||
@ -144,8 +165,16 @@ func resourceCloudStackLoadBalancerRuleCreate(d *schema.ResourceData, meta inter
|
|||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
ap := cs.LoadBalancer.NewAssignToLoadBalancerRuleParams(r.Id)
|
ap := cs.LoadBalancer.NewAssignToLoadBalancerRuleParams(r.Id)
|
||||||
|
|
||||||
|
members, ok := d.GetOk("member_ids")
|
||||||
|
if !ok {
|
||||||
|
members, ok = d.GetOk("members")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `member_ids` or [deprecated] `members` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
var mbs []string
|
var mbs []string
|
||||||
for _, id := range d.Get("members").([]interface{}) {
|
for _, id := range members.([]interface{}) {
|
||||||
mbs = append(mbs, id.(string))
|
mbs = append(mbs, id.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,9 +185,10 @@ func resourceCloudStackLoadBalancerRuleCreate(d *schema.ResourceData, meta inter
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d.SetPartial("member_ids")
|
||||||
d.SetPartial("members")
|
d.SetPartial("members")
|
||||||
|
|
||||||
d.Partial(false)
|
d.Partial(false)
|
||||||
|
|
||||||
return resourceCloudStackLoadBalancerRuleRead(d, meta)
|
return resourceCloudStackLoadBalancerRuleRead(d, meta)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,16 +210,13 @@ func resourceCloudStackLoadBalancerRuleRead(d *schema.ResourceData, meta interfa
|
|||||||
d.Set("algorithm", lb.Algorithm)
|
d.Set("algorithm", lb.Algorithm)
|
||||||
d.Set("public_port", lb.Publicport)
|
d.Set("public_port", lb.Publicport)
|
||||||
d.Set("private_port", lb.Privateport)
|
d.Set("private_port", lb.Privateport)
|
||||||
|
d.Set("ip_address_id", lb.Publicipid)
|
||||||
setValueOrID(d, "ip_address", lb.Publicip, lb.Publicipid)
|
|
||||||
|
|
||||||
// Only set network if user specified it to avoid spurious diffs
|
// Only set network if user specified it to avoid spurious diffs
|
||||||
if _, ok := d.GetOk("network"); ok {
|
_, networkID := d.GetOk("network_id")
|
||||||
network, _, err := cs.Network.GetNetworkByID(lb.Networkid)
|
_, network := d.GetOk("network")
|
||||||
if err != nil {
|
if networkID || network {
|
||||||
return err
|
d.Set("network_id", lb.Networkid)
|
||||||
}
|
|
||||||
setValueOrID(d, "network", network.Name, lb.Networkid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -75,7 +75,7 @@ func TestAccCloudStackLoadBalancerRule_update(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccCloudStackLoadBalancerRule_forcenew(t *testing.T) {
|
func TestAccCloudStackLoadBalancerRule_forceNew(t *testing.T) {
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
Providers: testAccProviders,
|
Providers: testAccProviders,
|
||||||
@ -138,7 +138,7 @@ func TestAccCloudStackLoadBalancerRule_vpc(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccCloudStackLoadBalancerRule_vpc_update(t *testing.T) {
|
func TestAccCloudStackLoadBalancerRule_vpcUpdate(t *testing.T) {
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
Providers: testAccProviders,
|
Providers: testAccProviders,
|
||||||
@ -243,7 +243,7 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
name = "terraform-server1"
|
name = "terraform-server1"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -251,11 +251,11 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
|
|
||||||
resource "cloudstack_loadbalancer_rule" "foo" {
|
resource "cloudstack_loadbalancer_rule" "foo" {
|
||||||
name = "terraform-lb"
|
name = "terraform-lb"
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
algorithm = "roundrobin"
|
algorithm = "roundrobin"
|
||||||
public_port = 80
|
public_port = 80
|
||||||
private_port = 80
|
private_port = 80
|
||||||
members = ["${cloudstack_instance.foobar1.id}"]
|
member_ids = ["${cloudstack_instance.foobar1.id}"]
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
@ -269,7 +269,7 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
name = "terraform-server1"
|
name = "terraform-server1"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -277,11 +277,11 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
|
|
||||||
resource "cloudstack_loadbalancer_rule" "foo" {
|
resource "cloudstack_loadbalancer_rule" "foo" {
|
||||||
name = "terraform-lb-update"
|
name = "terraform-lb-update"
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
algorithm = "leastconn"
|
algorithm = "leastconn"
|
||||||
public_port = 80
|
public_port = 80
|
||||||
private_port = 80
|
private_port = 80
|
||||||
members = ["${cloudstack_instance.foobar1.id}"]
|
member_ids = ["${cloudstack_instance.foobar1.id}"]
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
@ -295,7 +295,7 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
name = "terraform-server1"
|
name = "terraform-server1"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -303,11 +303,11 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
|
|
||||||
resource "cloudstack_loadbalancer_rule" "foo" {
|
resource "cloudstack_loadbalancer_rule" "foo" {
|
||||||
name = "terraform-lb-update"
|
name = "terraform-lb-update"
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
algorithm = "leastconn"
|
algorithm = "leastconn"
|
||||||
public_port = 443
|
public_port = 443
|
||||||
private_port = 443
|
private_port = 443
|
||||||
members = ["${cloudstack_instance.foobar1.id}"]
|
member_ids = ["${cloudstack_instance.foobar1.id}"]
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
@ -328,19 +328,19 @@ resource "cloudstack_network" "foo" {
|
|||||||
name = "terraform-network"
|
name = "terraform-network"
|
||||||
cidr = "%s"
|
cidr = "%s"
|
||||||
network_offering = "%s"
|
network_offering = "%s"
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
zone = "${cloudstack_vpc.foobar.zone}"
|
zone = "${cloudstack_vpc.foobar.zone}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_ipaddress" "foo" {
|
resource "cloudstack_ipaddress" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_instance" "foobar1" {
|
resource "cloudstack_instance" "foobar1" {
|
||||||
name = "terraform-server1"
|
name = "terraform-server1"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "${cloudstack_network.foo.name}"
|
network_id = "${cloudstack_network.foo.id}"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "${cloudstack_network.foo.zone}"
|
zone = "${cloudstack_network.foo.zone}"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -348,12 +348,12 @@ resource "cloudstack_instance" "foobar1" {
|
|||||||
|
|
||||||
resource "cloudstack_loadbalancer_rule" "foo" {
|
resource "cloudstack_loadbalancer_rule" "foo" {
|
||||||
name = "terraform-lb"
|
name = "terraform-lb"
|
||||||
ip_address = "${cloudstack_ipaddress.foo.ip_address}"
|
ip_address_id = "${cloudstack_ipaddress.foo.id}"
|
||||||
algorithm = "roundrobin"
|
algorithm = "roundrobin"
|
||||||
network = "${cloudstack_network.foo.id}"
|
network_id = "${cloudstack_network.foo.id}"
|
||||||
public_port = 80
|
public_port = 80
|
||||||
private_port = 80
|
private_port = 80
|
||||||
members = ["${cloudstack_instance.foobar1.id}"]
|
member_ids = ["${cloudstack_instance.foobar1.id}"]
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
@ -375,19 +375,19 @@ resource "cloudstack_network" "foo" {
|
|||||||
name = "terraform-network"
|
name = "terraform-network"
|
||||||
cidr = "%s"
|
cidr = "%s"
|
||||||
network_offering = "%s"
|
network_offering = "%s"
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
zone = "${cloudstack_vpc.foobar.zone}"
|
zone = "${cloudstack_vpc.foobar.zone}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_ipaddress" "foo" {
|
resource "cloudstack_ipaddress" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_instance" "foobar1" {
|
resource "cloudstack_instance" "foobar1" {
|
||||||
name = "terraform-server1"
|
name = "terraform-server1"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "${cloudstack_network.foo.name}"
|
network_id = "${cloudstack_network.foo.id}"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "${cloudstack_network.foo.zone}"
|
zone = "${cloudstack_network.foo.zone}"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -397,7 +397,7 @@ resource "cloudstack_instance" "foobar2" {
|
|||||||
name = "terraform-server2"
|
name = "terraform-server2"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "${cloudstack_network.foo.name}"
|
network_id = "${cloudstack_network.foo.id}"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "${cloudstack_network.foo.zone}"
|
zone = "${cloudstack_network.foo.zone}"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -405,12 +405,12 @@ resource "cloudstack_instance" "foobar2" {
|
|||||||
|
|
||||||
resource "cloudstack_loadbalancer_rule" "foo" {
|
resource "cloudstack_loadbalancer_rule" "foo" {
|
||||||
name = "terraform-lb-update"
|
name = "terraform-lb-update"
|
||||||
ip_address = "${cloudstack_ipaddress.foo.ip_address}"
|
ip_address_id = "${cloudstack_ipaddress.foo.id}"
|
||||||
algorithm = "leastconn"
|
algorithm = "leastconn"
|
||||||
network = "${cloudstack_network.foo.id}"
|
network_id = "${cloudstack_network.foo.id}"
|
||||||
public_port = 443
|
public_port = 443
|
||||||
private_port = 443
|
private_port = 443
|
||||||
members = ["${cloudstack_instance.foobar1.id}", "${cloudstack_instance.foobar2.id}"]
|
member_ids = ["${cloudstack_instance.foobar1.id}", "${cloudstack_instance.foobar2.id}"]
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
|
@ -68,16 +68,33 @@ func resourceCloudStackNetwork() *schema.Resource {
|
|||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"vpc": &schema.Schema{
|
"vpc_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"vpc": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `vpc_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
|
"acl_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
|
ConflictsWith: []string{"aclid"},
|
||||||
|
},
|
||||||
|
|
||||||
"aclid": &schema.Schema{
|
"aclid": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `acl_id` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
"project": &schema.Schema{
|
"project": &schema.Schema{
|
||||||
@ -138,34 +155,34 @@ func resourceCloudStackNetworkCreate(d *schema.ResourceData, meta interface{}) e
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check is this network needs to be created in a VPC
|
// Check is this network needs to be created in a VPC
|
||||||
vpc := d.Get("vpc").(string)
|
vpc, ok := d.GetOk("vpc_id")
|
||||||
if vpc != "" {
|
if !ok {
|
||||||
|
vpc, ok = d.GetOk("vpc")
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
// Retrieve the vpc ID
|
// Retrieve the vpc ID
|
||||||
vpcid, e := retrieveID(cs, "vpc", vpc)
|
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the vpc ID
|
// Set the vpcid
|
||||||
p.SetVpcid(vpcid)
|
p.SetVpcid(vpcid)
|
||||||
|
|
||||||
// Since we're in a VPC, check if we want to assiciate an ACL list
|
// Since we're in a VPC, check if we want to assiciate an ACL list
|
||||||
aclid := d.Get("aclid").(string)
|
aclid, ok := d.GetOk("acl_id")
|
||||||
if aclid != "" {
|
if !ok {
|
||||||
|
aclid, ok = d.GetOk("acl")
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
// Set the acl ID
|
// Set the acl ID
|
||||||
p.SetAclid(aclid)
|
p.SetAclid(aclid.(string))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the new network
|
// Create the new network
|
||||||
@ -205,6 +222,18 @@ func resourceCloudStackNetworkRead(d *schema.ResourceData, meta interface{}) err
|
|||||||
d.Set("cidr", n.Cidr)
|
d.Set("cidr", n.Cidr)
|
||||||
d.Set("gateway", n.Gateway)
|
d.Set("gateway", n.Gateway)
|
||||||
|
|
||||||
|
_, vpcID := d.GetOk("vpc_id")
|
||||||
|
_, vpc := d.GetOk("vpc")
|
||||||
|
if vpcID || vpc {
|
||||||
|
d.Set("vpc_id", n.Vpcid)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, aclID := d.GetOk("acl_id")
|
||||||
|
_, acl := d.GetOk("aclid")
|
||||||
|
if aclID || acl {
|
||||||
|
d.Set("acl_id", n.Aclid)
|
||||||
|
}
|
||||||
|
|
||||||
// Read the tags and store them in a map
|
// Read the tags and store them in a map
|
||||||
tags := make(map[string]interface{})
|
tags := make(map[string]interface{})
|
||||||
for item := range n.Tags {
|
for item := range n.Tags {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -29,11 +30,19 @@ func resourceCloudStackNetworkACL() *schema.Resource {
|
|||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"vpc": &schema.Schema{
|
"vpc_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"vpc": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `vpc_id` field instead",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,8 +52,16 @@ func resourceCloudStackNetworkACLCreate(d *schema.ResourceData, meta interface{}
|
|||||||
|
|
||||||
name := d.Get("name").(string)
|
name := d.Get("name").(string)
|
||||||
|
|
||||||
|
vpc, ok := d.GetOk("vpc_id")
|
||||||
|
if !ok {
|
||||||
|
vpc, ok = d.GetOk("vpc")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `vpc_id` or [deprecated] `vpc` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the vpc ID
|
// Retrieve the vpc ID
|
||||||
vpcid, e := retrieveID(cs, "vpc", d.Get("vpc").(string))
|
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -88,14 +105,7 @@ func resourceCloudStackNetworkACLRead(d *schema.ResourceData, meta interface{})
|
|||||||
|
|
||||||
d.Set("name", f.Name)
|
d.Set("name", f.Name)
|
||||||
d.Set("description", f.Description)
|
d.Set("description", f.Description)
|
||||||
|
d.Set("vpc_id", f.Vpcid)
|
||||||
// Get the VPC details
|
|
||||||
v, _, err := cs.VPC.GetVPCByID(f.Vpcid)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
setValueOrID(d, "vpc", v.Name, v.Id)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -20,10 +21,19 @@ func resourceCloudStackNetworkACLRule() *schema.Resource {
|
|||||||
Delete: resourceCloudStackNetworkACLRuleDelete,
|
Delete: resourceCloudStackNetworkACLRuleDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
|
"acl_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
ConflictsWith: []string{"aclid"},
|
||||||
|
},
|
||||||
|
|
||||||
"aclid": &schema.Schema{
|
"aclid": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `acl_id` field instead",
|
||||||
|
ConflictsWith: []string{"acl_id"},
|
||||||
},
|
},
|
||||||
|
|
||||||
"managed": &schema.Schema{
|
"managed": &schema.Schema{
|
||||||
@ -109,8 +119,16 @@ func resourceCloudStackNetworkACLRuleCreate(d *schema.ResourceData, meta interfa
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
aclid, ok := d.GetOk("acl_id")
|
||||||
|
if !ok {
|
||||||
|
aclid, ok = d.GetOk("aclid")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `acl_id` or [deprecated] `aclid` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// We need to set this upfront in order to be able to save a partial state
|
// We need to set this upfront in order to be able to save a partial state
|
||||||
d.SetId(d.Get("aclid").(string))
|
d.SetId(aclid.(string))
|
||||||
|
|
||||||
// Create all rules that are configured
|
// Create all rules that are configured
|
||||||
if nrs := d.Get("rule").(*schema.Set); nrs.Len() > 0 {
|
if nrs := d.Get("rule").(*schema.Set); nrs.Len() > 0 {
|
||||||
|
@ -219,11 +219,11 @@ resource "cloudstack_vpc" "foobar" {
|
|||||||
resource "cloudstack_network_acl" "foo" {
|
resource "cloudstack_network_acl" "foo" {
|
||||||
name = "terraform-acl"
|
name = "terraform-acl"
|
||||||
description = "terraform-acl-text"
|
description = "terraform-acl-text"
|
||||||
vpc = "${cloudstack_vpc.foobar.id}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_network_acl_rule" "foo" {
|
resource "cloudstack_network_acl_rule" "foo" {
|
||||||
aclid = "${cloudstack_network_acl.foo.id}"
|
acl_id = "${cloudstack_network_acl.foo.id}"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
action = "allow"
|
action = "allow"
|
||||||
@ -263,11 +263,11 @@ resource "cloudstack_vpc" "foobar" {
|
|||||||
resource "cloudstack_network_acl" "foo" {
|
resource "cloudstack_network_acl" "foo" {
|
||||||
name = "terraform-acl"
|
name = "terraform-acl"
|
||||||
description = "terraform-acl-text"
|
description = "terraform-acl-text"
|
||||||
vpc = "${cloudstack_vpc.foobar.id}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_network_acl_rule" "foo" {
|
resource "cloudstack_network_acl_rule" "foo" {
|
||||||
aclid = "${cloudstack_network_acl.foo.id}"
|
acl_id = "${cloudstack_network_acl.foo.id}"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
action = "deny"
|
action = "deny"
|
||||||
|
@ -22,8 +22,6 @@ func TestAccCloudStackNetworkACL_basic(t *testing.T) {
|
|||||||
testAccCheckCloudStackNetworkACLExists(
|
testAccCheckCloudStackNetworkACLExists(
|
||||||
"cloudstack_network_acl.foo", &acl),
|
"cloudstack_network_acl.foo", &acl),
|
||||||
testAccCheckCloudStackNetworkACLBasicAttributes(&acl),
|
testAccCheckCloudStackNetworkACLBasicAttributes(&acl),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_network_acl.foo", "vpc", "terraform-vpc"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -106,7 +104,7 @@ resource "cloudstack_vpc" "foobar" {
|
|||||||
resource "cloudstack_network_acl" "foo" {
|
resource "cloudstack_network_acl" "foo" {
|
||||||
name = "terraform-acl"
|
name = "terraform-acl"
|
||||||
description = "terraform-acl-text"
|
description = "terraform-acl-text"
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
|
@ -44,8 +44,6 @@ func TestAccCloudStackNetwork_vpc(t *testing.T) {
|
|||||||
testAccCheckCloudStackNetworkExists(
|
testAccCheckCloudStackNetworkExists(
|
||||||
"cloudstack_network.foo", &network),
|
"cloudstack_network.foo", &network),
|
||||||
testAccCheckCloudStackNetworkVPCAttributes(&network),
|
testAccCheckCloudStackNetworkVPCAttributes(&network),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_network.foo", "vpc", "terraform-vpc"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -187,7 +185,7 @@ resource "cloudstack_network" "foo" {
|
|||||||
name = "terraform-network"
|
name = "terraform-network"
|
||||||
cidr = "%s"
|
cidr = "%s"
|
||||||
network_offering = "%s"
|
network_offering = "%s"
|
||||||
vpc = "${cloudstack_vpc.foobar.name}"
|
vpc_id = "${cloudstack_vpc.foobar.id}"
|
||||||
zone = "${cloudstack_vpc.foobar.zone}"
|
zone = "${cloudstack_vpc.foobar.zone}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -16,12 +17,20 @@ func resourceCloudStackNIC() *schema.Resource {
|
|||||||
Delete: resourceCloudStackNICDelete,
|
Delete: resourceCloudStackNICDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"network": &schema.Schema{
|
"network_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"network": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `network_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
"ip_address": &schema.Schema{
|
"ip_address": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
@ -32,16 +41,23 @@ func resourceCloudStackNIC() *schema.Resource {
|
|||||||
"ipaddress": &schema.Schema{
|
"ipaddress": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Deprecated: "Please use the `ip_address` field instead",
|
Deprecated: "Please use the `ip_address` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
"virtual_machine": &schema.Schema{
|
"virtual_machine_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"virtual_machine": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `virtual_machine_id` field instead",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,14 +65,31 @@ func resourceCloudStackNIC() *schema.Resource {
|
|||||||
func resourceCloudStackNICCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackNICCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
network, ok := d.GetOk("network_id")
|
||||||
|
if !ok {
|
||||||
|
network, ok = d.GetOk("network")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `network_id` or [deprecated] `network` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the network ID
|
// Retrieve the network ID
|
||||||
networkid, e := retrieveID(cs, "network", d.Get("network").(string))
|
networkid, e := retrieveID(cs, "network", network.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtualmachine, ok := d.GetOk("virtual_machine_id")
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = d.GetOk("virtual_machine")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -89,7 +122,7 @@ func resourceCloudStackNICCreate(d *schema.ResourceData, meta interface{}) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !found {
|
if !found {
|
||||||
return fmt.Errorf("Could not find NIC ID for network: %s", d.Get("network").(string))
|
return fmt.Errorf("Could not find NIC ID for network ID: %s", networkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return resourceCloudStackNICRead(d, meta)
|
return resourceCloudStackNICRead(d, meta)
|
||||||
@ -98,8 +131,23 @@ func resourceCloudStackNICCreate(d *schema.ResourceData, meta interface{}) error
|
|||||||
func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
virtualmachine, ok := d.GetOk("virtual_machine_id")
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = d.GetOk("virtual_machine")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the virtual_machine ID
|
||||||
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
|
if e != nil {
|
||||||
|
return e.Error()
|
||||||
|
}
|
||||||
|
|
||||||
// Get the virtual machine details
|
// Get the virtual machine details
|
||||||
vm, count, err := cs.VirtualMachine.GetVirtualMachineByName(d.Get("virtual_machine").(string))
|
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine").(string))
|
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine").(string))
|
||||||
@ -115,15 +163,15 @@ func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error {
|
|||||||
for _, n := range vm.Nic {
|
for _, n := range vm.Nic {
|
||||||
if n.Id == d.Id() {
|
if n.Id == d.Id() {
|
||||||
d.Set("ip_address", n.Ipaddress)
|
d.Set("ip_address", n.Ipaddress)
|
||||||
setValueOrID(d, "network", n.Networkname, n.Networkid)
|
d.Set("network_id", n.Networkid)
|
||||||
setValueOrID(d, "virtual_machine", vm.Name, vm.Id)
|
d.Set("virtual_machine_id", vm.Id)
|
||||||
found = true
|
found = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !found {
|
if !found {
|
||||||
log.Printf("[DEBUG] NIC for network %s does no longer exist", d.Get("network").(string))
|
log.Printf("[DEBUG] NIC for network ID %s does no longer exist", d.Get("network_id").(string))
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,8 +181,17 @@ func resourceCloudStackNICRead(d *schema.ResourceData, meta interface{}) error {
|
|||||||
func resourceCloudStackNICDelete(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackNICDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
virtualmachine, ok := d.GetOk("virtual_machine_id")
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = d.GetOk("virtual_machine")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
|
@ -103,8 +103,8 @@ func testAccCheckCloudStackNICAttributes(
|
|||||||
nic *cloudstack.Nic) resource.TestCheckFunc {
|
nic *cloudstack.Nic) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
if nic.Networkname != CLOUDSTACK_2ND_NIC_NETWORK {
|
if nic.Networkid != CLOUDSTACK_2ND_NIC_NETWORK {
|
||||||
return fmt.Errorf("Bad network: %s", nic.Networkname)
|
return fmt.Errorf("Bad network ID: %s", nic.Networkid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -115,8 +115,8 @@ func testAccCheckCloudStackNICIPAddress(
|
|||||||
nic *cloudstack.Nic) resource.TestCheckFunc {
|
nic *cloudstack.Nic) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
if nic.Networkname != CLOUDSTACK_2ND_NIC_NETWORK {
|
if nic.Networkid != CLOUDSTACK_2ND_NIC_NETWORK {
|
||||||
return fmt.Errorf("Bad network: %s", nic.Networkname)
|
return fmt.Errorf("Bad network ID: %s", nic.Networkname)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nic.Ipaddress != CLOUDSTACK_2ND_NIC_IPADDRESS {
|
if nic.Ipaddress != CLOUDSTACK_2ND_NIC_IPADDRESS {
|
||||||
@ -154,15 +154,15 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_nic" "foo" {
|
resource "cloudstack_nic" "foo" {
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
virtual_machine = "${cloudstack_instance.foobar.name}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
CLOUDSTACK_NETWORK_1,
|
CLOUDSTACK_NETWORK_1,
|
||||||
@ -175,16 +175,16 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform"
|
display_name = "terraform"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_nic" "foo" {
|
resource "cloudstack_nic" "foo" {
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
ip_address = "%s"
|
ip_address = "%s"
|
||||||
virtual_machine = "${cloudstack_instance.foobar.name}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
CLOUDSTACK_NETWORK_1,
|
CLOUDSTACK_NETWORK_1,
|
||||||
|
@ -22,7 +22,7 @@ func resourceCloudStackPortForward() *schema.Resource {
|
|||||||
Delete: resourceCloudStackPortForwardDelete,
|
Delete: resourceCloudStackPortForwardDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"ip_address": &schema.Schema{
|
"ip_address_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
@ -33,8 +33,8 @@ func resourceCloudStackPortForward() *schema.Resource {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Deprecated: "Please use the `ip_address` field instead",
|
Deprecated: "Please use the `ip_address_id` field instead",
|
||||||
ConflictsWith: []string{"ip_address"},
|
ConflictsWith: []string{"ip_address_id"},
|
||||||
},
|
},
|
||||||
|
|
||||||
"managed": &schema.Schema{
|
"managed": &schema.Schema{
|
||||||
@ -69,9 +69,15 @@ func resourceCloudStackPortForward() *schema.Resource {
|
|||||||
Required: true,
|
Required: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"virtual_machine": &schema.Schema{
|
"virtual_machine_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"virtual_machine": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Deprecated: "Please use the `virtual_machine_id` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
"uuid": &schema.Schema{
|
"uuid": &schema.Schema{
|
||||||
@ -88,12 +94,12 @@ func resourceCloudStackPortForward() *schema.Resource {
|
|||||||
func resourceCloudStackPortForwardCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackPortForwardCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
ipaddress, ok := d.GetOk("ip_address")
|
ipaddress, ok := d.GetOk("ip_address_id")
|
||||||
if !ok {
|
if !ok {
|
||||||
ipaddress, ok = d.GetOk("ipaddress")
|
ipaddress, ok = d.GetOk("ipaddress")
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("Either `ip_address` or [deprecated] `ipaddress` must be provided.")
|
return errors.New("Either `ip_address_id` or [deprecated] `ipaddress` must be provided.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the ipaddress ID
|
// Retrieve the ipaddress ID
|
||||||
@ -173,8 +179,17 @@ func createPortForward(
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtualmachine, ok := forward["virtual_machine_id"]
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = forward["virtual_machine"]
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", forward["virtual_machine"].(string))
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -265,12 +280,7 @@ func resourceCloudStackPortForwardRead(d *schema.ResourceData, meta interface{})
|
|||||||
forward["protocol"] = f.Protocol
|
forward["protocol"] = f.Protocol
|
||||||
forward["private_port"] = privPort
|
forward["private_port"] = privPort
|
||||||
forward["public_port"] = pubPort
|
forward["public_port"] = pubPort
|
||||||
|
forward["virtual_machine_id"] = f.Virtualmachineid
|
||||||
if isID(forward["virtual_machine"].(string)) {
|
|
||||||
forward["virtual_machine"] = f.Virtualmachineid
|
|
||||||
} else {
|
|
||||||
forward["virtual_machine"] = f.Virtualmachinename
|
|
||||||
}
|
|
||||||
|
|
||||||
forwards.Add(forward)
|
forwards.Add(forward)
|
||||||
}
|
}
|
||||||
@ -282,11 +292,11 @@ func resourceCloudStackPortForwardRead(d *schema.ResourceData, meta interface{})
|
|||||||
for uuid := range forwardMap {
|
for uuid := range forwardMap {
|
||||||
// Make a dummy forward to hold the unknown UUID
|
// Make a dummy forward to hold the unknown UUID
|
||||||
forward := map[string]interface{}{
|
forward := map[string]interface{}{
|
||||||
"protocol": uuid,
|
"protocol": uuid,
|
||||||
"private_port": 0,
|
"private_port": 0,
|
||||||
"public_port": 0,
|
"public_port": 0,
|
||||||
"virtual_machine": uuid,
|
"virtual_machine_id": uuid,
|
||||||
"uuid": uuid,
|
"uuid": uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the dummy forward to the forwards set
|
// Add the dummy forward to the forwards set
|
||||||
|
@ -21,15 +21,9 @@ func TestAccCloudStackPortForward_basic(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.protocol", "tcp"),
|
"cloudstack_port_forward.foo", "forward.#", "1"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.private_port", "443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.public_port", "8443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.virtual_machine", "terraform-test"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -47,17 +41,9 @@ func TestAccCloudStackPortForward_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "forward.#", "1"),
|
"cloudstack_port_forward.foo", "forward.#", "1"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.protocol", "tcp"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.private_port", "443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.public_port", "8443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.virtual_machine", "terraform-test"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -66,25 +52,9 @@ func TestAccCloudStackPortForward_update(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "ip_address", CLOUDSTACK_PUBLIC_IPADDRESS),
|
"cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"cloudstack_port_forward.foo", "forward.#", "2"),
|
"cloudstack_port_forward.foo", "forward.#", "2"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.260687715.protocol", "tcp"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.260687715.private_port", "80"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.260687715.public_port", "8080"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.260687715.virtual_machine", "terraform-test"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.protocol", "tcp"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.private_port", "443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.public_port", "8443"),
|
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_port_forward.foo", "forward.952396423.virtual_machine", "terraform-test"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -161,13 +131,13 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_port_forward" "foo" {
|
resource "cloudstack_port_forward" "foo" {
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
|
|
||||||
forward {
|
forward {
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
private_port = 443
|
private_port = 443
|
||||||
public_port = 8443
|
public_port = 8443
|
||||||
virtual_machine = "${cloudstack_instance.foobar.name}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}
|
}
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
@ -187,20 +157,20 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_port_forward" "foo" {
|
resource "cloudstack_port_forward" "foo" {
|
||||||
ip_address = "%s"
|
ip_address_id = "%s"
|
||||||
|
|
||||||
forward {
|
forward {
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
private_port = 443
|
private_port = 443
|
||||||
public_port = 8443
|
public_port = 8443
|
||||||
virtual_machine = "${cloudstack_instance.foobar.name}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
forward {
|
forward {
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
private_port = 80
|
private_port = 80
|
||||||
public_port = 8080
|
public_port = 8080
|
||||||
virtual_machine = "${cloudstack_instance.foobar.name}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}
|
}
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -26,12 +27,25 @@ func resourceCloudStackSecondaryIPAddress() *schema.Resource {
|
|||||||
"ipaddress": &schema.Schema{
|
"ipaddress": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Deprecated: "Please use the `ip_address` field instead",
|
Deprecated: "Please use the `ip_address` field instead",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"nic_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
|
||||||
"nicid": &schema.Schema{
|
"nicid": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `nic_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
|
"virtual_machine_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@ -39,9 +53,10 @@ func resourceCloudStackSecondaryIPAddress() *schema.Resource {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"virtual_machine": &schema.Schema{
|
"virtual_machine": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `virtual_machine_id` field instead",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -50,10 +65,22 @@ func resourceCloudStackSecondaryIPAddress() *schema.Resource {
|
|||||||
func resourceCloudStackSecondaryIPAddressCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackSecondaryIPAddressCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
nicid := d.Get("nicid").(string)
|
nicid, ok := d.GetOk("nic_id")
|
||||||
if nicid == "" {
|
if !ok {
|
||||||
|
nicid, ok = d.GetOk("nicid")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok := d.GetOk("virtual_machine_id")
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = d.GetOk("virtual_machine")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -62,7 +89,7 @@ func resourceCloudStackSecondaryIPAddressCreate(d *schema.ResourceData, meta int
|
|||||||
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
|
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine").(string))
|
log.Printf("[DEBUG] Virtual Machine %s does no longer exist", virtualmachineid)
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -73,7 +100,7 @@ func resourceCloudStackSecondaryIPAddressCreate(d *schema.ResourceData, meta int
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
p := cs.Nic.NewAddIpToNicParams(nicid)
|
p := cs.Nic.NewAddIpToNicParams(nicid.(string))
|
||||||
|
|
||||||
// If there is a ipaddres supplied, add it to the parameter struct
|
// If there is a ipaddres supplied, add it to the parameter struct
|
||||||
ipaddress, ok := d.GetOk("ip_address")
|
ipaddress, ok := d.GetOk("ip_address")
|
||||||
@ -97,8 +124,17 @@ func resourceCloudStackSecondaryIPAddressCreate(d *schema.ResourceData, meta int
|
|||||||
func resourceCloudStackSecondaryIPAddressRead(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackSecondaryIPAddressRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
virtualmachine, ok := d.GetOk("virtual_machine_id")
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = d.GetOk("virtual_machine")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `virtual_machine_id` or [deprecated] `virtual_machine` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -107,20 +143,23 @@ func resourceCloudStackSecondaryIPAddressRead(d *schema.ResourceData, meta inter
|
|||||||
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
|
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("virtual_machine").(string))
|
log.Printf("[DEBUG] Virtual Machine %s does no longer exist", virtualmachineid)
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
nicid := d.Get("nicid").(string)
|
nicid, ok := d.GetOk("nic_id")
|
||||||
if nicid == "" {
|
if !ok {
|
||||||
|
nicid, ok = d.GetOk("nicid")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
nicid = vm.Nic[0].Id
|
nicid = vm.Nic[0].Id
|
||||||
}
|
}
|
||||||
|
|
||||||
p := cs.Nic.NewListNicsParams(virtualmachineid)
|
p := cs.Nic.NewListNicsParams(virtualmachineid)
|
||||||
p.SetNicid(nicid)
|
p.SetNicid(nicid.(string))
|
||||||
|
|
||||||
l, err := cs.Nic.ListNics(p)
|
l, err := cs.Nic.ListNics(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -140,7 +179,8 @@ func resourceCloudStackSecondaryIPAddressRead(d *schema.ResourceData, meta inter
|
|||||||
for _, ip := range l.Nics[0].Secondaryip {
|
for _, ip := range l.Nics[0].Secondaryip {
|
||||||
if ip.Id == d.Id() {
|
if ip.Id == d.Id() {
|
||||||
d.Set("ip_address", ip.Ipaddress)
|
d.Set("ip_address", ip.Ipaddress)
|
||||||
d.Set("nicid", l.Nics[0].Id)
|
d.Set("nic_id", l.Nics[0].Id)
|
||||||
|
d.Set("virtual_machine_id", l.Nics[0].Virtualmachineid)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,9 +64,13 @@ func testAccCheckCloudStackSecondaryIPAddressExists(
|
|||||||
|
|
||||||
cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
|
cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
virtualmachine, ok := rs.Primary.Attributes["virtual_machine_id"]
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = rs.Primary.Attributes["virtual_machine"]
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine)
|
||||||
cs, "virtual_machine", rs.Primary.Attributes["virtual_machine"])
|
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -80,8 +84,11 @@ func testAccCheckCloudStackSecondaryIPAddressExists(
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
nicid := rs.Primary.Attributes["nicid"]
|
nicid, ok := rs.Primary.Attributes["nic_id"]
|
||||||
if nicid == "" {
|
if !ok {
|
||||||
|
nicid, ok = rs.Primary.Attributes["nicid"]
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
nicid = vm.Nic[0].Id
|
nicid = vm.Nic[0].Id
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,9 +143,13 @@ func testAccCheckCloudStackSecondaryIPAddressDestroy(s *terraform.State) error {
|
|||||||
return fmt.Errorf("No IP address ID is set")
|
return fmt.Errorf("No IP address ID is set")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtualmachine, ok := rs.Primary.Attributes["virtual_machine_id"]
|
||||||
|
if !ok {
|
||||||
|
virtualmachine, ok = rs.Primary.Attributes["virtual_machine"]
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
// Retrieve the virtual_machine ID
|
||||||
virtualmachineid, e := retrieveID(
|
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine)
|
||||||
cs, "virtual_machine", rs.Primary.Attributes["virtual_machine"])
|
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -152,8 +163,11 @@ func testAccCheckCloudStackSecondaryIPAddressDestroy(s *terraform.State) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
nicid := rs.Primary.Attributes["nicid"]
|
nicid, ok := rs.Primary.Attributes["nic_id"]
|
||||||
if nicid == "" {
|
if !ok {
|
||||||
|
nicid, ok = rs.Primary.Attributes["nicid"]
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
nicid = vm.Nic[0].Id
|
nicid = vm.Nic[0].Id
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,14 +203,14 @@ var testAccCloudStackSecondaryIPAddress_basic = fmt.Sprintf(`
|
|||||||
resource "cloudstack_instance" "foobar" {
|
resource "cloudstack_instance" "foobar" {
|
||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_secondary_ipaddress" "foo" {
|
resource "cloudstack_secondary_ipaddress" "foo" {
|
||||||
virtual_machine = "${cloudstack_instance.foobar.id}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
@ -208,7 +222,7 @@ var testAccCloudStackSecondaryIPAddress_fixedIP = fmt.Sprintf(`
|
|||||||
resource "cloudstack_instance" "foobar" {
|
resource "cloudstack_instance" "foobar" {
|
||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
expunge = true
|
expunge = true
|
||||||
@ -216,7 +230,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
|
|
||||||
resource "cloudstack_secondary_ipaddress" "foo" {
|
resource "cloudstack_secondary_ipaddress" "foo" {
|
||||||
ip_address = "%s"
|
ip_address = "%s"
|
||||||
virtual_machine = "${cloudstack_instance.foobar.id}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
CLOUDSTACK_NETWORK_1,
|
CLOUDSTACK_NETWORK_1,
|
||||||
|
@ -63,6 +63,7 @@ func resourceCloudStackSSHKeyPairCreate(d *schema.ResourceData, meta interface{}
|
|||||||
|
|
||||||
p := cs.SSH.NewRegisterSSHKeyPairParams(name, string(key))
|
p := cs.SSH.NewRegisterSSHKeyPairParams(name, string(key))
|
||||||
|
|
||||||
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if err := setProjectid(p, cs, d); err != nil {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -75,6 +76,7 @@ func resourceCloudStackSSHKeyPairCreate(d *schema.ResourceData, meta interface{}
|
|||||||
// No key supplied, must create one and return the private key
|
// No key supplied, must create one and return the private key
|
||||||
p := cs.SSH.NewCreateSSHKeyPairParams(name)
|
p := cs.SSH.NewCreateSSHKeyPairParams(name)
|
||||||
|
|
||||||
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if err := setProjectid(p, cs, d); err != nil {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -100,6 +102,7 @@ func resourceCloudStackSSHKeyPairRead(d *schema.ResourceData, meta interface{})
|
|||||||
p := cs.SSH.NewListSSHKeyPairsParams()
|
p := cs.SSH.NewListSSHKeyPairsParams()
|
||||||
p.SetName(d.Id())
|
p.SetName(d.Id())
|
||||||
|
|
||||||
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if err := setProjectid(p, cs, d); err != nil {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -127,6 +130,7 @@ func resourceCloudStackSSHKeyPairDelete(d *schema.ResourceData, meta interface{}
|
|||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
p := cs.SSH.NewDeleteSSHKeyPairParams(d.Id())
|
p := cs.SSH.NewDeleteSSHKeyPairParams(d.Id())
|
||||||
|
|
||||||
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if err := setProjectid(p, cs, d); err != nil {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -146,12 +146,11 @@ func testAccCheckCloudStackSSHKeyPairDestroy(s *terraform.State) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if list.Count != 1 {
|
|
||||||
return fmt.Errorf("Found more Key pair %s still exists", rs.Primary.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if list.SSHKeyPairs[0].Name == rs.Primary.ID {
|
for _, keyPair := range list.SSHKeyPairs {
|
||||||
return fmt.Errorf("Key pair %s still exists", rs.Primary.ID)
|
if keyPair.Name == rs.Primary.ID {
|
||||||
|
return fmt.Errorf("Key pair %s still exists", rs.Primary.ID)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,20 +17,20 @@ func resourceCloudStackStaticNAT() *schema.Resource {
|
|||||||
Delete: resourceCloudStackStaticNATDelete,
|
Delete: resourceCloudStackStaticNATDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"ipaddress": &schema.Schema{
|
"ip_address_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Required: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": &schema.Schema{
|
"network_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"virtual_machine": &schema.Schema{
|
"virtual_machine_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Required: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
@ -49,29 +49,14 @@ func resourceCloudStackStaticNAT() *schema.Resource {
|
|||||||
func resourceCloudStackStaticNATCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackStaticNATCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
// Retrieve the ipaddress ID
|
ipaddressid := d.Get("ip_address_id").(string)
|
||||||
ipaddressid, e := retrieveID(cs, "ipaddress", d.Get("ipaddress").(string))
|
virtualmachineid := d.Get("virtual_machine_id").(string)
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve the virtual_machine ID
|
|
||||||
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
p := cs.NAT.NewEnableStaticNatParams(ipaddressid, virtualmachineid)
|
p := cs.NAT.NewEnableStaticNatParams(ipaddressid, virtualmachineid)
|
||||||
|
|
||||||
if network, ok := d.GetOk("network"); ok {
|
if networkid, ok := d.GetOk("network_id"); ok {
|
||||||
// Retrieve the network ID
|
p.SetNetworkid(networkid.(string))
|
||||||
networkid, e := retrieveID(cs, "network", network.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
p.SetNetworkid(networkid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if vmGuestIP, ok := d.GetOk("vm_guest_ip"); ok {
|
if vmGuestIP, ok := d.GetOk("vm_guest_ip"); ok {
|
||||||
@ -126,8 +111,8 @@ func resourceCloudStackStaticNATRead(d *schema.ResourceData, meta interface{}) e
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
setValueOrID(d, "network", ip.Associatednetworkname, ip.Associatednetworkid)
|
d.Set("network_id", ip.Associatednetworkid)
|
||||||
setValueOrID(d, "virtual_machine", ip.Virtualmachinename, ip.Virtualmachineid)
|
d.Set("virtual_machine_id", ip.Virtualmachineid)
|
||||||
d.Set("vm_guest_ip", ip.Vmipaddress)
|
d.Set("vm_guest_ip", ip.Vmipaddress)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -66,12 +66,8 @@ func testAccCheckCloudStackStaticNATAttributes(
|
|||||||
ipaddr *cloudstack.PublicIpAddress) resource.TestCheckFunc {
|
ipaddr *cloudstack.PublicIpAddress) resource.TestCheckFunc {
|
||||||
return func(s *terraform.State) error {
|
return func(s *terraform.State) error {
|
||||||
|
|
||||||
if ipaddr.Associatednetworkname != CLOUDSTACK_NETWORK_1 {
|
if ipaddr.Associatednetworkid != CLOUDSTACK_NETWORK_1 {
|
||||||
return fmt.Errorf("Bad network: %s", ipaddr.Associatednetworkname)
|
return fmt.Errorf("Bad network ID: %s", ipaddr.Associatednetworkid)
|
||||||
}
|
|
||||||
|
|
||||||
if ipaddr.Virtualmachinename != "terraform-test" {
|
|
||||||
return fmt.Errorf("Bad virtual_machine: %s", ipaddr.Virtualmachinename)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -104,7 +100,7 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
name = "terraform-test"
|
name = "terraform-test"
|
||||||
display_name = "terraform-test"
|
display_name = "terraform-test"
|
||||||
service_offering= "%s"
|
service_offering= "%s"
|
||||||
network = "%s"
|
network_id = "%s"
|
||||||
template = "%s"
|
template = "%s"
|
||||||
zone = "%s"
|
zone = "%s"
|
||||||
user_data = "foobar\nfoo\nbar"
|
user_data = "foobar\nfoo\nbar"
|
||||||
@ -112,17 +108,16 @@ resource "cloudstack_instance" "foobar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_ipaddress" "foo" {
|
resource "cloudstack_ipaddress" "foo" {
|
||||||
network = "%s"
|
network_id = "${cloudstack_instance.foobar.network_id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_static_nat" "foo" {
|
resource "cloudstack_static_nat" "foo" {
|
||||||
ipaddress = "${cloudstack_ipaddress.foo.id}"
|
ip_address_id = "${cloudstack_ipaddress.foo.id}"
|
||||||
network = "${cloudstack_ipaddress.foo.network}"
|
network_id = "${cloudstack_ipaddress.foo.network_id}"
|
||||||
virtual_machine = "${cloudstack_instance.foobar.id}"
|
virtual_machine_id = "${cloudstack_instance.foobar.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_SERVICE_OFFERING_1,
|
CLOUDSTACK_SERVICE_OFFERING_1,
|
||||||
CLOUDSTACK_NETWORK_1,
|
CLOUDSTACK_NETWORK_1,
|
||||||
CLOUDSTACK_TEMPLATE,
|
CLOUDSTACK_TEMPLATE,
|
||||||
CLOUDSTACK_ZONE,
|
CLOUDSTACK_ZONE,
|
||||||
CLOUDSTACK_NETWORK_1,
|
|
||||||
)
|
)
|
||||||
|
@ -168,14 +168,8 @@ func resourceCloudStackTemplateCreate(d *schema.ResourceData, meta interface{})
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the new template
|
// Create the new template
|
||||||
|
@ -106,14 +106,8 @@ func resourceCloudStackVPCCreate(d *schema.ResourceData, meta interface{}) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is a project supplied, we retrieve and set the project id
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
if project, ok := d.GetOk("project"); ok {
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
// Retrieve the project ID
|
return err
|
||||||
projectid, e := retrieveID(cs, "project", project.(string))
|
|
||||||
if e != nil {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
// Set the default project ID
|
|
||||||
p.SetProjectid(projectid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the new VPC
|
// Create the new VPC
|
||||||
@ -163,8 +157,9 @@ func resourceCloudStackVPCRead(d *schema.ResourceData, meta interface{}) error {
|
|||||||
p.SetVpcid(d.Id())
|
p.SetVpcid(d.Id())
|
||||||
p.SetIssourcenat(true)
|
p.SetIssourcenat(true)
|
||||||
|
|
||||||
if _, ok := d.GetOk("project"); ok {
|
// If there is a project supplied, we retrieve and set the project id
|
||||||
p.SetProjectid(v.Projectid)
|
if err := setProjectid(p, cs, d); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the source NAT IP assigned to the VPC
|
// Get the source NAT IP assigned to the VPC
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -16,16 +17,32 @@ func resourceCloudStackVPNConnection() *schema.Resource {
|
|||||||
Delete: resourceCloudStackVPNConnectionDelete,
|
Delete: resourceCloudStackVPNConnectionDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"customergatewayid": &schema.Schema{
|
"customer_gateway_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"customergatewayid": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `customer_gateway_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
|
"vpn_gateway_id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"vpngatewayid": &schema.Schema{
|
"vpngatewayid": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `vpn_gateway_id` field instead",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -34,10 +51,27 @@ func resourceCloudStackVPNConnection() *schema.Resource {
|
|||||||
func resourceCloudStackVPNConnectionCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackVPNConnectionCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
customergatewayid, ok := d.GetOk("customer_gateway_id")
|
||||||
|
if !ok {
|
||||||
|
customergatewayid, ok = d.GetOk("customergatewayid")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New(
|
||||||
|
"Either `customer_gateway_id` or [deprecated] `customergatewayid` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
|
vpngatewayid, ok := d.GetOk("vpn_gateway_id")
|
||||||
|
if !ok {
|
||||||
|
vpngatewayid, ok = d.GetOk("vpngatewayid")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `vpn_gateway_id` or [deprecated] `vpngatewayid` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Create a new parameter struct
|
// Create a new parameter struct
|
||||||
p := cs.VPN.NewCreateVpnConnectionParams(
|
p := cs.VPN.NewCreateVpnConnectionParams(
|
||||||
d.Get("customergatewayid").(string),
|
customergatewayid.(string),
|
||||||
d.Get("vpngatewayid").(string),
|
vpngatewayid.(string),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create the new VPN Connection
|
// Create the new VPN Connection
|
||||||
@ -66,8 +100,8 @@ func resourceCloudStackVPNConnectionRead(d *schema.ResourceData, meta interface{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
d.Set("customergatewayid", v.S2scustomergatewayid)
|
d.Set("customer_gateway_id", v.S2scustomergatewayid)
|
||||||
d.Set("vpngatewayid", v.S2svpngatewayid)
|
d.Set("vpn_gateway_id", v.S2svpngatewayid)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -96,11 +96,11 @@ resource "cloudstack_vpc" "bar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "foo" {
|
resource "cloudstack_vpn_gateway" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foo.name}"
|
vpc_id = "${cloudstack_vpc.foo.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "bar" {
|
resource "cloudstack_vpn_gateway" "bar" {
|
||||||
vpc = "${cloudstack_vpc.bar.name}"
|
vpc_id = "${cloudstack_vpc.bar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_customer_gateway" "foo" {
|
resource "cloudstack_vpn_customer_gateway" "foo" {
|
||||||
@ -122,13 +122,13 @@ resource "cloudstack_vpn_customer_gateway" "bar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_connection" "foo-bar" {
|
resource "cloudstack_vpn_connection" "foo-bar" {
|
||||||
customergatewayid = "${cloudstack_vpn_customer_gateway.foo.id}"
|
customer_gateway_id = "${cloudstack_vpn_customer_gateway.foo.id}"
|
||||||
vpngatewayid = "${cloudstack_vpn_gateway.bar.id}"
|
vpn_gateway_id = "${cloudstack_vpn_gateway.bar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_connection" "bar-foo" {
|
resource "cloudstack_vpn_connection" "bar-foo" {
|
||||||
customergatewayid = "${cloudstack_vpn_customer_gateway.bar.id}"
|
customer_gateway_id = "${cloudstack_vpn_customer_gateway.bar.id}"
|
||||||
vpngatewayid = "${cloudstack_vpn_gateway.foo.id}"
|
vpn_gateway_id = "${cloudstack_vpn_gateway.foo.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
|
@ -188,11 +188,11 @@ resource "cloudstack_vpc" "bar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "foo" {
|
resource "cloudstack_vpn_gateway" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foo.name}"
|
vpc_id = "${cloudstack_vpc.foo.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "bar" {
|
resource "cloudstack_vpn_gateway" "bar" {
|
||||||
vpc = "${cloudstack_vpc.bar.name}"
|
vpc_id = "${cloudstack_vpc.bar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_customer_gateway" "foo" {
|
resource "cloudstack_vpn_customer_gateway" "foo" {
|
||||||
@ -235,11 +235,11 @@ resource "cloudstack_vpc" "bar" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "foo" {
|
resource "cloudstack_vpn_gateway" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foo.name}"
|
vpc_id = "${cloudstack_vpc.foo.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "bar" {
|
resource "cloudstack_vpn_gateway" "bar" {
|
||||||
vpc = "${cloudstack_vpc.bar.name}"
|
vpc_id = "${cloudstack_vpc.bar.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_customer_gateway" "foo" {
|
resource "cloudstack_vpn_customer_gateway" "foo" {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cloudstack
|
package cloudstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
@ -16,12 +17,20 @@ func resourceCloudStackVPNGateway() *schema.Resource {
|
|||||||
Delete: resourceCloudStackVPNGatewayDelete,
|
Delete: resourceCloudStackVPNGatewayDelete,
|
||||||
|
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"vpc": &schema.Schema{
|
"vpc_id": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"vpc": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Deprecated: "Please use the `vpc_id` field instead",
|
||||||
|
},
|
||||||
|
|
||||||
"public_ip": &schema.Schema{
|
"public_ip": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@ -33,8 +42,16 @@ func resourceCloudStackVPNGateway() *schema.Resource {
|
|||||||
func resourceCloudStackVPNGatewayCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceCloudStackVPNGatewayCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
cs := meta.(*cloudstack.CloudStackClient)
|
cs := meta.(*cloudstack.CloudStackClient)
|
||||||
|
|
||||||
|
vpc, ok := d.GetOk("vpc_id")
|
||||||
|
if !ok {
|
||||||
|
vpc, ok = d.GetOk("vpc")
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return errors.New("Either `vpc_id` or [deprecated] `vpc` must be provided.")
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve the VPC ID
|
// Retrieve the VPC ID
|
||||||
vpcid, e := retrieveID(cs, "vpc", d.Get("vpc").(string))
|
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e.Error()
|
return e.Error()
|
||||||
}
|
}
|
||||||
@ -45,7 +62,7 @@ func resourceCloudStackVPNGatewayCreate(d *schema.ResourceData, meta interface{}
|
|||||||
// Create the new VPN Gateway
|
// Create the new VPN Gateway
|
||||||
v, err := cs.VPN.CreateVpnGateway(p)
|
v, err := cs.VPN.CreateVpnGateway(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error creating VPN Gateway for VPC %s: %s", d.Get("vpc").(string), err)
|
return fmt.Errorf("Error creating VPN Gateway for VPC ID %s: %s", vpcid, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.SetId(v.Id)
|
d.SetId(v.Id)
|
||||||
@ -61,7 +78,7 @@ func resourceCloudStackVPNGatewayRead(d *schema.ResourceData, meta interface{})
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
log.Printf(
|
log.Printf(
|
||||||
"[DEBUG] VPN Gateway for VPC %s does no longer exist", d.Get("vpc").(string))
|
"[DEBUG] VPN Gateway for VPC ID %s does no longer exist", d.Get("vpc_id").(string))
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -69,8 +86,7 @@ func resourceCloudStackVPNGatewayRead(d *schema.ResourceData, meta interface{})
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
setValueOrID(d, "vpc", d.Get("vpc").(string), v.Vpcid)
|
d.Set("vpc_id", v.Vpcid)
|
||||||
|
|
||||||
d.Set("public_ip", v.Publicip)
|
d.Set("public_ip", v.Publicip)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -92,7 +108,7 @@ func resourceCloudStackVPNGatewayDelete(d *schema.ResourceData, meta interface{}
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt.Errorf("Error deleting VPN Gateway for VPC %s: %s", d.Get("vpc").(string), err)
|
return fmt.Errorf("Error deleting VPN Gateway for VPC %s: %s", d.Get("vpc_id").(string), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -22,8 +22,6 @@ func TestAccCloudStackVPNGateway_basic(t *testing.T) {
|
|||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckCloudStackVPNGatewayExists(
|
testAccCheckCloudStackVPNGatewayExists(
|
||||||
"cloudstack_vpn_gateway.foo", &vpnGateway),
|
"cloudstack_vpn_gateway.foo", &vpnGateway),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"cloudstack_vpn_gateway.foo", "vpc", "terraform-vpc"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -90,7 +88,7 @@ resource "cloudstack_vpc" "foo" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "cloudstack_vpn_gateway" "foo" {
|
resource "cloudstack_vpn_gateway" "foo" {
|
||||||
vpc = "${cloudstack_vpc.foo.name}"
|
vpc_id = "${cloudstack_vpc.foo.id}"
|
||||||
}`,
|
}`,
|
||||||
CLOUDSTACK_VPC_CIDR_1,
|
CLOUDSTACK_VPC_CIDR_1,
|
||||||
CLOUDSTACK_VPC_OFFERING,
|
CLOUDSTACK_VPC_OFFERING,
|
||||||
|
@ -14,7 +14,7 @@ Creates egress firewall rules for a given network.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_egress_firewall" "default" {
|
resource "cloudstack_egress_firewall" "default" {
|
||||||
network = "test-network"
|
network_id = "6eb22f91-7454-4107-89f4-36afcdf33021"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["10.0.0.0/8"]
|
cidr_list = ["10.0.0.0/8"]
|
||||||
@ -28,8 +28,11 @@ resource "cloudstack_egress_firewall" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `network` - (Required) The network for which to create the egress firewall
|
* `network_id` - (Required) The network ID for which to create the egress
|
||||||
rules. Changing this forces a new resource to be created.
|
firewall rules. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `network` - (Required, Deprecated) The network for which to create the egress
|
||||||
|
firewall rules. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `managed` - (Optional) USE WITH CAUTION! If enabled all the egress firewall
|
* `managed` - (Optional) USE WITH CAUTION! If enabled all the egress firewall
|
||||||
rules for this network will be managed by this resource. This means it will
|
rules for this network will be managed by this resource. This means it will
|
||||||
|
@ -14,7 +14,7 @@ Creates firewall rules for a given IP address.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_firewall" "default" {
|
resource "cloudstack_firewall" "default" {
|
||||||
ip_address = "192.168.0.1"
|
ip_address_id = "30b21801-d4b3-4174-852b-0c0f30bdbbfb"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
cidr_list = ["10.0.0.0/8"]
|
cidr_list = ["10.0.0.0/8"]
|
||||||
@ -28,8 +28,8 @@ resource "cloudstack_firewall" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `ip_address` - (Required) The IP address or ID for which to create the firewall
|
* `ip_address_id` - (Required) The IP address ID for which to create the
|
||||||
rules. Changing this forces a new resource to be created.
|
firewall rules. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `ipaddress` - (Required, Deprecated) The IP address or ID for which to create
|
* `ipaddress` - (Required, Deprecated) The IP address or ID for which to create
|
||||||
the firewall rules. Changing this forces a new resource to be created.
|
the firewall rules. Changing this forces a new resource to be created.
|
||||||
|
@ -17,7 +17,7 @@ disk offering, and template.
|
|||||||
resource "cloudstack_instance" "web" {
|
resource "cloudstack_instance" "web" {
|
||||||
name = "server-1"
|
name = "server-1"
|
||||||
service_offering= "small"
|
service_offering= "small"
|
||||||
network = "network-1"
|
network_id = "6eb22f91-7454-4107-89f4-36afcdf33021"
|
||||||
template = "CentOS 6.5"
|
template = "CentOS 6.5"
|
||||||
zone = "zone-1"
|
zone = "zone-1"
|
||||||
}
|
}
|
||||||
@ -34,9 +34,12 @@ The following arguments are supported:
|
|||||||
* `service_offering` - (Required) The name or ID of the service offering used
|
* `service_offering` - (Required) The name or ID of the service offering used
|
||||||
for this instance.
|
for this instance.
|
||||||
|
|
||||||
* `network` - (Optional) The name or ID of the network to connect this instance
|
* `network_id` - (Optional) The ID of the network to connect this instance
|
||||||
to. Changing this forces a new resource to be created.
|
to. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `network` - (Optional, Deprecated) The name or ID of the network to connect
|
||||||
|
this instance to. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `ip_address` - (Optional) The IP address to assign to this instance. Changing
|
* `ip_address` - (Optional) The IP address to assign to this instance. Changing
|
||||||
this forces a new resource to be created.
|
this forces a new resource to be created.
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ Acquires and associates a public IP.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_ipaddress" "default" {
|
resource "cloudstack_ipaddress" "default" {
|
||||||
network = "test-network"
|
network_id = "6eb22f91-7454-4107-89f4-36afcdf33021"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -22,16 +22,24 @@ resource "cloudstack_ipaddress" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `network` - (Optional) The name or ID of the network for which an IP address should
|
* `network_id` - (Optional) The ID of the network for which an IP address should
|
||||||
be acquired and associated. Changing this forces a new resource to be created.
|
be acquired and associated. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `vpc` - (Optional) The name or ID of the VPC for which an IP address should
|
* `network` - (Optional, Deprecated) The name or ID of the network for which an IP
|
||||||
be acquired and associated. Changing this forces a new resource to be created.
|
addess should be acquired and associated. Changing this forces a new resource
|
||||||
|
to be created.
|
||||||
|
|
||||||
|
* `vpc_id` - (Optional) The ID of the VPC for which an IP address should be
|
||||||
|
acquired and associated. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `vpc` - (Optional, Deprecated) The name or ID of the VPC for which an IP address
|
||||||
|
should be acquired and associated. Changing this forces a new resource to be
|
||||||
|
created.
|
||||||
|
|
||||||
* `project` - (Optional) The name or ID of the project to deploy this
|
* `project` - (Optional) The name or ID of the project to deploy this
|
||||||
instance to. Changing this forces a new resource to be created.
|
instance to. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
*NOTE: Either `network` or `vpc` should have a value!*
|
*NOTE: Either `network_id` or `vpc_id` should have a value!*
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -16,11 +16,11 @@ Creates a loadbalancer rule.
|
|||||||
resource "cloudstack_loadbalancer_rule" "default" {
|
resource "cloudstack_loadbalancer_rule" "default" {
|
||||||
name = "loadbalancer-rule-1"
|
name = "loadbalancer-rule-1"
|
||||||
description = "Loadbalancer rule 1"
|
description = "Loadbalancer rule 1"
|
||||||
ip_address = "192.168.0.1"
|
ip_address_id = "30b21801-d4b3-4174-852b-0c0f30bdbbfb"
|
||||||
algorithm = "roundrobin"
|
algorithm = "roundrobin"
|
||||||
private_port = 80
|
private_port = 80
|
||||||
public_port = 80
|
public_port = 80
|
||||||
members = ["server-1", "server-2"]
|
member_ids = ["f8141e2f-4e7e-4c63-9362-986c908b7ea7"]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -33,16 +33,20 @@ The following arguments are supported:
|
|||||||
|
|
||||||
* `description` - (Optional) The description of the load balancer rule.
|
* `description` - (Optional) The description of the load balancer rule.
|
||||||
|
|
||||||
* `ip_address` - (Required) Public ip address from where the network traffic
|
* `ip_address_id` - (Required) Public IP address ID from where the network
|
||||||
will be load balanced from. Changing this forces a new resource to be
|
traffic will be load balanced from. Changing this forces a new resource
|
||||||
created.
|
to be created.
|
||||||
|
|
||||||
* `ipaddress` - (Required, Deprecated) Public ip address from where the
|
* `ipaddress` - (Required, Deprecated) Public IP address from where the
|
||||||
network traffic will be load balanced from. Changing this forces a new
|
network traffic will be load balanced from. Changing this forces a new
|
||||||
resource to be created.
|
resource to be created.
|
||||||
|
|
||||||
* `network` - (Optional) The guest network this rule will be created for.
|
* `network_id` - (Optional) The network ID this rule will be created for.
|
||||||
Required when public IP address is not associated with any Guest network
|
Required when public IP address is not associated with any network yet
|
||||||
|
(VPC case).
|
||||||
|
|
||||||
|
* `network` - (Optional, Deprecated) The network this rule will be created
|
||||||
|
for. Required when public IP address is not associated with any network
|
||||||
yet (VPC case).
|
yet (VPC case).
|
||||||
|
|
||||||
* `algorithm` - (Required) Load balancer rule algorithm (source, roundrobin,
|
* `algorithm` - (Required) Load balancer rule algorithm (source, roundrobin,
|
||||||
@ -56,8 +60,11 @@ The following arguments are supported:
|
|||||||
will be load balanced from. Changing this forces a new resource to be
|
will be load balanced from. Changing this forces a new resource to be
|
||||||
created.
|
created.
|
||||||
|
|
||||||
* `members` - (Required) List of instances to assign to the load balancer rule.
|
* `member_ids` - (Required) List of instance IDs to assign to the load balancer
|
||||||
Changing this forces a new resource to be created.
|
rule. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `members` - (Required, Deprecated) List of instances to assign to the load
|
||||||
|
balancer rule. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -50,11 +50,17 @@ The following arguments are supported:
|
|||||||
required by the Network Offering if specifyVlan=true is set. Only the ROOT
|
required by the Network Offering if specifyVlan=true is set. Only the ROOT
|
||||||
admin can set this value.
|
admin can set this value.
|
||||||
|
|
||||||
* `vpc` - (Optional) The name or ID of the VPC to create this network for. Changing
|
* `vpc_id` - (Optional) The ID of the VPC to create this network for. Changing
|
||||||
this forces a new resource to be created.
|
this forces a new resource to be created.
|
||||||
|
|
||||||
* `aclid` - (Optional) The ID of a network ACL that should be attached to the
|
* `vpc` - (Optional, Deprecated) The name or ID of the VPC to create this network
|
||||||
network. Changing this forces a new resource to be created.
|
for. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `acl_id` - (Optional) The network ACL ID that should be attached to the network.
|
||||||
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `aclid` - (Optional, Deprecated) The ID of a network ACL that should be attached
|
||||||
|
to the network. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `project` - (Optional) The name or ID of the project to deploy this
|
* `project` - (Optional) The name or ID of the project to deploy this
|
||||||
instance to. Changing this forces a new resource to be created.
|
instance to. Changing this forces a new resource to be created.
|
||||||
|
@ -15,7 +15,7 @@ Creates a Network ACL for the given VPC.
|
|||||||
```
|
```
|
||||||
resource "cloudstack_network_acl" "default" {
|
resource "cloudstack_network_acl" "default" {
|
||||||
name = "test-acl"
|
name = "test-acl"
|
||||||
vpc = "vpc-1"
|
vpc_id = "76f6e8dc-07e3-4971-b2a2-8831b0cc4cb4"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -25,10 +25,15 @@ The following arguments are supported:
|
|||||||
|
|
||||||
* `name` - (Required) The name of the ACL. Changing this forces a new resource
|
* `name` - (Required) The name of the ACL. Changing this forces a new resource
|
||||||
to be created.
|
to be created.
|
||||||
|
|
||||||
* `description` - (Optional) The description of the ACL. Changing this forces a
|
* `description` - (Optional) The description of the ACL. Changing this forces a
|
||||||
new resource to be created.
|
new resource to be created.
|
||||||
* `vpc` - (Required) The name or ID of the VPC to create this ACL for. Changing
|
|
||||||
this forces a new resource to be created.
|
* `vpc_id` - (Required) The ID of the VPC to create this ACL for. Changing this
|
||||||
|
forces a new resource to be created.
|
||||||
|
|
||||||
|
* `vpc` - (Required, Deprecated) The name or ID of the VPC to create this ACL
|
||||||
|
for. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ Creates network ACL rules for a given network ACL.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_network_acl_rule" "default" {
|
resource "cloudstack_network_acl_rule" "default" {
|
||||||
aclid = "f3843ce0-334c-4586-bbd3-0c2e2bc946c6"
|
acl_id = "f3843ce0-334c-4586-bbd3-0c2e2bc946c6"
|
||||||
|
|
||||||
rule {
|
rule {
|
||||||
action = "allow"
|
action = "allow"
|
||||||
@ -30,9 +30,12 @@ resource "cloudstack_network_acl_rule" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `aclid` - (Required) The network ACL ID for which to create the rules.
|
* `acl_id` - (Required) The network ACL ID for which to create the rules.
|
||||||
Changing this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `aclid` - (Required, Deprecated) The network ACL ID for which to create
|
||||||
|
the rules. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `managed` - (Optional) USE WITH CAUTION! If enabled all the firewall rules for
|
* `managed` - (Optional) USE WITH CAUTION! If enabled all the firewall rules for
|
||||||
this network ACL will be managed by this resource. This means it will delete
|
this network ACL will be managed by this resource. This means it will delete
|
||||||
all firewall rules that are not in your config! (defaults false)
|
all firewall rules that are not in your config! (defaults false)
|
||||||
|
@ -16,9 +16,9 @@ Basic usage:
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_nic" "test" {
|
resource "cloudstack_nic" "test" {
|
||||||
network = "network-2"
|
network_id = "6eb22f91-7454-4107-89f4-36afcdf33021"
|
||||||
ip_address = "192.168.1.1"
|
ip_address = "192.168.1.1"
|
||||||
virtual_machine = "server-1"
|
virtual_machine_id = "f8141e2f-4e7e-4c63-9362-986c908b7ea7"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -26,17 +26,24 @@ resource "cloudstack_nic" "test" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `network` - (Required) The name or ID of the network to plug the NIC into. Changing
|
* `network_id` - (Required) The ID of the network to plug the NIC into. Changing
|
||||||
this forces a new resource to be created.
|
this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `network` - (Required, Deprecated) The name or ID of the network to plug the
|
||||||
|
NIC into. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `ip_address` - (Optional) The IP address to assign to the NIC. Changing this
|
* `ip_address` - (Optional) The IP address to assign to the NIC. Changing this
|
||||||
forces a new resource to be created.
|
forces a new resource to be created.
|
||||||
|
|
||||||
* `ipaddress` - (Optional, Deprecated) The IP address to assign to the NIC. Changing
|
* `ipaddress` - (Optional, Deprecated) The IP address to assign to the NIC.
|
||||||
this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `virtual_machine` - (Required) The name or ID of the virtual machine to which
|
* `virtual_machine_id` - (Required) The ID of the virtual machine to which to
|
||||||
to attach the NIC. Changing this forces a new resource to be created.
|
attach the NIC. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `virtual_machine` - (Required, Deprecated) The name or ID of the virtual
|
||||||
|
machine to which to attach the NIC. Changing this forces a new resource to
|
||||||
|
be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -14,13 +14,13 @@ Creates port forwards.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_port_forward" "default" {
|
resource "cloudstack_port_forward" "default" {
|
||||||
ip_address = "192.168.0.1"
|
ip_address_id = "30b21801-d4b3-4174-852b-0c0f30bdbbfb"
|
||||||
|
|
||||||
forward {
|
forward {
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
private_port = 80
|
private_port = 80
|
||||||
public_port = 8080
|
public_port = 8080
|
||||||
virtual_machine = "server-1"
|
virtual_machine_id = "f8141e2f-4e7e-4c63-9362-986c908b7ea7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -29,8 +29,8 @@ resource "cloudstack_port_forward" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `ip_address` - (Required) The IP address for which to create the port forwards.
|
* `ip_address_id` - (Required) The IP address ID for which to create the port
|
||||||
Changing this forces a new resource to be created.
|
forwards. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `ipaddress` - (Required, Deprecated) The IP address for which to create the port
|
* `ipaddress` - (Required, Deprecated) The IP address for which to create the port
|
||||||
forwards. Changing this forces a new resource to be created.
|
forwards. Changing this forces a new resource to be created.
|
||||||
@ -51,7 +51,10 @@ The `forward` block supports:
|
|||||||
|
|
||||||
* `public_port` - (Required) The public port to forward from.
|
* `public_port` - (Required) The public port to forward from.
|
||||||
|
|
||||||
* `virtual_machine` - (Required) The name or ID of the virtual machine to forward to.
|
* `virtual_machine_id` - (Required) The ID of the virtual machine to forward to.
|
||||||
|
|
||||||
|
* `virtual_machine` - (Required, Deprecated) The name or ID of the virtual
|
||||||
|
machine to forward to.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ Assigns a secondary IP to a NIC.
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_secondary_ipaddress" "default" {
|
resource "cloudstack_secondary_ipaddress" "default" {
|
||||||
virtual_machine = "server-1"
|
virtual_machine_id = "server-1"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -23,20 +23,28 @@ resource "cloudstack_secondary_ipaddress" "default" {
|
|||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `ip_address` - (Optional) The IP address to attach the to NIC. If not supplied
|
* `ip_address` - (Optional) The IP address to attach the to NIC. If not supplied
|
||||||
an IP address will be selected randomly. Changing this forces a new resource
|
an IP address will be selected randomly. Changing this forces a new resource
|
||||||
to be created.
|
to be created.
|
||||||
|
|
||||||
* `ipaddress` - (Optional, Deprecated) The IP address to attach the to NIC. If
|
* `ipaddress` - (Optional, Deprecated) The IP address to attach the to NIC. If
|
||||||
not supplied an IP address will be selected randomly. Changing this forces
|
not supplied an IP address will be selected randomly. Changing this forces
|
||||||
a new resource to be created.
|
a new resource to be created.
|
||||||
|
|
||||||
* `nicid` - (Optional) The ID of the NIC to which you want to attach the
|
* `nic_id` - (Optional) The NIC ID to which you want to attach the secondary IP
|
||||||
secondary IP address. Changing this forces a new resource to be
|
address. Changing this forces a new resource to be created (defaults to the
|
||||||
created (defaults to the ID of the primary NIC)
|
ID of the primary NIC)
|
||||||
|
|
||||||
* `virtual_machine` - (Required) The name or ID of the virtual machine to which
|
* `nicid` - (Optional, Deprecated) The ID of the NIC to which you want to attach
|
||||||
you want to attach the secondary IP address. Changing this forces a new
|
the secondary IP address. Changing this forces a new resource to be created
|
||||||
resource to be created.
|
(defaults to the ID of the primary NIC)
|
||||||
|
|
||||||
|
* `virtual_machine_id` - (Required) The ID of the virtual machine to which you
|
||||||
|
want to attach the secondary IP address. Changing this forces a new resource
|
||||||
|
to be created.
|
||||||
|
|
||||||
|
* `virtual_machine` - (Required, Deprecated) The name or ID of the virtual
|
||||||
|
machine to which you want to attach the secondary IP address. Changing this
|
||||||
|
forces a new resource to be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@ Enables static NAT for a given IP address
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_static_nat" "default" {
|
resource "cloudstack_static_nat" "default" {
|
||||||
ipaddress = "192.168.0.1"
|
ip_address_id = "f8141e2f-4e7e-4c63-9362-986c908b7ea7"
|
||||||
virtual_machine = "server-1"
|
virtual_machine_id = "6ca2a163-bc68-429c-adc8-ab4a620b1bb3"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -23,18 +23,16 @@ resource "cloudstack_static_nat" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `ipaddress` - (Required) The name or ID of the public IP address for which
|
* `ip_address_id` - (Required) The public IP address ID for which static
|
||||||
static NAT will be enabled. Changing this forces a new resource to be
|
NAT will be enabled. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `network_id` - (Optional) The network ID of the VM the static NAT will be
|
||||||
|
enabled for. Required when public IP address is not associated with any
|
||||||
|
guest network yet (VPC case). Changing this forces a new resource to be
|
||||||
created.
|
created.
|
||||||
|
|
||||||
* `network` - (Optional) The name or ID of the network of the VM the static
|
* `virtual_machine_id` - (Required) The virtual machine ID to enable the
|
||||||
NAT will be enabled for. Required when public IP address is not
|
static NAT feature for. Changing this forces a new resource to be created.
|
||||||
associated with any guest network yet (VPC case). Changing this forces
|
|
||||||
a new resource to be created.
|
|
||||||
|
|
||||||
* `virtual_machine` - (Required) The name or ID of the virtual machine to
|
|
||||||
enable the static NAT feature for. Changing this forces a new resource
|
|
||||||
to be created.
|
|
||||||
|
|
||||||
* `vm_guest_ip` - (Optional) The virtual machine IP address for the port
|
* `vm_guest_ip` - (Optional) The virtual machine IP address for the port
|
||||||
forwarding rule (useful when the virtual machine has a secondairy NIC).
|
forwarding rule (useful when the virtual machine has a secondairy NIC).
|
||||||
|
@ -31,8 +31,8 @@ The following arguments are supported:
|
|||||||
|
|
||||||
* `display_text` - (Optional) The display name of the template.
|
* `display_text` - (Optional) The display name of the template.
|
||||||
|
|
||||||
* `format` - (Required) The format of the template. Valid values are "QCOW2",
|
* `format` - (Required) The format of the template. Valid values are `QCOW2`,
|
||||||
"RAW", and "VHD".
|
`RAW`, and `VHD`.
|
||||||
|
|
||||||
* `hypervisor` - (Required) The target hypervisor for the template. Changing
|
* `hypervisor` - (Required) The target hypervisor for the template. Changing
|
||||||
this forces a new resource to be created.
|
this forces a new resource to be created.
|
||||||
@ -43,11 +43,14 @@ The following arguments are supported:
|
|||||||
* `url` - (Required) The URL of where the template is hosted. Changing this
|
* `url` - (Required) The URL of where the template is hosted. Changing this
|
||||||
forces a new resource to be created.
|
forces a new resource to be created.
|
||||||
|
|
||||||
|
* `project` - (Optional) The name or ID of the project to create this template for.
|
||||||
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `zone` - (Required) The name or ID of the zone where this template will be created.
|
* `zone` - (Required) The name or ID of the zone where this template will be created.
|
||||||
Changing this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `is_dynamically_scalable` - (Optional) Set to indicate if the template contains
|
* `is_dynamically_scalable` - (Optional) Set to indicate if the template contains
|
||||||
tools to support dynamic scaling of VM cpu/memory.
|
tools to support dynamic scaling of VM cpu/memory (defaults false)
|
||||||
|
|
||||||
* `is_extractable` - (Optional) Set to indicate if the template is extractable
|
* `is_extractable` - (Optional) Set to indicate if the template is extractable
|
||||||
(defaults false)
|
(defaults false)
|
||||||
|
@ -16,8 +16,8 @@ Basic usage:
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_vpn_connection" "default" {
|
resource "cloudstack_vpn_connection" "default" {
|
||||||
customergatewayid = "xxx"
|
customer_gateway_id = "8dab9381-ae73-48b8-9a3d-c460933ef5f7"
|
||||||
vpngatewayid = "xxx"
|
vpn_gateway_id = "a7900060-f8a8-44eb-be15-ea54cf499703"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -25,10 +25,16 @@ resource "cloudstack_vpn_connection" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `customergatewayid` - (Required) The Customer Gateway ID to connect.
|
* `customer_gateway_id` - (Required) The Customer Gateway ID to connect.
|
||||||
Changing this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
* `vpngatewayid` - (Required) The VPN Gateway ID to connect.
|
* `customergatewayid` - (Required, Deprecated) The Customer Gateway ID
|
||||||
|
to connect. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `vpn_gateway_id` - (Required) The VPN Gateway ID to connect. Changing
|
||||||
|
this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `vpngatewayid` - (Required, Deprecated) The VPN Gateway ID to connect.
|
||||||
Changing this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
@ -16,7 +16,7 @@ Basic usage:
|
|||||||
|
|
||||||
```
|
```
|
||||||
resource "cloudstack_vpn_gateway" "default" {
|
resource "cloudstack_vpn_gateway" "default" {
|
||||||
vpc = "test-vpc"
|
vpc_id = "f8141e2f-4e7e-4c63-9362-986c908b7ea7"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -24,9 +24,12 @@ resource "cloudstack_vpn_gateway" "default" {
|
|||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
|
||||||
* `vpc` - (Required) The name or ID of the VPC for which to create the VPN Gateway.
|
* `vpc_id` - (Required) The ID of the VPC for which to create the VPN Gateway.
|
||||||
Changing this forces a new resource to be created.
|
Changing this forces a new resource to be created.
|
||||||
|
|
||||||
|
* `vpc` - (Required, Deprecated) The name or ID of the VPC for which to create
|
||||||
|
the VPN Gateway. Changing this forces a new resource to be created.
|
||||||
|
|
||||||
## Attributes Reference
|
## Attributes Reference
|
||||||
|
|
||||||
The following attributes are exported:
|
The following attributes are exported:
|
||||||
|
Loading…
Reference in New Issue
Block a user