func (lb *LoadBalancer) UpdateTCPLoadBalancer(name, region string, hosts []string) error { glog.V(4).Infof("UpdateTCPLoadBalancer(%v, %v, %v)", name, region, hosts) vip, err := getVipByName(lb.network, name) if err != nil { return err } // Set of member (addresses) that _should_ exist addrs := map[string]bool{} for _, host := range hosts { addr, err := getAddressByName(lb.compute, host) if err != nil { return err } addrs[addr] = true } // Iterate over members that _do_ exist pager := members.List(lb.network, members.ListOpts{PoolID: vip.PoolID}) err = pager.EachPage(func(page pagination.Page) (bool, error) { memList, err := members.ExtractMembers(page) if err != nil { return false, err } for _, member := range memList { if _, found := addrs[member.Address]; found { // Member already exists delete(addrs, member.Address) } else { // Member needs to be deleted err = members.Delete(lb.network, member.ID).ExtractErr() if err != nil { return false, err } } } return true, nil }) if err != nil { return err } // Anything left in addrs is a new member that needs to be added for addr := range addrs { _, err := members.Create(lb.network, members.CreateOpts{ PoolID: vip.PoolID, Address: addr, ProtocolPort: vip.ProtocolPort, }).Extract() if err != nil { return err } } return nil }
func listMembers(t *testing.T) { err := members.List(base.Client, members.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) { memberList, err := members.ExtractMembers(page) if err != nil { t.Errorf("Failed to extract members: %v", err) return false, err } for _, m := range memberList { t.Logf("Listing member: ID [%s] Status [%s]", m.ID, m.Status) } return true, nil }) th.AssertNoErr(t, err) }
func resourceLBPoolV1Update(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) networkingClient, err := config.networkingV2Client(d.Get("region").(string)) if err != nil { return fmt.Errorf("Error creating OpenStack networking client: %s", err) } var updateOpts pools.UpdateOpts // If either option changed, update both. // Gophercloud complains if one is empty. if d.HasChange("name") || d.HasChange("lb_method") { updateOpts.Name = d.Get("name").(string) updateOpts.LBMethod = d.Get("lb_method").(string) } log.Printf("[DEBUG] Updating OpenStack LB Pool %s with options: %+v", d.Id(), updateOpts) _, err = pools.Update(networkingClient, d.Id(), updateOpts).Extract() if err != nil { return fmt.Errorf("Error updating OpenStack LB Pool: %s", err) } if d.HasChange("monitor_ids") { oldMIDsRaw, newMIDsRaw := d.GetChange("security_groups") oldMIDsSet, newMIDsSet := oldMIDsRaw.(*schema.Set), newMIDsRaw.(*schema.Set) monitorsToAdd := newMIDsSet.Difference(oldMIDsSet) monitorsToRemove := oldMIDsSet.Difference(newMIDsSet) log.Printf("[DEBUG] Monitors to add: %v", monitorsToAdd) log.Printf("[DEBUG] Monitors to remove: %v", monitorsToRemove) for _, m := range monitorsToAdd.List() { _, err := pools.AssociateMonitor(networkingClient, d.Id(), m.(string)).Extract() if err != nil { return fmt.Errorf("Error associating monitor (%s) with OpenStack server (%s): %s", m.(string), d.Id(), err) } log.Printf("[DEBUG] Associated monitor (%s) with pool (%s)", m.(string), d.Id()) } for _, m := range monitorsToRemove.List() { _, err := pools.DisassociateMonitor(networkingClient, d.Id(), m.(string)).Extract() if err != nil { return fmt.Errorf("Error disassociating monitor (%s) from OpenStack server (%s): %s", m.(string), d.Id(), err) } log.Printf("[DEBUG] Disassociated monitor (%s) from pool (%s)", m.(string), d.Id()) } } if d.HasChange("member") { oldMembersRaw, newMembersRaw := d.GetChange("member") oldMembersSet, newMembersSet := oldMembersRaw.(*schema.Set), newMembersRaw.(*schema.Set) membersToAdd := newMembersSet.Difference(oldMembersSet) membersToRemove := oldMembersSet.Difference(newMembersSet) log.Printf("[DEBUG] Members to add: %v", membersToAdd) log.Printf("[DEBUG] Members to remove: %v", membersToRemove) for _, m := range membersToRemove.List() { oldMember := resourcePoolMemberV1(d, m) listOpts := members.ListOpts{ PoolID: d.Id(), Address: oldMember.Address, ProtocolPort: oldMember.ProtocolPort, } err = members.List(networkingClient, listOpts).EachPage(func(page pagination.Page) (bool, error) { extractedMembers, err := members.ExtractMembers(page) if err != nil { return false, err } for _, member := range extractedMembers { err := members.Delete(networkingClient, member.ID).ExtractErr() if err != nil { return false, fmt.Errorf("Error deleting member (%s) from OpenStack LB pool (%s): %s", member.ID, d.Id(), err) } log.Printf("[DEBUG] Deleted member (%s) from pool (%s)", member.ID, d.Id()) } return true, nil }) } for _, m := range membersToAdd.List() { createOpts := resourcePoolMemberV1(d, m) newMember, err := members.Create(networkingClient, createOpts).Extract() if err != nil { return fmt.Errorf("Error creating LB member: %s", err) } log.Printf("[DEBUG] Created member (%s) in OpenStack LB pool (%s)", newMember.ID, d.Id()) } } return resourceLBPoolV1Read(d, meta) }
func (lb *LbaasV1) UpdateLoadBalancer(clusterName string, service *v1.Service, nodeNames []string) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) glog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v)", clusterName, loadBalancerName, nodeNames) vip, err := getVipByName(lb.network, loadBalancerName) if err != nil { return err } // Set of member (addresses) that _should_ exist addrs := map[string]bool{} for _, nodeName := range nodeNames { addr, err := getAddressByName(lb.compute, types.NodeName(nodeName)) if err != nil { return err } addrs[addr] = true } // Iterate over members that _do_ exist pager := members.List(lb.network, members.ListOpts{PoolID: vip.PoolID}) err = pager.EachPage(func(page pagination.Page) (bool, error) { memList, err := members.ExtractMembers(page) if err != nil { return false, err } for _, member := range memList { if _, found := addrs[member.Address]; found { // Member already exists delete(addrs, member.Address) } else { // Member needs to be deleted err = members.Delete(lb.network, member.ID).ExtractErr() if err != nil { return false, err } } } return true, nil }) if err != nil { return err } // Anything left in addrs is a new member that needs to be added for addr := range addrs { _, err := members.Create(lb.network, members.CreateOpts{ PoolID: vip.PoolID, Address: addr, ProtocolPort: vip.ProtocolPort, }).Extract() if err != nil { return err } } return nil }