func calServiceInfo()

in pkg/admin/handler/overview.go [130:215]


func calServiceInfo(res *model.OverviewResp, list *mesh.DataplaneResourceList, rt core_runtime.Runtime, manager core_manager.ResourceManager) error {
	revisions := make(map[string]*mesh.MetaDataResource, 0)
	protocols := make(map[string]*gxset.HashSet)
	releases := make(map[string]string)
	services := make(map[string]string)
	discoveries := make(map[string]*gxset.HashSet)

	for _, ins := range list.Items {
		app := ins.Spec.GetExtensions()[v1alpha1.Application]

		t := ins.Spec.GetExtensions()["registry-type"]
		if t == "" {
			t = "instance"
		}
		if set, ok := discoveries[t]; ok {
			set.Add(app)
		} else {
			newSet := gxset.NewSet()
			newSet.Add(app)
			discoveries[t] = newSet
		}

		rev, exists := ins.Spec.GetExtensions()[v1alpha1.Revision]
		if exists {
			metadata, cached := revisions[rev]
			if !cached {
				metadata = &mesh.MetaDataResource{
					Spec: &v1alpha1.MetaData{},
				}
				if err := manager.Get(rt.AppContext(), metadata, store.GetByRevision(rev), store.GetByType(ins.Spec.GetExtensions()["registry-type"])); err != nil {
					return err
				}
				revisions[rev] = metadata

				for _, serviceInfo := range metadata.Spec.Services {
					// proKey := serviceInfo.Protocol + strconv.Itoa(int(serviceInfo.Port))
					proKey := serviceInfo.Protocol
					if extProtocols, ok := serviceInfo.GetParams()["ext.protocol"]; ok {
						proKey = proKey + extProtocols
					}
					if set, ok := protocols[proKey]; ok {
						set.Add(serviceInfo.Name)
					} else {
						newSet := gxset.NewSet()
						protocols[proKey] = newSet
						newSet.Add(serviceInfo.Name)
					}

					if _, ok := releases[app]; !ok {
						releases[app] = serviceInfo.Params["release"]
					}

					if _, ok := services[serviceInfo.Name]; !ok {
						services[serviceInfo.Name] = serviceInfo.Name
					}
				}
			}
		}
	}

	releaseCount := make(map[string]int)
	for _, ver := range releases {
		if n, ok := releaseCount[ver]; ok {
			releaseCount[ver] = n + 1
		} else {
			releaseCount[ver] = 1
		}
	}

	protocolCount := make(map[string]int)
	for p, set := range protocols {
		protocolCount[p] = set.Size()
	}

	discoveryCount := make(map[string]int)
	for d, set := range discoveries {
		discoveryCount[d] = set.Size()
	}

	res.ServiceCount = len(services)
	res.Releases = releaseCount
	res.Protocols = protocolCount
	res.Discoveries = discoveryCount

	return nil
}