// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package api
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestAPI_Internal_AssignServiceVirtualIP ( t * testing . T ) {
t . Parallel ( )
doTest_Internal_AssignServiceVirtualIP ( t , & WriteOptions {
Namespace : defaultNamespace ,
Partition : defaultPartition ,
} )
}
func doTest_Internal_AssignServiceVirtualIP ( t * testing . T , writeOpts * WriteOptions ) {
c , s := makeClient ( t )
defer s . Stop ( )
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
if writeOpts . Partition != "" {
_ , _ , err := c . Partitions ( ) . Create ( ctx , & Partition { Name : writeOpts . Partition } , nil )
require . NoError ( t , err )
}
if writeOpts . Namespace != "" {
_ , _ , err := c . Namespaces ( ) . Create ( & Namespace { Name : writeOpts . Namespace , Partition : writeOpts . Partition } , nil )
require . NoError ( t , err )
}
// Create resolvers that we can attach VIPs to.
for _ , name := range [ ] string { "one" , "two" , "three" } {
ok , _ , err := c . ConfigEntries ( ) . Set ( & ServiceResolverConfigEntry {
Kind : ServiceResolver ,
Name : name ,
Namespace : writeOpts . Namespace ,
Partition : writeOpts . Partition ,
} , writeOpts )
require . NoError ( t , err )
require . True ( t , ok )
}
tests := [ ] struct {
tName string
svcName string
vips [ ] string
expectFound bool
expectUnassignedFrom [ ] PeeredServiceName
} {
{
tName : "missing service is no-op" ,
svcName : "missing" ,
vips : [ ] string { "1.1.1.1" , "2.2.2.2" } ,
expectFound : false ,
expectUnassignedFrom : nil ,
} ,
{
tName : "set vips for one" ,
svcName : "one" ,
vips : [ ] string { "1.1.1.1" , "2.2.2.2" , "3.3.3.3" } ,
expectFound : true ,
expectUnassignedFrom : nil ,
} ,
{
tName : "move vip to two" ,
svcName : "two" ,
vips : [ ] string { "2.2.2.2" } ,
expectFound : true ,
expectUnassignedFrom : [ ] PeeredServiceName {
{ ServiceName : CompoundServiceName { Name : "one" , Namespace : writeOpts . Namespace , Partition : writeOpts . Partition } } ,
} ,
} ,
{
tName : "move vip to three" ,
svcName : "three" ,
vips : [ ] string { "3.3.3.3" } ,
expectFound : true ,
expectUnassignedFrom : [ ] PeeredServiceName {
{ ServiceName : CompoundServiceName { Name : "one" , Namespace : writeOpts . Namespace , Partition : writeOpts . Partition } } ,
} ,
} ,
{
tName : "no-op try move vips to missing" ,
svcName : "missing" ,
vips : [ ] string { "1.1.1.1" , "2.2.2.2" , "3.3.3.3" } ,
expectFound : false ,
expectUnassignedFrom : nil ,
} ,
{
tName : "move all vips back to one" ,
svcName : "one" ,
vips : [ ] string { "1.1.1.1" , "2.2.2.2" , "3.3.3.3" , "4.4.4.4" } ,
expectFound : true ,
expectUnassignedFrom : [ ] PeeredServiceName {
{ ServiceName : CompoundServiceName { Name : "two" , Namespace : writeOpts . Namespace , Partition : writeOpts . Partition } } ,
{ ServiceName : CompoundServiceName { Name : "three" , Namespace : writeOpts . Namespace , Partition : writeOpts . Partition } } ,
} ,
} ,
}
internal := c . Internal ( )
for _ , tc := range tests {
t . Run ( tc . tName , func ( t * testing . T ) {
resp , _ , err := internal . AssignServiceVirtualIP ( ctx , tc . svcName , tc . vips , writeOpts )
require . NoError ( t , err )
require . Equal ( t , tc . expectFound , resp . ServiceFound )
require . ElementsMatch ( t , tc . expectUnassignedFrom , resp . UnassignedFrom )
} )
}
}