github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/registry/cache/util.go (about)

     1  // Licensed under the Apache License, Version 2.0 (the "License");
     2  // you may not use this file except in compliance with the License.
     3  // You may obtain a copy of the License at
     4  //
     5  //     https://www.apache.org/licenses/LICENSE-2.0
     6  //
     7  // Unless required by applicable law or agreed to in writing, software
     8  // distributed under the License is distributed on an "AS IS" BASIS,
     9  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    10  // See the License for the specific language governing permissions and
    11  // limitations under the License.
    12  //
    13  // Original source: github.com/micro/go-micro/v3/util/registry/util.go
    14  
    15  package cache
    16  
    17  import (
    18  	"github.com/tickoalcantara12/micro/v3/service/registry"
    19  )
    20  
    21  func addNodes(old, neu []*registry.Node) []*registry.Node {
    22  	nodes := make([]*registry.Node, len(neu))
    23  	// add all new nodes
    24  	for i, n := range neu {
    25  		node := *n
    26  		nodes[i] = &node
    27  	}
    28  
    29  	// look at old nodes
    30  	for _, o := range old {
    31  		var exists bool
    32  
    33  		// check against new nodes
    34  		for _, n := range nodes {
    35  			// ids match then skip
    36  			if o.Id == n.Id {
    37  				exists = true
    38  				break
    39  			}
    40  		}
    41  
    42  		// keep old node
    43  		if !exists {
    44  			node := *o
    45  			nodes = append(nodes, &node)
    46  		}
    47  	}
    48  
    49  	return nodes
    50  }
    51  
    52  func delNodes(old, del []*registry.Node) []*registry.Node {
    53  	var nodes []*registry.Node
    54  	for _, o := range old {
    55  		var rem bool
    56  		for _, n := range del {
    57  			if o.Id == n.Id {
    58  				rem = true
    59  				break
    60  			}
    61  		}
    62  		if !rem {
    63  			nodes = append(nodes, o)
    64  		}
    65  	}
    66  	return nodes
    67  }
    68  
    69  // CopyService make a copy of service
    70  func CopyService(service *registry.Service) *registry.Service {
    71  	// copy service
    72  	s := new(registry.Service)
    73  	*s = *service
    74  
    75  	// copy nodes
    76  	nodes := make([]*registry.Node, len(service.Nodes))
    77  	for j, node := range service.Nodes {
    78  		n := new(registry.Node)
    79  		*n = *node
    80  		nodes[j] = n
    81  	}
    82  	s.Nodes = nodes
    83  
    84  	// copy endpoints
    85  	eps := make([]*registry.Endpoint, len(service.Endpoints))
    86  	for j, ep := range service.Endpoints {
    87  		e := new(registry.Endpoint)
    88  		*e = *ep
    89  		eps[j] = e
    90  	}
    91  	s.Endpoints = eps
    92  	return s
    93  }
    94  
    95  // Copy makes a copy of services
    96  func Copy(current []*registry.Service) []*registry.Service {
    97  	services := make([]*registry.Service, len(current))
    98  	for i, service := range current {
    99  		services[i] = CopyService(service)
   100  	}
   101  	return services
   102  }
   103  
   104  // Merge merges two lists of services and returns a new copy
   105  func Merge(olist []*registry.Service, nlist []*registry.Service) []*registry.Service {
   106  	var srv []*registry.Service
   107  
   108  	for _, n := range nlist {
   109  		var seen bool
   110  		for _, o := range olist {
   111  			if o.Version == n.Version {
   112  				sp := new(registry.Service)
   113  				// make copy
   114  				*sp = *o
   115  				// set nodes
   116  				sp.Nodes = addNodes(o.Nodes, n.Nodes)
   117  
   118  				// mark as seen
   119  				seen = true
   120  				srv = append(srv, sp)
   121  				break
   122  			} else {
   123  				sp := new(registry.Service)
   124  				// make copy
   125  				*sp = *o
   126  				srv = append(srv, sp)
   127  			}
   128  		}
   129  		if !seen {
   130  			srv = append(srv, Copy([]*registry.Service{n})...)
   131  		}
   132  	}
   133  	return srv
   134  }
   135  
   136  // Remove removes services and returns a new copy
   137  func Remove(old, del []*registry.Service) []*registry.Service {
   138  	var services []*registry.Service
   139  
   140  	for _, o := range old {
   141  		srv := new(registry.Service)
   142  		*srv = *o
   143  
   144  		var rem bool
   145  
   146  		for _, s := range del {
   147  			if srv.Version == s.Version {
   148  				srv.Nodes = delNodes(srv.Nodes, s.Nodes)
   149  
   150  				if len(srv.Nodes) == 0 {
   151  					rem = true
   152  				}
   153  			}
   154  		}
   155  
   156  		if !rem {
   157  			services = append(services, srv)
   158  		}
   159  	}
   160  
   161  	return services
   162  }