Example #1
0
func Apply(labels []*label.LabelSet, s *registry.Service) {
	// sort low to high
	sortedLabels := Labels(labels)

	sort.Sort(sortedLabels)

	for _, label := range sortedLabels {
		// does the label have a version and does it match?
		if len(label.Version) > 0 && label.Version != s.Version {
			continue
		}

		// ok so either the version matches or its a generic apply

		// delete they label
		if label.Weight == 0 {
			v := s.Metadata[label.Key]
			// if there's a key value and its the same
			// or if the key value is blank
			if i := len(label.Value); i > 0 && v == label.Value || i == 0 {
				delete(s.Metadata, label.Key)
			}

			// delete from the nodes
			for _, node := range s.Nodes {
				v := node.Metadata[label.Key]
				if i := len(label.Value); i > 0 && v == label.Value || i == 0 {
					delete(node.Metadata, label.Key)
				}
			}
			// other weight is greater than 0, create label
		} else {
			// Apply at the top level
			// Should we actually apply as a sampling here?
			// Or at the individual node basis?
			if label.Weight == 100 {
				if s.Metadata == nil {
					s.Metadata = make(map[string]string)
				}
				s.Metadata[label.Key] = label.Value
			}

			// Apply to nodes
			for _, node := range s.Nodes {
				// Apply based on the weight
				if rand.Int63n(100) <= label.Weight {
					if node.Metadata == nil {
						node.Metadata = make(map[string]string)
					}
					node.Metadata[label.Key] = label.Value
				}
			}
		}
	}
}