compare data change
[msb/service-mesh.git] / msb2pilot / src / msb2pilot / pilot / msb.go
1 /**
2  * Copyright (c) 2018 ZTE Corporation.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * and the Apache License 2.0 which both accompany this distribution,
6  * and are available at http://www.eclipse.org/legal/epl-v10.html
7  * and http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Contributors:
10  *     ZTE - initial Project
11  */
12 package pilot
13
14 var (
15         cachedServices []*models.MsbService
16 )
17
18 func SyncMsbData(newServices []*models.MsbService) {
19         log.Log.Debug("sync msb rewrite rule to pilot")
20         createServices, updateServices, deleteServices := compareServices(cachedServices, newServices)
21
22         log.Log.Debug("SyncMsbData: ", len(createServices), len(updateServices), len(deleteServices))
23
24         cachedServices = newServices
25 }
26
27 func compareServices(oldServices, newServices []*models.MsbService) (createServices, updateServices, deleteServices []*models.MsbService) {
28         oldServiceMap := toServiceMap(oldServices)
29         newServiceMap := toServiceMap(newServices)
30
31         for key, newService := range newServiceMap {
32                 if oldService, exist := oldServiceMap[key]; exist {
33                         // service exist: check whether need to update
34                         if oldService.ModifyIndex != newService.ModifyIndex {
35                                 updateServices = append(updateServices, newService)
36                         }
37                 } else {
38                         // service not exist: add
39                         createServices = append(createServices, newService)
40                 }
41
42                 delete(oldServiceMap, key)
43         }
44
45         for _, service := range oldServiceMap {
46                 deleteServices = append(deleteServices, service)
47         }
48
49         return
50 }
51
52 func toServiceMap(services []*models.MsbService) map[string]*models.MsbService {
53         serviceMap := make(map[string]*models.MsbService)
54
55         for _, service := range services {
56                 serviceMap[service.ServiceName] = service
57         }
58
59         return serviceMap
60 }