chore(provider/openstack): use ips from associated subnets

This changes values the provided instance group subnet and uses the IPs
from that subnet.
This commit is contained in:
Michael Wagner 2019-09-10 14:51:44 +02:00
parent 2ee0b79780
commit 78d3bbeebb
3 changed files with 148 additions and 2 deletions

View File

@ -90,19 +90,23 @@ func (b *ServerGroupModelBuilder) buildInstances(c *fi.ModelBuilderContext, sg *
securityGroupName := b.SecurityGroupName(ig.Spec.Role)
securityGroup := b.LinkToSecurityGroup(securityGroupName)
var az *string
var subnets []*openstacktasks.Subnet
if len(ig.Spec.Subnets) > 0 {
subnet := ig.Spec.Subnets[int(i)%len(ig.Spec.Subnets)]
// bastion subnet name is not actual zone name, it contains "utility-" prefix
if ig.Spec.Role == kops.InstanceGroupRoleBastion {
az = fi.String(strings.Replace(ig.Spec.Subnets[int(i)%len(ig.Spec.Subnets)], "utility-", "", 1))
az = fi.String(strings.Replace(subnet, "utility-", "", 1))
} else {
az = fi.String(ig.Spec.Subnets[int(i)%len(ig.Spec.Subnets)])
az = fi.String(subnet)
}
subnets = append(subnets, b.LinkToSubnet(s(fmt.Sprintf("%s.%s", subnet, b.ClusterName()))))
}
// Create instance port task
portTask := &openstacktasks.Port{
Name: fi.String(fmt.Sprintf("%s-%s", "port", *instanceName)),
Network: b.LinkToNetwork(),
SecurityGroups: append([]*openstacktasks.SecurityGroup{}, securityGroup),
Subnets: subnets,
Lifecycle: b.Lifecycle,
}
c.AddTask(portTask)

View File

@ -102,6 +102,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterInstance := &openstacktasks.Instance{
@ -144,6 +147,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeInstance := &openstacktasks.Instance{
@ -267,6 +273,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterInstance := &openstacktasks.Instance{
@ -309,6 +318,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeInstance := &openstacktasks.Instance{
@ -346,6 +358,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("bastion.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("utility-subnet.cluster")},
},
Lifecycle: &clusterLifecycle,
}
bastionInstance := &openstacktasks.Instance{
@ -503,6 +518,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterAInstance := &openstacktasks.Instance{
@ -546,6 +564,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterBInstance := &openstacktasks.Instance{
@ -589,6 +610,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterCInstance := &openstacktasks.Instance{
@ -631,6 +655,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeAInstance := &openstacktasks.Instance{
@ -673,6 +700,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeBInstance := &openstacktasks.Instance{
@ -715,6 +745,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeCInstance := &openstacktasks.Instance{
@ -887,6 +920,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterAInstance := &openstacktasks.Instance{
@ -924,6 +960,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterBInstance := &openstacktasks.Instance{
@ -961,6 +1000,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterCInstance := &openstacktasks.Instance{
@ -998,6 +1040,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeAInstance := &openstacktasks.Instance{
@ -1040,6 +1085,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeBInstance := &openstacktasks.Instance{
@ -1082,6 +1130,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeCInstance := &openstacktasks.Instance{
@ -1260,6 +1311,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterAInstance := &openstacktasks.Instance{
@ -1295,6 +1349,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterBInstance := &openstacktasks.Instance{
@ -1330,6 +1387,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
{Name: s("master-public-name")},
{Name: s("masters.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
masterCInstance := &openstacktasks.Instance{
@ -1372,6 +1432,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-a.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeAInstance := &openstacktasks.Instance{
@ -1406,6 +1469,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-b.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeBInstance := &openstacktasks.Instance{
@ -1440,6 +1506,9 @@ func Test_ServerGroupModelBuilder(t *testing.T) {
SecurityGroups: []*openstacktasks.SecurityGroup{
{Name: s("nodes.cluster")},
},
Subnets: []*openstacktasks.Subnet{
{Name: s("subnet-c.cluster")},
},
Lifecycle: &clusterLifecycle,
}
nodeCInstance := &openstacktasks.Instance{
@ -1611,6 +1680,63 @@ func comparePorts(t *testing.T, actualTask fi.Task, expected *openstacktasks.Por
t.Fatal("Network is nil")
}
compareStrings(t, "Network name", actual.Network.Name, expected.Network.Name)
if len(actual.Subnets) == len(expected.Subnets) {
for i, subnet := range expected.Subnets {
compareSubnets(t, actual.Subnets[i], subnet)
}
} else {
compareNamedTasks(t, "Subnets", asHasName(actual.Subnets), asHasName(expected.Subnets))
}
}
func asHasName(tasks interface{}) []fi.HasName {
var namedTasks []fi.HasName
rType := reflect.TypeOf(tasks)
if rType.Kind() != reflect.Array && rType.Kind() != reflect.Slice {
fmt.Printf("type is not an array or slice: %v\n", rType.Kind())
return namedTasks
}
rVal := reflect.ValueOf(tasks)
for i := 0; i < rVal.Len(); i++ {
elem := rVal.Index(i)
if named, ok := elem.Interface().(fi.HasName); ok {
namedTasks = append(namedTasks, named)
}
}
return namedTasks
}
func compareNamedTasks(t *testing.T, name string, actual, expected []fi.HasName) {
actualTaskNames := make([]string, len(actual))
for i, task := range actual {
actualTaskNames[i] = *task.GetName()
}
sort.Strings(actualTaskNames)
expectedTaskNames := make([]string, len(expected))
for i, task := range expected {
if task.GetName() == nil {
expectedTaskNames[i] = ""
} else {
expectedTaskNames[i] = *task.GetName()
}
}
sort.Strings(expectedTaskNames)
if !reflect.DeepEqual(expectedTaskNames, actualTaskNames) {
t.Errorf("%s differ: %v instead of %v", name, actualTaskNames, expectedTaskNames)
}
}
func compareSubnets(t *testing.T, actualTask fi.Task, expected *openstacktasks.Subnet) {
t.Helper()
if pointersAreBothNil(t, "Subnet", actualTask, expected) {
return
}
actual, ok := actualTask.(*openstacktasks.Subnet)
if !ok {
t.Fatalf("task is not an Subnet task, got %T", actualTask)
}
compareStrings(t, "Name", actual.Name, expected.Name)
}
func compareInstances(t *testing.T, actualTask fi.Task, expected *openstacktasks.Instance) {

View File

@ -30,6 +30,7 @@ type Port struct {
ID *string
Name *string
Network *Network
Subnets []*Subnet
SecurityGroups []*SecurityGroup
Lifecycle *fi.Lifecycle
}
@ -65,12 +66,20 @@ func NewPortTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle *fi.Lifecycl
Lifecycle: lifecycle,
}
}
subnets := make([]*Subnet, len(port.FixedIPs))
for i, subn := range port.FixedIPs {
subnets[i] = &Subnet{
ID: fi.String(subn.SubnetID),
Lifecycle: lifecycle,
}
}
actual := &Port{
ID: fi.String(port.ID),
Name: fi.String(port.Name),
Network: &Network{ID: fi.String(port.NetworkID)},
SecurityGroups: sgs,
Subnets: subnets,
Lifecycle: lifecycle,
}
if find != nil {
@ -128,11 +137,18 @@ func (_ *Port) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *P
for i, sg := range e.SecurityGroups {
sgs[i] = fi.StringValue(sg.ID)
}
fixedIPs := make([]ports.IP, len(e.Subnets))
for i, subn := range e.Subnets {
fixedIPs[i] = ports.IP{
SubnetID: fi.StringValue(subn.ID),
}
}
opt := ports.CreateOpts{
Name: fi.StringValue(e.Name),
NetworkID: fi.StringValue(e.Network.ID),
SecurityGroups: &sgs,
FixedIPs: fixedIPs,
}
v, err := t.Cloud.CreatePort(opt)