Files
my-rook-config/pkg/operator/test/spec.go
T
Blaine Gardner ec416cdd92 ceph mons: set up entirely in operator
Make the Rook config-init unnecessary for mons, and remove that init
container. Perform all mon configuration steps in the operator, and set
up the mon pods and k8s environment such that only Ceph containers are
needed for running mons.

This should help streamline changes to the mons, as there will be no
need to change the `daemon/mon` code or `cmd/rook/ceph` code with mon
changes in the future.

This work starts to lay the groundwork for supporting the
`design/ceph-config-updates.md` design.

Notable new bits:

Create a keyring secret store helper for storing dameon keyrings, and
use it to store the mon keyring. Mon pods mount the keyring into a
k8s secret-backed volume.

Create a configmap store for the Ceph config file which can be mounted
into pods/containers directly to /etc/ceph/ceph.conf. Also store
individual mon_host and mon_initial_members values which can be mapped
into pods as environment variables and used in Ceph commandline flags,
enabling the mon pods to have the most up-to-date information about the
mon cluster when restarting and without need for operator intervention.

Signed-off-by: Blaine Gardner <blaine.gardner@suse.com>
2019-02-05 06:19:59 -07:00

71 lines
3.3 KiB
Go

/*
Copyright 2016 The Rook Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package test
import (
"fmt"
"strings"
"github.com/coreos/pkg/capnslog"
)
var logger = capnslog.NewPackageLogger("github.com/rook/rook", "ceph-op-testlib")
// ArgumentsMatchExpected returns a descriptive error if any of the expected arguments do not exist.
// This supports arguments in which flags appear multiple times with different values but does not
// support multiple instances of the same flag-value. This test is designed to fail if the list
// of actual arguments contains extra arguments not specified in the expected args.
// The expected arguments are given as an array of string arrays. This is to support flags which
// may have multiple values. Examples:
// expectedArgs := [][]string{
// {"-h"}, // test for a short flag
// {"-vvv"}, // test for a short flag with value(s) specified
// {"-d", "3"}, // test for a short flag with a value specified
// {"--verbose"}, // test for a --bool flag
// {"--name=alex"}, // test for a --flag=value flag
// {"--name", "sam"}, // test for a --flag with a value after a space
// {"--full-name", "sam", "goodhuman"}, // test for a --flag with 2 values separated by spaces
// }
func ArgumentsMatchExpected(actualArgs []string, expectedArgs [][]string) error {
// join all args into a big space-separated arg string so we can use string search on it
// this is simpler than a bunch of nested for loops and if statements with continues in them
fullArgString := strings.Join(actualArgs, " ")
logger.Infof("testing that actual args: %s\nmatch expected args:%v", fullArgString, actualArgs)
for _, arg := range expectedArgs {
// We join each individual argument together the same was as the big string
validArgMatcher := strings.Join(arg, " ")
if validArgMatcher == "" {
return fmt.Errorf("Expected argument %v evaluated to empty string; ArgumentsMatchExpected() doesn't know what to do", arg)
}
matches := strings.Count(fullArgString, validArgMatcher)
if matches > 1 {
return fmt.Errorf("More than one instance of flag '%s' in: %s; ArgumentsMatchExpected() doesn't know what to do",
validArgMatcher, fullArgString)
} else if matches == 1 {
// Remove the instance of the valid match so we can't match to it any more
fullArgString = strings.Replace(fullArgString, validArgMatcher, "", 1)
} else { // zero matches
return fmt.Errorf("Expected argument '%s' missing in: %s\n(It's possible the same arg is in expectedArgs twice.)",
validArgMatcher, strings.Join(actualArgs, " "))
}
}
if remainingArgs := strings.Trim(fullArgString, " "); remainingArgs != "" {
return fmt.Errorf("The actual arguments have additional args specified: %s", remainingArgs)
}
return nil
}