mirror of https://github.com/kubernetes/kops.git
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:
parent
2ee0b79780
commit
78d3bbeebb
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue