feat(host): add catalog attribute to only sync instance primary
addresses
This commit is contained in:
1 parent
241901319d
commit
2cc2c2991f
8 files changed
+351
-24
No files matched your search
@@ -165,6 +165,9 @@ func TestHostPlugin(t *testing.T) {
|
||||
testPluginListHosts(ctx, t, p, region, keyid, secret, tc, expectedTagInstancesMap)
|
||||
// TODO: add OnDeleteSet if it needs to be implemented
|
||||
}
|
||||
|
||||
// finally lets test instance_address_only catalog attribute correctly syncs only instance addresses
|
||||
testInstanceAddressesOnlyListHosts(ctx, t, p, tf, region, keyid, secret)
|
||||
}
|
||||
|
||||
func testPluginOnCreateCatalog(ctx context.Context, t *testing.T, p *host.HostPlugin, region, accessKeyId, secretAccessKey string, rotate bool) (string, string) {
|
||||
@@ -450,3 +453,91 @@ func testPluginListHosts(ctx context.Context, t *testing.T, p *host.HostPlugin,
|
||||
// Success
|
||||
t.Logf("testing ListHosts: success (region=%s, tags=%v, expected/actual=(len=%d, ids=%s))", region, tags, len(actualInstances), actualInstances)
|
||||
}
|
||||
|
||||
func testInstanceAddressesOnlyListHosts(ctx context.Context, t *testing.T, p *host.HostPlugin, tf *TestTerraformer, region, accessKeyId, secretAccessKey string) {
|
||||
t.Helper()
|
||||
t.Logf("testing testInstanceAddressesOnlyListHosts")
|
||||
|
||||
// Get the instance details from tf output
|
||||
instanceID, err := tf.GetOutputString("multi_address_instance_id")
|
||||
require.NoError(t, err)
|
||||
primaryAddresses, err := tf.GetOutputMap("multi_address_primary_addresses")
|
||||
require.NoError(t, err)
|
||||
secondaryAddresses, err := tf.GetOutputMap("multi_address_secondary_addresses")
|
||||
require.NoError(t, err)
|
||||
|
||||
var primary, secondary []string
|
||||
for _, addr := range primaryAddresses {
|
||||
primary = append(primary, addr.(string))
|
||||
}
|
||||
for _, addr := range secondaryAddresses {
|
||||
secondary = append(secondary, addr.(string))
|
||||
}
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
instanceAddressesOnly bool
|
||||
expectedIPs []string
|
||||
}{
|
||||
{
|
||||
name: "all addresses",
|
||||
expectedIPs: append(primary, secondary...),
|
||||
},
|
||||
{
|
||||
name: "instance addresses only",
|
||||
instanceAddressesOnly: true,
|
||||
expectedIPs: primary,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
catalogAttrMap := map[string]any{
|
||||
credential.ConstRegion: region,
|
||||
credential.ConstDisableCredentialRotation: true,
|
||||
}
|
||||
if tc.instanceAddressesOnly {
|
||||
catalogAttrMap[host.ConstInstanceAddressesOnly] = true
|
||||
}
|
||||
|
||||
catalogAttrs, err := structpb.NewStruct(catalogAttrMap)
|
||||
require.NoError(err)
|
||||
setAttrs, err := structpb.NewStruct(map[string]any{
|
||||
host.ConstDescribeInstancesFilters: []any{fmt.Sprintf("instance-id=%s", instanceID)},
|
||||
})
|
||||
require.NoError(err)
|
||||
|
||||
reqPersistedSecrets, err := structpb.NewStruct(map[string]any{
|
||||
credential.ConstAccessKeyId: accessKeyId,
|
||||
credential.ConstSecretAccessKey: secretAccessKey,
|
||||
credential.ConstCredsLastRotatedTime: (time.Time{}).Format(time.RFC3339Nano),
|
||||
})
|
||||
require.NoError(err)
|
||||
request := &pb.ListHostsRequest{
|
||||
Catalog: &hostcatalogs.HostCatalog{
|
||||
Attrs: &hostcatalogs.HostCatalog_Attributes{
|
||||
Attributes: catalogAttrs,
|
||||
},
|
||||
},
|
||||
Sets: []*hostsets.HostSet{{
|
||||
Id: "hostset-0",
|
||||
Attrs: &hostsets.HostSet_Attributes{Attributes: setAttrs},
|
||||
}},
|
||||
Persisted: &pb.HostCatalogPersisted{
|
||||
Secrets: reqPersistedSecrets,
|
||||
},
|
||||
}
|
||||
|
||||
response, err := p.ListHosts(ctx, request)
|
||||
require.NoError(err)
|
||||
require.Len(response.GetHosts(), 1)
|
||||
hostResp := response.GetHosts()[0]
|
||||
|
||||
require.Equal(instanceID, hostResp.ExternalId)
|
||||
require.ElementsMatch(hostResp.IpAddresses, tc.expectedIPs)
|
||||
})
|
||||
}
|
||||
}
|
||||
Vendored
+1
-1
@@ -26,7 +26,7 @@ resource "random_id" "baz_key" {
|
||||
|
||||
locals {
|
||||
hashicorp_email = split(":", data.aws_caller_identity.current.user_id)[1]
|
||||
|
||||
|
||||
instance_tags = [
|
||||
{
|
||||
"${random_id.foo_key.dec}" = "true"
|
||||
|
||||
Vendored
+122
-4
@@ -20,13 +20,41 @@ data "aws_ami" "ubuntu" {
|
||||
}
|
||||
|
||||
resource "aws_vpc" "vpc" {
|
||||
cidr_block = "10.0.0.0/16"
|
||||
cidr_block = "10.0.0.0/16"
|
||||
assign_generated_ipv6_cidr_block = true
|
||||
}
|
||||
|
||||
resource "aws_subnet" "subnet" {
|
||||
vpc_id = aws_vpc.vpc.id
|
||||
cidr_block = aws_vpc.vpc.cidr_block
|
||||
availability_zone = data.aws_availability_zones.azs.names[0]
|
||||
vpc_id = aws_vpc.vpc.id
|
||||
cidr_block = aws_vpc.vpc.cidr_block
|
||||
ipv6_cidr_block = cidrsubnet(aws_vpc.vpc.ipv6_cidr_block, 8, 0)
|
||||
availability_zone = data.aws_availability_zones.azs.names[0]
|
||||
map_public_ip_on_launch = true
|
||||
assign_ipv6_address_on_creation = true
|
||||
}
|
||||
|
||||
# Need to add a gateway for public IP addr assignments
|
||||
resource "aws_internet_gateway" "igw" {
|
||||
vpc_id = aws_vpc.vpc.id
|
||||
}
|
||||
|
||||
resource "aws_route_table" "public" {
|
||||
vpc_id = aws_vpc.vpc.id
|
||||
|
||||
route {
|
||||
cidr_block = "0.0.0.0/0"
|
||||
gateway_id = aws_internet_gateway.igw.id
|
||||
}
|
||||
|
||||
route {
|
||||
ipv6_cidr_block = "::/0"
|
||||
gateway_id = aws_internet_gateway.igw.id
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_route_table_association" "public" {
|
||||
subnet_id = aws_subnet.subnet.id
|
||||
route_table_id = aws_route_table.public.id
|
||||
}
|
||||
|
||||
resource "aws_instance" "instances" {
|
||||
@@ -38,6 +66,73 @@ resource "aws_instance" "instances" {
|
||||
tags = local.instance_tags[count.index]
|
||||
}
|
||||
|
||||
resource "aws_instance" "multi_address_instance" {
|
||||
ami = data.aws_ami.ubuntu.id
|
||||
instance_type = "t3.nano"
|
||||
subnet_id = aws_subnet.subnet.id
|
||||
secondary_private_ips = ["10.0.10.10"]
|
||||
ipv6_address_count = 1
|
||||
associate_public_ip_address = true
|
||||
|
||||
tags = {
|
||||
Name = "boundary-multi-address-instance"
|
||||
"boundary-demo" = local.hashicorp_email
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_network_interface" "multi_address_secondary_eni" {
|
||||
subnet_id = aws_subnet.subnet.id
|
||||
private_ips = ["10.0.20.10"]
|
||||
ipv6_addresses = [cidrhost(aws_subnet.subnet.ipv6_cidr_block, 32)]
|
||||
|
||||
tags = {
|
||||
Name = "boundary-multi-address-secondary-eni"
|
||||
"boundary-demo" = local.hashicorp_email
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_network_interface_attachment" "multi_address_secondary_eni" {
|
||||
instance_id = aws_instance.multi_address_instance.id
|
||||
network_interface_id = aws_network_interface.multi_address_secondary_eni.id
|
||||
device_index = 1
|
||||
}
|
||||
|
||||
resource "aws_eip" "multi_address_primary" {
|
||||
domain = "vpc"
|
||||
network_interface = aws_instance.multi_address_instance.primary_network_interface_id
|
||||
associate_with_private_ip = aws_instance.multi_address_instance.private_ip
|
||||
depends_on = [aws_internet_gateway.igw, aws_route_table_association.public]
|
||||
|
||||
tags = {
|
||||
Name = "boundary-multi-address-primary-eip"
|
||||
"boundary-demo" = local.hashicorp_email
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_eip" "multi_address_primary_secondary_private" {
|
||||
domain = "vpc"
|
||||
network_interface = aws_instance.multi_address_instance.primary_network_interface_id
|
||||
associate_with_private_ip = "10.0.10.10"
|
||||
depends_on = [aws_internet_gateway.igw, aws_route_table_association.public, aws_instance.multi_address_instance]
|
||||
|
||||
tags = {
|
||||
Name = "boundary-multi-address-primary-secondary-eip"
|
||||
"boundary-demo" = local.hashicorp_email
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_eip" "multi_address_secondary_eni" {
|
||||
domain = "vpc"
|
||||
network_interface = aws_network_interface.multi_address_secondary_eni.id
|
||||
associate_with_private_ip = "10.0.20.10"
|
||||
depends_on = [aws_internet_gateway.igw, aws_route_table_association.public, aws_network_interface_attachment.multi_address_secondary_eni]
|
||||
|
||||
tags = {
|
||||
Name = "boundary-multi-address-secondary-eni-eip"
|
||||
"boundary-demo" = local.hashicorp_email
|
||||
}
|
||||
}
|
||||
|
||||
output "instance_ids" {
|
||||
value = aws_instance.instances.*.id
|
||||
}
|
||||
@@ -61,3 +156,26 @@ output "instance_tag_keys" {
|
||||
random_id.baz_key.dec,
|
||||
]
|
||||
}
|
||||
|
||||
output "multi_address_instance_id" {
|
||||
value = aws_instance.multi_address_instance.id
|
||||
}
|
||||
|
||||
output "multi_address_primary_addresses" {
|
||||
value = {
|
||||
private_ip = aws_instance.multi_address_instance.private_ip
|
||||
public_ip = aws_eip.multi_address_primary.public_ip
|
||||
ipv6 = tolist(aws_instance.multi_address_instance.ipv6_addresses)[0]
|
||||
}
|
||||
}
|
||||
|
||||
output "multi_address_secondary_addresses" {
|
||||
value = {
|
||||
primary_eni_private_ip = "10.0.10.10"
|
||||
primary_eni_public_ip = aws_eip.multi_address_primary_secondary_private.public_ip
|
||||
secondary_eni_private_ip = aws_network_interface.multi_address_secondary_eni.private_ip
|
||||
secondary_eni_public_ip = aws_eip.multi_address_secondary_eni.public_ip
|
||||
secondary_eni_ipv6 = tolist(aws_network_interface.multi_address_secondary_eni.ipv6_addresses)[0]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user