Skip to content

Commit 6f63f5f

Browse files
author
Jing Zhang
committed
Take care of two code comments:
(1) Separate code changes in nodeAddresses() to a function (2) Add feature activation flag trunk-spport-enabled in Networking config
1 parent 06db204 commit 6f63f5f

File tree

6 files changed

+79
-67
lines changed

6 files changed

+79
-67
lines changed

docs/openstack-cloud-controller-manager/using-openstack-cloud-controller-manager.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ The options in `Global` section are used for openstack-cloud-controller-manager
159159
160160
### Networking
161161
162+
* `trunk-support-enabled`
163+
Indicates whether or not IP addresses attached via trunk is supported. Default: false
162164
* `ipv6-support-disabled`
163165
Indicates whether or not IPv6 is supported. Default: false
164166
* `public-network-name`

pkg/openstack/instances.go

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func (i *Instances) NodeAddressesByProviderID(ctx context.Context, providerID st
237237
return []v1.NodeAddress{}, err
238238
}
239239

240-
ports, err := getAttachedPorts(i.network, server.ID)
240+
ports, err := getAttachedPorts(i.network, i.networkingOpts, server.ID)
241241
if err != nil {
242242
return []v1.NodeAddress{}, err
243243
}
@@ -343,7 +343,7 @@ func (i *Instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
343343
return nil, err
344344
}
345345

346-
ports, err := getAttachedPorts(i.network, srv.ID)
346+
ports, err := getAttachedPorts(i.network, i.networkingOpts, srv.ID)
347347
if err != nil {
348348
return nil, err
349349
}
@@ -570,17 +570,17 @@ func getServerByName(client *gophercloud.ServiceClient, name types.NodeName) (*S
570570
return &serverList[0], nil
571571
}
572572

573+
type Address struct {
574+
IPType string `mapstructure:"OS-EXT-IPS:type"`
575+
Addr string
576+
}
577+
573578
// IP addresses order:
574579
// * interfaces private IPs
575580
// * access IPs
576581
// * metadata hostname
577582
// * server object Addresses (floating type)
578583
func nodeAddresses(srv *servers.Server, ports []ports.Port, networkingOpts NetworkingOpts) ([]v1.NodeAddress, error) {
579-
type Address struct {
580-
IPType string `mapstructure:"OS-EXT-IPS:type"`
581-
Addr string
582-
}
583-
584584
addrs := []v1.NodeAddress{}
585585

586586
// parse private IP addresses first in an ordered manner
@@ -596,7 +596,7 @@ func nodeAddresses(srv *servers.Server, ports []ports.Port, networkingOpts Netwo
596596
Address: fixedIP.IPAddress,
597597
},
598598
)
599-
if port.NetworkID != "" {
599+
if port.NetworkID != "" && networkingOpts.TrunkSupportEnabled {
600600
addr := Address{IPType: "fixed", Addr: fixedIP.IPAddress}
601601
allPrivates[port.NetworkID] = append(allPrivates[port.NetworkID], addr)
602602
}
@@ -640,39 +640,10 @@ func nodeAddresses(srv *servers.Server, ports []ports.Port, networkingOpts Netwo
640640
return nil, err
641641
}
642642

643-
// Get the private networks that are not directly connected
644-
if len(addresses) < len(allPrivates) {
645-
extraPrivates := make(map[string][]Address)
646-
// For each private network
647-
for network, interfaceAddresses := range allPrivates {
648-
found := false
649-
// For each address in the private network
650-
for _, interfaceAddress := range interfaceAddresses {
651-
// Check if the address is directly assigned
652-
for _, srvAddresses := range addresses {
653-
for _, srvAddress := range srvAddresses {
654-
if interfaceAddress.Addr == srvAddress.Addr {
655-
found = true
656-
break
657-
}
658-
}
659-
}
660-
}
661-
// All the addresses in the private network are not directly assigned
662-
// Save the private network
663-
if !found {
664-
extraPrivates[network] = interfaceAddresses
665-
}
666-
}
667-
klog.V(5).Infof("Node '%s' extra private interfaces '%s'", srv.Name, extraPrivates)
668-
for network, interfaceAddresses := range extraPrivates {
669-
srvAddresses, ok := addresses[network]
670-
if !ok {
671-
addresses[network] = interfaceAddresses
672-
} else {
673-
addresses[network] = append(srvAddresses, interfaceAddresses...)
674-
}
675-
}
643+
// Add the private addresses that are not directly connected
644+
if len(addresses) < len(allPrivates) && networkingOpts.TrunkSupportEnabled {
645+
numExtraPrivates := addExtraNodeAddresses(addresses, allPrivates)
646+
klog.V(5).Infof("Node '%s' is added %d extra private interfaces '%s'", srv.Name, numExtraPrivates, addresses)
676647
}
677648

678649
var networks []string
@@ -728,13 +699,47 @@ func nodeAddresses(srv *servers.Server, ports []ports.Port, networkingOpts Netwo
728699
return addrs, nil
729700
}
730701

702+
// addExtraNodeAddresses addes addresses attached via trunk
703+
func addExtraNodeAddresses(addresses, allPrivates map[string][]Address) int {
704+
extraPrivates := make(map[string][]Address)
705+
for network, interfaceAddresses := range allPrivates {
706+
found := false
707+
// For each address in the private network
708+
for _, interfaceAddress := range interfaceAddresses {
709+
// Check if the address is directly assigned
710+
for _, nodeAddresses := range addresses {
711+
for _, nodeAddress := range nodeAddresses {
712+
if interfaceAddress.Addr == nodeAddress.Addr {
713+
found = true
714+
break
715+
}
716+
}
717+
}
718+
}
719+
// All the addresses in the private network are not directly assigned
720+
// Save the private network
721+
if !found {
722+
extraPrivates[network] = interfaceAddresses
723+
}
724+
}
725+
for network, interfaceAddresses := range extraPrivates {
726+
srvAddresses, ok := addresses[network]
727+
if !ok {
728+
addresses[network] = interfaceAddresses
729+
} else {
730+
addresses[network] = append(srvAddresses, interfaceAddresses...)
731+
}
732+
}
733+
return len(extraPrivates)
734+
}
735+
731736
func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName, networkingOpts NetworkingOpts) ([]v1.NodeAddress, error) {
732737
srv, err := getServerByName(client, name)
733738
if err != nil {
734739
return nil, err
735740
}
736741

737-
ports, err := getAttachedPorts(client, srv.ID)
742+
ports, err := getAttachedPorts(client, networkingOpts, srv.ID)
738743
if err != nil {
739744
return nil, err
740745
}
@@ -743,7 +748,7 @@ func getAddressesByName(client *gophercloud.ServiceClient, name types.NodeName,
743748
}
744749

745750
// getAttachedPorts returns a list of ports attached to a server.
746-
func getAttachedPorts(client *gophercloud.ServiceClient, serverID string) ([]ports.Port, error) {
751+
func getAttachedPorts(client *gophercloud.ServiceClient, networkingOpts NetworkingOpts, serverID string) ([]ports.Port, error) {
747752
listOpts := ports.ListOpts{
748753
DeviceID: serverID,
749754
DeviceOwner: "compute:nova",
@@ -753,11 +758,13 @@ func getAttachedPorts(client *gophercloud.ServiceClient, serverID string) ([]por
753758
if err != nil {
754759
return interfaces, err
755760
}
756-
subInterfaces, err := getSubInterfaces(client, interfaces)
757-
if err != nil {
758-
return interfaces, err
761+
if networkingOpts.TrunkSupportEnabled {
762+
subInterfaces, err := getSubInterfaces(client, interfaces)
763+
if err != nil {
764+
return interfaces, err
765+
}
766+
interfaces = append(interfaces, subInterfaces...)
759767
}
760-
interfaces = append(interfaces, subInterfaces...)
761768

762769
return interfaces, nil
763770
}

pkg/openstack/instancesv2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (i *InstancesV2) InstanceMetadata(ctx context.Context, node *v1.Node) (*clo
123123
return nil, err
124124
}
125125

126-
ports, err := getAttachedPorts(i.network, server.ID)
126+
ports, err := getAttachedPorts(i.network, i.networkingOpts, server.ID)
127127
if err != nil {
128128
return nil, err
129129
}

pkg/openstack/loadbalancer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ func getBoolFromServiceAnnotation(service *corev1.Service, annotationKey string,
684684
}
685685

686686
// getSubnetIDForLB returns subnet-id for a specific node
687-
func getSubnetIDForLB(network *gophercloud.ServiceClient, node corev1.Node, preferredIPFamily corev1.IPFamily) (string, error) {
687+
func getSubnetIDForLB(network *gophercloud.ServiceClient, networkingOpts NetworkingOpts, node corev1.Node, preferredIPFamily corev1.IPFamily) (string, error) {
688688
ipAddress, err := nodeAddressForLB(&node, preferredIPFamily)
689689
if err != nil {
690690
return "", err
@@ -695,7 +695,7 @@ func getSubnetIDForLB(network *gophercloud.ServiceClient, node corev1.Node, pref
695695
instanceID = instanceID[(ind + 1):]
696696
}
697697

698-
ports, err := getAttachedPorts(network, instanceID)
698+
ports, err := getAttachedPorts(network, networkingOpts, instanceID)
699699
if err != nil {
700700
return "", err
701701
}
@@ -1531,7 +1531,7 @@ func (lbaas *LbaasV2) checkServiceUpdate(service *corev1.Service, nodes []*corev
15311531
} else {
15321532
svcConf.lbMemberSubnetID = getStringFromServiceAnnotation(service, ServiceAnnotationLoadBalancerSubnetID, lbaas.opts.SubnetID)
15331533
if len(svcConf.lbMemberSubnetID) == 0 && len(nodes) > 0 {
1534-
subnetID, err := getSubnetIDForLB(lbaas.network, *nodes[0], svcConf.preferredIPFamily)
1534+
subnetID, err := getSubnetIDForLB(lbaas.network, lbaas.networkingOpts, *nodes[0], svcConf.preferredIPFamily)
15351535
if err != nil {
15361536
return fmt.Errorf("no subnet-id found for service %s: %v", serviceName, err)
15371537
}
@@ -1645,7 +1645,7 @@ func (lbaas *LbaasV2) checkService(service *corev1.Service, nodes []*corev1.Node
16451645
svcConf.lbMemberSubnetID = svcConf.lbSubnetID
16461646
}
16471647
if len(svcConf.lbNetworkID) == 0 && len(svcConf.lbSubnetID) == 0 {
1648-
subnetID, err := getSubnetIDForLB(lbaas.network, *nodes[0], svcConf.preferredIPFamily)
1648+
subnetID, err := getSubnetIDForLB(lbaas.network, lbaas.networkingOpts, *nodes[0], svcConf.preferredIPFamily)
16491649
if err != nil {
16501650
return fmt.Errorf("failed to get subnet to create load balancer for service %s: %v", serviceName, err)
16511651
}

pkg/openstack/openstack.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,24 @@ func AddExtraFlags(fs *pflag.FlagSet) {
6767
fs.StringArrayVar(&userAgentData, "user-agent", nil, "Extra data to add to gophercloud user-agent. Use multiple times to add more than one component.")
6868
}
6969

70+
// NetworkingOpts is used for networking settings
71+
type NetworkingOpts struct {
72+
TrunkSupportEnabled bool `gcfg:"trunk-support-enabled"`
73+
IPv6SupportDisabled bool `gcfg:"ipv6-support-disabled"`
74+
PublicNetworkName []string `gcfg:"public-network-name"`
75+
InternalNetworkName []string `gcfg:"internal-network-name"`
76+
AddressSortOrder string `gcfg:"address-sort-order"`
77+
}
78+
7079
// LoadBalancer is used for creating and maintaining load balancers
7180
type LoadBalancer struct {
72-
secret *gophercloud.ServiceClient
73-
network *gophercloud.ServiceClient
74-
compute *gophercloud.ServiceClient
75-
lb *gophercloud.ServiceClient
76-
opts LoadBalancerOpts
77-
kclient kubernetes.Interface
81+
secret *gophercloud.ServiceClient
82+
network *gophercloud.ServiceClient
83+
compute *gophercloud.ServiceClient
84+
lb *gophercloud.ServiceClient
85+
opts LoadBalancerOpts
86+
networkingOpts NetworkingOpts
87+
kclient kubernetes.Interface
7888
}
7989

8090
// LoadBalancerOpts have the options to talk to Neutron LBaaSV2 or Octavia
@@ -120,14 +130,6 @@ type LBClass struct {
120130
MemberSubnetID string `gcfg:"member-subnet-id,omitempty"`
121131
}
122132

123-
// NetworkingOpts is used for networking settings
124-
type NetworkingOpts struct {
125-
IPv6SupportDisabled bool `gcfg:"ipv6-support-disabled"`
126-
PublicNetworkName []string `gcfg:"public-network-name"`
127-
InternalNetworkName []string `gcfg:"internal-network-name"`
128-
AddressSortOrder string `gcfg:"address-sort-order"`
129-
}
130-
131133
// RouterOpts is used for Neutron routes
132134
type RouterOpts struct {
133135
RouterID string `gcfg:"router-id"`
@@ -363,7 +365,7 @@ func (os *OpenStack) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
363365

364366
klog.V(1).Info("Claiming to support LoadBalancer")
365367

366-
return &LbaasV2{LoadBalancer{secret, network, compute, lb, os.lbOpts, os.kclient}}, true
368+
return &LbaasV2{LoadBalancer{secret, network, compute, lb, os.lbOpts, os.networkingOpts, os.kclient}}, true
367369
}
368370

369371
// Zones indicates that we support zones

pkg/openstack/openstack_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,6 +1094,7 @@ func TestNodeAddressesWithSubports(t *testing.T) {
10941094
}
10951095

10961096
networkingOpts := NetworkingOpts{
1097+
TrunkSupportEnabled: true,
10971098
InternalNetworkName: []string{"mycluster-01-vlan701_network", "mycluster-01-vlan701_network2"},
10981099
}
10991100

0 commit comments

Comments
 (0)