2023-08-11 13:12:13 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
2023-07-17 22:15:22 +00:00
|
|
|
package sprawl
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/api"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/testing/deployer/topology"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (s *Sprawl) populateInitialConfigEntries(cluster *topology.Cluster) error {
|
|
|
|
if len(cluster.InitialConfigEntries) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
client = s.clients[cluster.Name]
|
|
|
|
logger = s.logger.With("cluster", cluster.Name)
|
|
|
|
)
|
|
|
|
|
|
|
|
for _, ce := range cluster.InitialConfigEntries {
|
|
|
|
_, _, err := client.ConfigEntries().Set(ce, nil)
|
|
|
|
if err != nil {
|
|
|
|
if ce.GetKind() == api.ServiceIntentions && strings.Contains(err.Error(), intentionsMigrationError) {
|
|
|
|
logger.Warn("known error writing initial config entry; trying again",
|
|
|
|
"kind", ce.GetKind(),
|
|
|
|
"name", ce.GetName(),
|
|
|
|
"namespace", ce.GetNamespace(),
|
|
|
|
"partition", ce.GetPartition(),
|
|
|
|
"error", err,
|
|
|
|
)
|
|
|
|
|
|
|
|
time.Sleep(500 * time.Millisecond)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
return fmt.Errorf(
|
|
|
|
"error persisting config entry kind=%q name=%q namespace=%q partition=%q: %w",
|
|
|
|
ce.GetKind(),
|
|
|
|
ce.GetName(),
|
|
|
|
ce.GetNamespace(),
|
|
|
|
ce.GetPartition(),
|
|
|
|
err,
|
|
|
|
)
|
|
|
|
}
|
2023-10-03 15:06:50 +00:00
|
|
|
logger.Debug("wrote initial config entry",
|
2023-07-17 22:15:22 +00:00
|
|
|
"kind", ce.GetKind(),
|
|
|
|
"name", ce.GetName(),
|
|
|
|
"namespace", ce.GetNamespace(),
|
|
|
|
"partition", ce.GetPartition(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
const intentionsMigrationError = `Intentions are read only while being upgraded to config entries`
|