Skip to content

Commit

Permalink
Implement ability to filter service by stack namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
socheatsok78 committed Jul 10, 2024
1 parent c14c9ca commit 8483bc7
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ import (
var (
serviceLabelPrefix = "service."
stackNamespaceLabelPrefix = "stack."
dockerStackNamespaceLabel = "com.docker.stack.namespace"
defaultRefreshInterval = 15 * time.Second
)

func main() {
app := kingpin.New("node-metadata-agent", "")

refreshInterval := app.Flag("refresh-interval", "directory for the configs").Default(defaultRefreshInterval.String()).Duration()
dockerStackNamespace := app.Flag("stack.namespace", "Filter by stack namespace").Default("").String()
refreshInterval := app.Flag("refresh.interval", "refresh interval").Default(defaultRefreshInterval.String()).Duration()

var logger log.Logger
logger = log.NewLogfmtLogger(os.Stdout)
Expand Down Expand Up @@ -65,7 +67,7 @@ func main() {
}

// Immediately invoke the processTaskLabels function
handleNodeMetadataProcess(logger, cli, ctx)
handleNodeMetadataProcess(logger, cli, ctx, *dockerStackNamespace)

// Run the processTaskLabels function every refreshInterval
quit := make(chan struct{})
Expand All @@ -74,7 +76,7 @@ func main() {
for {
select {
case <-ticker.C:
if err := handleNodeMetadataProcess(logger, cli, ctx); err != nil {
if err := handleNodeMetadataProcess(logger, cli, ctx, *dockerStackNamespace); err != nil {
level.Error(logger).Log("msg", "Failed to process node metadata", "err", err)
}
case <-quit:
Expand Down Expand Up @@ -107,9 +109,13 @@ func main() {
}
}

func handleNodeMetadataProcess(logger log.Logger, cli *client.Client, ctx context.Context) error {
func handleNodeMetadataProcess(logger log.Logger, cli *client.Client, ctx context.Context, stackNamespace string) error {
discoveredNodes := map[string]map[string]string{}
services, err := cli.ServiceList(ctx, types.ServiceListOptions{})
serviceFilter := filters.NewArgs()
if stackNamespace != "" {
serviceFilter.Add("label", fmt.Sprintf("%s=%s", dockerStackNamespaceLabel, stackNamespace))
}
services, err := cli.ServiceList(ctx, types.ServiceListOptions{Filters: serviceFilter})
if err != nil {
level.Error(logger).Log("msg", "Failed to get service list", "err", err)
return err
Expand All @@ -131,8 +137,8 @@ func handleNodeMetadataProcess(logger log.Logger, cli *client.Client, ctx contex
}

// Add the stack namespace to the discoveredNodes map
if _, ok := service.Spec.Labels["com.docker.stack.namespace"]; ok {
discoveredNodes[task.NodeID][fmt.Sprintf("%s%s", stackNamespaceLabelPrefix, service.Spec.Labels["com.docker.stack.namespace"])] = "true"
if _, ok := service.Spec.Labels[dockerStackNamespaceLabel]; ok {
discoveredNodes[task.NodeID][fmt.Sprintf("%s%s", stackNamespaceLabelPrefix, service.Spec.Labels[dockerStackNamespaceLabel])] = "true"
}

// Add the service name to the discoveredNodes map
Expand All @@ -157,19 +163,19 @@ func handleNodeMetadataProcess(logger log.Logger, cli *client.Client, ctx contex
for key, value := range labels {
if _, ok := node.Spec.Labels[key]; !ok {
node.Spec.Labels[key] = value
level.Info(logger).Log("msg", "Adding label to node", "node", node.ID, "label", key, "value", value)
level.Debug(logger).Log("msg", "Adding label to node", "node", node.ID, "label", key, "value", value)
}
}

for key := range node.Spec.Labels {
if _, ok := labels[key]; !ok {
if strings.HasPrefix(key, serviceLabelPrefix) {
if strings.HasPrefix(key, fmt.Sprintf("%s%s", serviceLabelPrefix, stackNamespace)) {
delete(node.Spec.Labels, key)
level.Info(logger).Log("msg", "Removing label from node", "node", node.ID, "label", key)
level.Debug(logger).Log("msg", "Removing label from node", "node", node.ID, "label", key)
}
if strings.HasPrefix(key, stackNamespaceLabelPrefix) {
if strings.HasPrefix(key, fmt.Sprintf("%s%s", stackNamespaceLabelPrefix, stackNamespace)) {
delete(node.Spec.Labels, key)
level.Info(logger).Log("msg", "Removing label from node", "node", node.ID, "label", key)
level.Debug(logger).Log("msg", "Removing label from node", "node", node.ID, "label", key)
}
}
}
Expand Down

0 comments on commit 8483bc7

Please sign in to comment.