149 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package registry
 | |
| 
 | |
| import (
 | |
| 	"github.com/micro/go-micro/v2/registry"
 | |
| )
 | |
| 
 | |
| func addNodes(old, neu []*registry.Node) []*registry.Node {
 | |
| 	nodes := make([]*registry.Node, len(neu))
 | |
| 	// add all new nodes
 | |
| 	for i, n := range neu {
 | |
| 		node := *n
 | |
| 		nodes[i] = &node
 | |
| 	}
 | |
| 
 | |
| 	// look at old nodes
 | |
| 	for _, o := range old {
 | |
| 		var exists bool
 | |
| 
 | |
| 		// check against new nodes
 | |
| 		for _, n := range nodes {
 | |
| 			// ids match then skip
 | |
| 			if o.Id == n.Id {
 | |
| 				exists = true
 | |
| 				break
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// keep old node
 | |
| 		if !exists {
 | |
| 			node := *o
 | |
| 			nodes = append(nodes, &node)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nodes
 | |
| }
 | |
| 
 | |
| func delNodes(old, del []*registry.Node) []*registry.Node {
 | |
| 	var nodes []*registry.Node
 | |
| 	for _, o := range old {
 | |
| 		var rem bool
 | |
| 		for _, n := range del {
 | |
| 			if o.Id == n.Id {
 | |
| 				rem = true
 | |
| 				break
 | |
| 			}
 | |
| 		}
 | |
| 		if !rem {
 | |
| 			nodes = append(nodes, o)
 | |
| 		}
 | |
| 	}
 | |
| 	return nodes
 | |
| }
 | |
| 
 | |
| // CopyService make a copy of service
 | |
| func CopyService(service *registry.Service) *registry.Service {
 | |
| 	// copy service
 | |
| 	s := new(registry.Service)
 | |
| 	*s = *service
 | |
| 
 | |
| 	// copy nodes
 | |
| 	nodes := make([]*registry.Node, len(service.Nodes))
 | |
| 	for j, node := range service.Nodes {
 | |
| 		n := new(registry.Node)
 | |
| 		*n = *node
 | |
| 		nodes[j] = n
 | |
| 	}
 | |
| 	s.Nodes = nodes
 | |
| 
 | |
| 	// copy endpoints
 | |
| 	eps := make([]*registry.Endpoint, len(service.Endpoints))
 | |
| 	for j, ep := range service.Endpoints {
 | |
| 		e := new(registry.Endpoint)
 | |
| 		*e = *ep
 | |
| 		eps[j] = e
 | |
| 	}
 | |
| 	s.Endpoints = eps
 | |
| 	return s
 | |
| }
 | |
| 
 | |
| // Copy makes a copy of services
 | |
| func Copy(current []*registry.Service) []*registry.Service {
 | |
| 	services := make([]*registry.Service, len(current))
 | |
| 	for i, service := range current {
 | |
| 		services[i] = CopyService(service)
 | |
| 	}
 | |
| 	return services
 | |
| }
 | |
| 
 | |
| // Merge merges two lists of services and returns a new copy
 | |
| func Merge(olist []*registry.Service, nlist []*registry.Service) []*registry.Service {
 | |
| 	var srv []*registry.Service
 | |
| 
 | |
| 	for _, n := range nlist {
 | |
| 		var seen bool
 | |
| 		for _, o := range olist {
 | |
| 			if o.Version == n.Version {
 | |
| 				sp := new(registry.Service)
 | |
| 				// make copy
 | |
| 				*sp = *o
 | |
| 				// set nodes
 | |
| 				sp.Nodes = addNodes(o.Nodes, n.Nodes)
 | |
| 
 | |
| 				// mark as seen
 | |
| 				seen = true
 | |
| 				srv = append(srv, sp)
 | |
| 				break
 | |
| 			} else {
 | |
| 				sp := new(registry.Service)
 | |
| 				// make copy
 | |
| 				*sp = *o
 | |
| 				srv = append(srv, sp)
 | |
| 			}
 | |
| 		}
 | |
| 		if !seen {
 | |
| 			srv = append(srv, Copy([]*registry.Service{n})...)
 | |
| 		}
 | |
| 	}
 | |
| 	return srv
 | |
| }
 | |
| 
 | |
| // Remove removes services and returns a new copy
 | |
| func Remove(old, del []*registry.Service) []*registry.Service {
 | |
| 	var services []*registry.Service
 | |
| 
 | |
| 	for _, o := range old {
 | |
| 		srv := new(registry.Service)
 | |
| 		*srv = *o
 | |
| 
 | |
| 		var rem bool
 | |
| 
 | |
| 		for _, s := range del {
 | |
| 			if srv.Version == s.Version {
 | |
| 				srv.Nodes = delNodes(srv.Nodes, s.Nodes)
 | |
| 
 | |
| 				if len(srv.Nodes) == 0 {
 | |
| 					rem = true
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if !rem {
 | |
| 			services = append(services, srv)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return services
 | |
| }
 |