Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Tenant Connection and Approval Request #46

7 changes: 7 additions & 0 deletions ecl/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,13 @@ func (c *Config) rcaV1Client(region string) (*eclcloud.ServiceClient, error) {
})
}

func (c *Config) providerConnectivityV2Client(region string) (*eclcloud.ServiceClient, error) {
return ecl.NewProviderConnectivityV2(c.OsClient, eclcloud.EndpointOpts{
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

// StorageRetryMaxCount is a integer value that means
// retry maximum count for request against storage SDP
const StorageRetryMaxCount int = 30
Expand Down
65 changes: 34 additions & 31 deletions ecl/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,37 +202,40 @@ func Provider() terraform.ResourceProvider {
},

ResourcesMap: map[string]*schema.Resource{
"ecl_baremetal_server_v2": resourceBaremetalServerV2(),
"ecl_baremetal_keypair_v2": resourceBaremetalKeypairV2(),
"ecl_compute_instance_v2": resourceComputeInstanceV2(),
"ecl_compute_keypair_v2": resourceComputeKeypairV2(),
"ecl_compute_volume_attach_v2": resourceComputeVolumeAttachV2(),
"ecl_compute_volume_v2": resourceComputeVolumeV2(),
"ecl_dedicated_hypervisor_server_v1": resourceDedicatedHypervisorServerV1(),
"ecl_dedicated_hypervisor_license_v1": resourceDedicatedHypervisorLicenseV1(),
"ecl_dns_recordset_v2": resourceDNSRecordSetV2(),
"ecl_dns_zone_v2": resourceDNSZoneV2(),
"ecl_imagestorages_image_v2": resourceImageStoragesImageV2(),
"ecl_imagestorages_member_accepter_v2": resourceImageStoragesMemberAccepterV2(),
"ecl_imagestorages_member_v2": resourceImageStoragesMemberV2(),
"ecl_network_common_function_gateway_v2": resourceNetworkCommonFunctionGatewayV2(),
"ecl_network_gateway_interface_v2": resourceNetworkGatewayInterfaceV2(),
"ecl_network_internet_gateway_v2": resourceNetworkInternetGatewayV2(),
"ecl_network_network_v2": resourceNetworkNetworkV2(),
"ecl_network_port_v2": resourceNetworkPortV2(),
"ecl_network_public_ip_v2": resourceNetworkPublicIPV2(),
"ecl_network_static_route_v2": resourceNetworkStaticRouteV2(),
"ecl_network_subnet_v2": resourceNetworkSubnetV2(),
"ecl_rca_user_v1": resourceRCAUserV1(),
"ecl_security_host_based_v1": resourceSecurityHostBasedV1(),
"ecl_security_network_based_device_ha_v1": resourceSecurityNetworkBasedDeviceHAV1(),
"ecl_security_network_based_device_single_v1": resourceSecurityNetworkBasedDeviceSingleV1(),
"ecl_security_network_based_waf_single_v1": resourceSecurityNetworkBasedWAFSingleV1(),
"ecl_sss_tenant_v1": resourceSSSTenantV1(),
"ecl_sss_user_v1": resourceSSSUserV1(),
"ecl_storage_virtualstorage_v1": resourceStorageVirtualStorageV1(),
"ecl_storage_volume_v1": resourceStorageVolumeV1(),
"ecl_vna_appliance_v1": resourceVNAApplianceV1(),
"ecl_baremetal_server_v2": resourceBaremetalServerV2(),
"ecl_baremetal_keypair_v2": resourceBaremetalKeypairV2(),
"ecl_compute_instance_v2": resourceComputeInstanceV2(),
"ecl_compute_keypair_v2": resourceComputeKeypairV2(),
"ecl_compute_volume_attach_v2": resourceComputeVolumeAttachV2(),
"ecl_compute_volume_v2": resourceComputeVolumeV2(),
"ecl_dedicated_hypervisor_server_v1": resourceDedicatedHypervisorServerV1(),
"ecl_dedicated_hypervisor_license_v1": resourceDedicatedHypervisorLicenseV1(),
"ecl_dns_recordset_v2": resourceDNSRecordSetV2(),
"ecl_dns_zone_v2": resourceDNSZoneV2(),
"ecl_imagestorages_image_v2": resourceImageStoragesImageV2(),
"ecl_imagestorages_member_accepter_v2": resourceImageStoragesMemberAccepterV2(),
"ecl_imagestorages_member_v2": resourceImageStoragesMemberV2(),
"ecl_network_common_function_gateway_v2": resourceNetworkCommonFunctionGatewayV2(),
"ecl_network_gateway_interface_v2": resourceNetworkGatewayInterfaceV2(),
"ecl_network_internet_gateway_v2": resourceNetworkInternetGatewayV2(),
"ecl_network_network_v2": resourceNetworkNetworkV2(),
"ecl_network_port_v2": resourceNetworkPortV2(),
"ecl_network_public_ip_v2": resourceNetworkPublicIPV2(),
"ecl_network_static_route_v2": resourceNetworkStaticRouteV2(),
"ecl_network_subnet_v2": resourceNetworkSubnetV2(),
"ecl_provider_connectivity_tenant_connection_request_v2": resourceProviderConnectivityTenantConnectionRequestV2(),
"ecl_provider_connectivity_tenant_connection_v2": resourceProviderConnectivityTenantConnectionV2(),
"ecl_rca_user_v1": resourceRCAUserV1(),
"ecl_security_host_based_v1": resourceSecurityHostBasedV1(),
"ecl_security_network_based_device_ha_v1": resourceSecurityNetworkBasedDeviceHAV1(),
"ecl_security_network_based_device_single_v1": resourceSecurityNetworkBasedDeviceSingleV1(),
"ecl_security_network_based_waf_single_v1": resourceSecurityNetworkBasedWAFSingleV1(),
"ecl_sss_approval_request_v1": resourceSSSApprovalRequestV1(),
"ecl_sss_tenant_v1": resourceSSSTenantV1(),
"ecl_sss_user_v1": resourceSSSUserV1(),
"ecl_storage_virtualstorage_v1": resourceStorageVirtualStorageV1(),
"ecl_storage_volume_v1": resourceStorageVolumeV1(),
"ecl_vna_appliance_v1": resourceVNAApplianceV1(),
},

ConfigureFunc: configureProvider,
Expand Down
26 changes: 26 additions & 0 deletions ecl/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ func accepter() terraform.ResourceProvider {

ResourcesMap: map[string]*schema.Resource{
"ecl_imagestorages_member_accepter_v2": resourceImageStoragesMemberAccepterV2(),
"ecl_network_network_v2": resourceNetworkNetworkV2(),
"ecl_network_subnet_v2": resourceNetworkSubnetV2(),
},

ConfigureFunc: configureProvider,
Expand Down Expand Up @@ -331,6 +333,30 @@ func testAccPreCheckImageMemberAccepter(t *testing.T) {
}
}

func testAccPreCheckTenantConnectionRequest(t *testing.T) {
testAccPreCheckRequiredEnvVars(t)

if OS_ACCEPTER_TENANT_ID == "" {
t.Fatal("OS_ACCEPTER_TENANT_ID must be set for acceptance tests of tenant connection request")
}
}

func testAccPreCheckTenantConnection(t *testing.T) {
testAccPreCheckRequiredEnvVars(t)

if OS_ACCEPTER_TENANT_ID == "" && OS_VIRTUAL_NETWORK_APPLIANCE_PLAN_ID == "" {
t.Fatal("OS_ACCEPTER_TENANT_ID and OS_VIRTUAL_NETWORK_APPLIANCE_PLAN_ID must be set for acceptance tests of tenant connection")
}
}

func testAccPreCheckApprovalRequest(t *testing.T) {
testAccPreCheckRequiredEnvVars(t)

if OS_ACCEPTER_TENANT_ID == "" {
t.Fatal("OS_ACCEPTER_TENANT_ID must be set for acceptance tests of approval request")
}
}

func testAccPreCheckSecurity(t *testing.T) {
testAccPreCheckRequiredEnvVars(t)

Expand Down
116 changes: 115 additions & 1 deletion ecl/resource_ecl_baremetal_server_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ func resourceBaremetalServerV2() *schema.Resource {
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"laid_level": &schema.Schema{
"raid_level": &schema.Schema{
Type: schema.TypeInt,
Optional: true,
},
Expand Down Expand Up @@ -217,6 +217,66 @@ func resourceBaremetalServerV2() *schema.Resource {
},
},
},
"nic_physical_ports": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"mac_addr": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"network_physical_port_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"plane": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"hardware_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"attached_ports": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"port_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"network_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"fixed_ips": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"subnet_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"ip_address": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
},
},
},
},
},
"personality": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Expand Down Expand Up @@ -340,6 +400,58 @@ func resourceBaremetalServerV2Create(d *schema.ResourceData, meta interface{}) e
return resourceBaremetalServerV2Read(d, meta)
}

func getFixedIPsForState(r *servers.AttachedPort) []map[string]interface{} {
var result []map[string]interface{}
for _, f := range r.FixedIPs {
subnetID := f.SubnetID
ipAddress := f.IPAddress
m := map[string]interface{}{
"subnet_id": subnetID,
"ip_address": ipAddress,
}
result = append(result, m)
}
return result
}

func getAttachedPortsForState(r *servers.NICPhysicalPort) []map[string]interface{} {
var result []map[string]interface{}
for _, a := range r.AttachedPorts {
portID := a.PortID
networkID := a.NetworkID
fixedIPs := getFixedIPsForState(&a)
m := map[string]interface{}{
"port_id": portID,
"network_id": networkID,
"fixed_ips": fixedIPs,
}
result = append(result, m)
}
return result
}

func getNICPhysicalPortsForState(r *servers.Server) []map[string]interface{} {
var result []map[string]interface{}
for _, n := range r.NICPhysicalPorts {
id := n.ID
macAddr := n.MacAddr
networkPhysicalPortID := n.NetworkPhysicalPortID
plane := n.Plane
hardwareID := n.HardwareID
attachedPorts := getAttachedPortsForState(&n)
m := map[string]interface{}{
"id": id,
"mac_addr": macAddr,
"network_physical_port_id": networkPhysicalPortID,
"plane": plane,
"hardware_id": hardwareID,
"attached_ports": attachedPorts,
}
result = append(result, m)
}
return result
}

func resourceBaremetalServerV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
baremetalClient, err := config.baremetalV2Client(GetRegion(d, config))
Expand All @@ -354,6 +466,8 @@ func resourceBaremetalServerV2Read(d *schema.ResourceData, meta interface{}) err

log.Printf("[DEBUG] Retrieved Server %s: %+v", d.Id(), server)

d.Set("nic_physical_ports", getNICPhysicalPortsForState(server))

return nil
}

Expand Down
20 changes: 19 additions & 1 deletion ecl/resource_ecl_baremetal_server_v2_mock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,24 @@ func TestMockedBaremetalV2Server_basic(t *testing.T) {
testAccCheckBaremetalV2ServerExists("ecl_baremetal_server_v2.server_1", &server),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "name", "server1"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.id", "39285bf9-12fb-4064-b98b-a552efc51cfc"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.mac_addr", "0a:31:c1:d5:6d:9c"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.network_physical_port_id", "38268d94-584a-4f14-96ff-732a68aa7301"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.plane", "data"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.hardware_id", "c1e1546d-3063-46d0-8895-c6350eb691ff"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.attached_ports.0.port_id", "61b7da1e-9571-4d63-b779-e003a56b8105"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.attached_ports.0.network_id", "9aa93722-1ec4-4912-b813-b975c21460a5"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.attached_ports.0.fixed_ips.0.subnet_id", "0419bbde-2b82-4107-9d8a-6bba76e364af"),
resource.TestCheckResourceAttr(
"ecl_baremetal_server_v2.server_1", "nic_physical_ports.0.attached_ports.0.fixed_ips.0.ip_address", "192.168.10.2"),
),
},
},
Expand Down Expand Up @@ -89,7 +107,7 @@ resource "ecl_baremetal_server_v2" "server_1" {
lvm = true
partition_label = "secondary-part1"
}
laid_level = 10
raid_level = 10
}
lvm_volume_groups {
vg_label = "VG_root"
Expand Down
Loading