mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-01-13 08:29:38 -05:00
openstack: find node CIDR with multiple subnets
This commit is contained in:
parent
d8185fdafb
commit
31f65fb486
@ -20,6 +20,7 @@ go_library(
|
|||||||
"//internal/role",
|
"//internal/role",
|
||||||
"@com_github_gophercloud_gophercloud//:gophercloud",
|
"@com_github_gophercloud_gophercloud//:gophercloud",
|
||||||
"@com_github_gophercloud_gophercloud//openstack/compute/v2/servers",
|
"@com_github_gophercloud_gophercloud//openstack/compute/v2/servers",
|
||||||
|
"@com_github_gophercloud_gophercloud//openstack/networking/v2/networks",
|
||||||
"@com_github_gophercloud_gophercloud//openstack/networking/v2/subnets",
|
"@com_github_gophercloud_gophercloud//openstack/networking/v2/subnets",
|
||||||
"@com_github_gophercloud_gophercloud//pagination",
|
"@com_github_gophercloud_gophercloud//pagination",
|
||||||
"@com_github_gophercloud_utils//openstack/clientconfig",
|
"@com_github_gophercloud_utils//openstack/clientconfig",
|
||||||
@ -41,6 +42,7 @@ go_test(
|
|||||||
"//internal/role",
|
"//internal/role",
|
||||||
"@com_github_gophercloud_gophercloud//:gophercloud",
|
"@com_github_gophercloud_gophercloud//:gophercloud",
|
||||||
"@com_github_gophercloud_gophercloud//openstack/compute/v2/servers",
|
"@com_github_gophercloud_gophercloud//openstack/compute/v2/servers",
|
||||||
|
"@com_github_gophercloud_gophercloud//openstack/networking/v2/networks",
|
||||||
"@com_github_gophercloud_gophercloud//openstack/networking/v2/subnets",
|
"@com_github_gophercloud_gophercloud//openstack/networking/v2/subnets",
|
||||||
"@com_github_gophercloud_gophercloud//pagination",
|
"@com_github_gophercloud_gophercloud//pagination",
|
||||||
"@com_github_stretchr_testify//assert",
|
"@com_github_stretchr_testify//assert",
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/edgelesssys/constellation/v2/internal/role"
|
"github.com/edgelesssys/constellation/v2/internal/role"
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||||
"github.com/gophercloud/gophercloud/pagination"
|
"github.com/gophercloud/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@ -27,6 +28,7 @@ type imdsAPI interface {
|
|||||||
|
|
||||||
type serversAPI interface {
|
type serversAPI interface {
|
||||||
ListServers(opts servers.ListOptsBuilder) pagerAPI
|
ListServers(opts servers.ListOptsBuilder) pagerAPI
|
||||||
|
ListNetworks(opts networks.ListOptsBuilder) pagerAPI
|
||||||
ListSubnets(opts subnets.ListOpts) pagerAPI
|
ListSubnets(opts subnets.ListOpts) pagerAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/edgelesssys/constellation/v2/internal/role"
|
"github.com/edgelesssys/constellation/v2/internal/role"
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||||
"github.com/gophercloud/gophercloud/pagination"
|
"github.com/gophercloud/gophercloud/pagination"
|
||||||
)
|
)
|
||||||
@ -62,6 +63,7 @@ func (c *stubIMDSClient) vpcIP(_ context.Context) (string, error) {
|
|||||||
|
|
||||||
type stubServersClient struct {
|
type stubServersClient struct {
|
||||||
serversPager stubPager
|
serversPager stubPager
|
||||||
|
netsPager stubPager
|
||||||
subnetsPager stubPager
|
subnetsPager stubPager
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +71,10 @@ func (c *stubServersClient) ListServers(_ servers.ListOptsBuilder) pagerAPI {
|
|||||||
return &c.serversPager
|
return &c.serversPager
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *stubServersClient) ListNetworks(_ networks.ListOptsBuilder) pagerAPI {
|
||||||
|
return &c.netsPager
|
||||||
|
}
|
||||||
|
|
||||||
func (c *stubServersClient) ListSubnets(_ subnets.ListOpts) pagerAPI {
|
func (c *stubServersClient) ListSubnets(_ subnets.ListOpts) pagerAPI {
|
||||||
return &c.subnetsPager
|
return &c.subnetsPager
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/edgelesssys/constellation/v2/internal/constants"
|
"github.com/edgelesssys/constellation/v2/internal/constants"
|
||||||
"github.com/edgelesssys/constellation/v2/internal/role"
|
"github.com/edgelesssys/constellation/v2/internal/role"
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||||
"github.com/gophercloud/utils/openstack/clientconfig"
|
"github.com/gophercloud/utils/openstack/clientconfig"
|
||||||
)
|
)
|
||||||
@ -71,17 +72,17 @@ func New(ctx context.Context) (*Cloud, error) {
|
|||||||
}
|
}
|
||||||
serversClient.Microversion = microversion
|
serversClient.Microversion = microversion
|
||||||
|
|
||||||
subnetsClient, err := clientconfig.NewServiceClient("network", clientOpts)
|
networksClient, err := clientconfig.NewServiceClient("network", clientOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("creating network client: %w", err)
|
return nil, fmt.Errorf("creating network client: %w", err)
|
||||||
}
|
}
|
||||||
subnetsClient.Microversion = microversion
|
networksClient.Microversion = microversion
|
||||||
|
|
||||||
return &Cloud{
|
return &Cloud{
|
||||||
imds: imds,
|
imds: imds,
|
||||||
api: &apiClient{
|
api: &apiClient{
|
||||||
servers: serversClient,
|
servers: serversClient,
|
||||||
subnets: subnetsClient,
|
networks: networksClient,
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -308,22 +309,43 @@ func (c *Cloud) getLoadBalancerHost(ctx context.Context) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cloud) getSubnetCIDR(uidTag string) (netip.Prefix, error) {
|
func (c *Cloud) getSubnetCIDR(uidTag string) (netip.Prefix, error) {
|
||||||
|
listNetworksOpts := networks.ListOpts{Tags: uidTag}
|
||||||
|
networksPage, err := c.api.ListNetworks(listNetworksOpts).AllPages()
|
||||||
|
if err != nil {
|
||||||
|
return netip.Prefix{}, fmt.Errorf("listing networks: %w", err)
|
||||||
|
}
|
||||||
|
nets, err := networks.ExtractNetworks(networksPage)
|
||||||
|
if err != nil {
|
||||||
|
return netip.Prefix{}, fmt.Errorf("extracting networks: %w", err)
|
||||||
|
}
|
||||||
|
if len(nets) != 1 {
|
||||||
|
return netip.Prefix{}, fmt.Errorf("expected exactly one network, got %d", len(nets))
|
||||||
|
}
|
||||||
|
|
||||||
listSubnetsOpts := subnets.ListOpts{Tags: uidTag}
|
listSubnetsOpts := subnets.ListOpts{Tags: uidTag}
|
||||||
subnetsPage, err := c.api.ListSubnets(listSubnetsOpts).AllPages()
|
subnetsPage, err := c.api.ListSubnets(listSubnetsOpts).AllPages()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return netip.Prefix{}, fmt.Errorf("listing subnets: %w", err)
|
return netip.Prefix{}, fmt.Errorf("listing subnets: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nets, err := subnets.ExtractSubnets(subnetsPage)
|
snets, err := subnets.ExtractSubnets(subnetsPage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return netip.Prefix{}, fmt.Errorf("extracting subnets: %w", err)
|
return netip.Prefix{}, fmt.Errorf("extracting subnets: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(nets) != 1 {
|
if len(snets) < 1 {
|
||||||
return netip.Prefix{}, fmt.Errorf("expected exactly one subnet, got %d", len(nets))
|
return netip.Prefix{}, fmt.Errorf("expected at least one subnet, got %d", len(snets))
|
||||||
}
|
}
|
||||||
|
|
||||||
cidr, err := netip.ParsePrefix(nets[0].CIDR)
|
var rawCIDR string
|
||||||
|
for _, n := range snets {
|
||||||
|
if n.Name == nets[0].Name {
|
||||||
|
rawCIDR = n.CIDR
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cidr, err := netip.ParsePrefix(rawCIDR)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return netip.Prefix{}, fmt.Errorf("parsing subnet CIDR: %w", err)
|
return netip.Prefix{}, fmt.Errorf("parsing subnet CIDR: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/edgelesssys/constellation/v2/internal/role"
|
"github.com/edgelesssys/constellation/v2/internal/role"
|
||||||
"github.com/gophercloud/gophercloud"
|
"github.com/gophercloud/gophercloud"
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||||
"github.com/gophercloud/gophercloud/pagination"
|
"github.com/gophercloud/gophercloud/pagination"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
@ -175,7 +176,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("198.51.100.1", ""),
|
Addresses: newTestAddrs("198.51.100.1", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
want: []metadata.InstanceMetadata{
|
want: []metadata.InstanceMetadata{
|
||||||
{
|
{
|
||||||
@ -196,7 +198,8 @@ func TestList(t *testing.T) {
|
|||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
serversPager: newSeverPager([]servers.Server{}, nil),
|
serversPager: newSeverPager([]servers.Server{}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -204,9 +207,17 @@ func TestList(t *testing.T) {
|
|||||||
imds: &stubIMDSClient{uidErr: someErr},
|
imds: &stubIMDSClient{uidErr: someErr},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
|
"list nets errors": {
|
||||||
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
|
api: &stubServersClient{
|
||||||
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, someErr),
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
"list subnets error": {
|
"list subnets error": {
|
||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
subnetsPager: stubPager{allPagesErr: someErr},
|
subnetsPager: stubPager{allPagesErr: someErr},
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
@ -214,16 +225,18 @@ func TestList(t *testing.T) {
|
|||||||
"extract subnets error": {
|
"extract subnets error": {
|
||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{}, someErr),
|
subnetsPager: newSubnetPager([]subnets.Subnet{}, someErr),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
"multiple subnets error": {
|
"subnet name mismatch error": {
|
||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{
|
subnetsPager: newSubnetPager([]subnets.Subnet{
|
||||||
{CIDR: "192.0.2.0/24"},
|
{Name: "othernet", CIDR: "192.0.2.0/24"},
|
||||||
{CIDR: "198.51.100.0/24"},
|
{Name: "yetanothernet", CIDR: "198.51.100.0/24"},
|
||||||
}, nil),
|
}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
@ -231,7 +244,8 @@ func TestList(t *testing.T) {
|
|||||||
"parse subnet error": {
|
"parse subnet error": {
|
||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "notAnIP"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "notAnIP"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -239,7 +253,8 @@ func TestList(t *testing.T) {
|
|||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
serversPager: stubPager{allPagesErr: someErr},
|
serversPager: stubPager{allPagesErr: someErr},
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -247,7 +262,8 @@ func TestList(t *testing.T) {
|
|||||||
imds: &stubIMDSClient{uidResult: "uid"},
|
imds: &stubIMDSClient{uidResult: "uid"},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
serversPager: newSeverPager([]servers.Server{}, someErr),
|
serversPager: newSeverPager([]servers.Server{}, someErr),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -261,7 +277,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("192.0.2.5", ""),
|
Addresses: newTestAddrs("192.0.2.5", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -275,7 +292,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("192.0.2.5", ""),
|
Addresses: newTestAddrs("192.0.2.5", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -289,7 +307,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("192.0.2.5", ""),
|
Addresses: newTestAddrs("192.0.2.5", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -304,7 +323,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("192.0.2.5", ""),
|
Addresses: newTestAddrs("192.0.2.5", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -319,7 +339,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("192.0.2.5", ""),
|
Addresses: newTestAddrs("192.0.2.5", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -334,7 +355,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: map[string]any{"foo": "bar"},
|
Addresses: map[string]any{"foo": "bar"},
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -349,7 +371,8 @@ func TestList(t *testing.T) {
|
|||||||
Addresses: newTestAddrs("invalidIP", ""),
|
Addresses: newTestAddrs("invalidIP", ""),
|
||||||
},
|
},
|
||||||
}, nil),
|
}, nil),
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
},
|
},
|
||||||
@ -499,6 +522,7 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"error returned from getSubnetCIDR": {
|
"error returned from getSubnetCIDR": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
subnetsPager: newSubnetPager(nil, errors.New("failed")),
|
subnetsPager: newSubnetPager(nil, errors.New("failed")),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
@ -506,7 +530,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"error returned from getServers": {
|
"error returned from getServers": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager(nil, errors.New("failed")),
|
serversPager: newSeverPager(nil, errors.New("failed")),
|
||||||
},
|
},
|
||||||
wantErr: true,
|
wantErr: true,
|
||||||
@ -514,7 +539,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"sever with empty name skipped": {
|
"sever with empty name skipped": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
ID: "id1",
|
ID: "id1",
|
||||||
@ -528,7 +554,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"server with empty ID skipped": {
|
"server with empty ID skipped": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -542,7 +569,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"sever with nil tags skipped": {
|
"sever with nil tags skipped": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -556,7 +584,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"server has invalid address": {
|
"server has invalid address": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -571,7 +600,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"server without parseable addresses skipped": {
|
"server without parseable addresses skipped": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -588,7 +618,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"invalid endpoint returned from server addresses": {
|
"invalid endpoint returned from server addresses": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -603,7 +634,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"valid endpoint returned from server addresses not in subnet CIDR": {
|
"valid endpoint returned from server addresses not in subnet CIDR": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -618,7 +650,8 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
"first valid endpoint returned from server addresses not in subnet CIDR": {
|
"first valid endpoint returned from server addresses not in subnet CIDR": {
|
||||||
imds: &stubIMDSClient{},
|
imds: &stubIMDSClient{},
|
||||||
api: &stubServersClient{
|
api: &stubServersClient{
|
||||||
subnetsPager: newSubnetPager([]subnets.Subnet{{CIDR: "192.0.2.0/24"}}, nil),
|
netsPager: newNetPager([]networks.Network{{Name: "mynet"}}, nil),
|
||||||
|
subnetsPager: newSubnetPager([]subnets.Subnet{{Name: "mynet", CIDR: "192.0.2.0/24"}}, nil),
|
||||||
serversPager: newSeverPager([]servers.Server{
|
serversPager: newSeverPager([]servers.Server{
|
||||||
{
|
{
|
||||||
Name: "name1",
|
Name: "name1",
|
||||||
@ -654,6 +687,24 @@ func TestGetLoadBalancerEndpoint(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newNetPager returns a network pager as we would get from a ListNetworks.
|
||||||
|
func newNetPager(nets []networks.Network, err error) stubPager {
|
||||||
|
return stubPager{
|
||||||
|
page: networks.NetworkPage{
|
||||||
|
LinkedPageBase: pagination.LinkedPageBase{
|
||||||
|
PageResult: pagination.PageResult{
|
||||||
|
Result: gophercloud.Result{
|
||||||
|
Body: struct {
|
||||||
|
Networks []networks.Network `json:"networks"`
|
||||||
|
}{nets},
|
||||||
|
Err: err,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// newSubnetPager returns a subnet pager as we would get from a ListSubnets.
|
// newSubnetPager returns a subnet pager as we would get from a ListSubnets.
|
||||||
func newSubnetPager(nets []subnets.Subnet, err error) stubPager {
|
func newSubnetPager(nets []subnets.Subnet, err error) stubPager {
|
||||||
return stubPager{
|
return stubPager{
|
||||||
|
@ -9,18 +9,23 @@ package openstack
|
|||||||
import (
|
import (
|
||||||
"github.com/gophercloud/gophercloud"
|
"github.com/gophercloud/gophercloud"
|
||||||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||||
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||||
)
|
)
|
||||||
|
|
||||||
type apiClient struct {
|
type apiClient struct {
|
||||||
servers *gophercloud.ServiceClient
|
servers *gophercloud.ServiceClient
|
||||||
subnets *gophercloud.ServiceClient
|
networks *gophercloud.ServiceClient
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *apiClient) ListServers(opts servers.ListOptsBuilder) pagerAPI {
|
func (c *apiClient) ListServers(opts servers.ListOptsBuilder) pagerAPI {
|
||||||
return servers.List(c.servers, opts)
|
return servers.List(c.servers, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *apiClient) ListSubnets(opts subnets.ListOpts) pagerAPI {
|
func (c *apiClient) ListNetworks(opts networks.ListOptsBuilder) pagerAPI {
|
||||||
return subnets.List(c.subnets, opts)
|
return networks.List(c.networks, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *apiClient) ListSubnets(opts subnets.ListOpts) pagerAPI {
|
||||||
|
return subnets.List(c.networks, opts)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user